Alles gleichmäßig verteilen ist einfach
du rechnest alle Längen zusammen und verteilt es prozenzual auf die Gesamtlänge auf
Das Wort, das du suchst, heißt
Sitzzuteilungsverfahren. In meinem ERP-System kommt sehr häufig das Hare-Niemeyer-Verfahren zum Einsatz.
Delphi-Quellcode:
function HareNiemeyer64(Stimmen: TInt64Array; const Sitze: Int64): TInt64Array;
var
Stimmenanzahl: Int64;
Stimmenzahl: Int64;
Vergeben, Hoechste: Int64;
i: Integer;
SitzeFloat: array of Extended;
Hoechstwert: Extended;
resourcestring
_HareNiemeyer64DivBy0 = 'Hare-Niemeyer-Sitzzuteilungsverfahren (64-Bit-Integer) kann nicht durchgeführt werden, da 0 Stimmen abgegeben wurden. Eine Division durch 0 wäre unausweichlich.';
begin
Stimmenanzahl := 0;
for Stimmenzahl in Stimmen do
Stimmenanzahl := Stimmenanzahl + Stimmenzahl;
if Stimmenanzahl = 0 then
raise EDivByZero.Create(_HareNiemeyer64DivBy0);
Vergeben := 0;
SetLength(Result, Length(Stimmen));
SetLength(SitzeFloat, Length(Stimmen));
for i := Low(Stimmen) to High(Stimmen) do
begin
SitzeFloat[i] := Stimmen[i] / Stimmenanzahl * Sitze;
Result[i] := Floor(SitzeFloat[i]);
Inc(Vergeben, Result[i]);
SitzeFloat[i] := SitzeFloat[i] - Result[i];
end;
while Vergeben < Sitze do
begin
Hoechstwert := 0;
Hoechste := Low(SitzeFloat);
for i := Low(SitzeFloat) to High(SitzeFloat) do
if SitzeFloat[i] > Hoechstwert then
begin
Hoechste := i;
Hoechstwert := SitzeFloat[i];
end;
SitzeFloat[Hoechste] := 0;
Inc(Result[Hoechste]);
Inc(Vergeben);
end;
end;
Anders als in meiner Software, wo der Algorithmus auch oft aufgerufen wird, wenn es weniger Stimmen als Sitze gibt, braucht man den hier natürlich nur ausführen, wenn man weniger Sitze als Stimmen hat. Der obige Algorithmus funktioniert mit negativen Stimmen wahrscheinlich nicht richtig.
Stimmen = die drei Längen
Sitze = 100