Einzelnen Beitrag anzeigen

Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.018 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Zeichen in Query optimal aufteilen

  Alt 5. Okt 2022, 08:36
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
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat