Einzelnen Beitrag anzeigen

Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#10

AW: Sortieren und kombinieren von Längen

  Alt 6. Jun 2011, 12:47
Soo.. ich habe das Programmteil einmal durchgearbeitet, aber noch nicht zum Laufen auf den neuen System (Windows, Delphi) bekommen.
Den Kern der Optimierung habe ich mir aber jetzt herausgeabeitet :
Delphi-Quellcode:
Kombi: array[0..100] of Integer;
Liste: TObjectlist mit Nr und Länge der Stücken; // Liste muß von lang -> kurz sortiert sein!!!!   
                  
function TOptimierung.OkayCheck: Boolean;
var
  a: Double;
  i: Integer;
begin
  Result := False;

  if (Rest < 0.005) and (Rest >= 0) then
    Result := True
  else if (Durchlaufe > Parameter.Durchlaufe) and (Rest >= 0) then
    Result := True
  else
  begin
    a := 0;
    i := 0;
    while Kombi[i] > -1 do
    begin
      a := a + Liste[Kombi[i]].lange + Parameter.Verschnitt;
      inc(i);
    end;
    if ((a / VorratListe[x].lange) > Parameter.Grad) then
      Result := True
  end;
end;

procedure TOptimierung.Schleife(l: Double; int, VorratsLaenge: Double);
var
  i: Integer;
begin
  Inc(Schleifentiefe); // Schleifentiefe ist die Tiefe der Schleife

  for i := int to Liste.StueckCount - 1 do
  begin
    Inc(Durchlaufe);
    Rest := l - Liste[i].lange - Verschnitt;
    Kombi[Schleifentiefe] := Liste[i].Nr;
                                             // schreib die Nummer des Holzstueckes in Kombi
                                             // prueft ob derzeitige Kombination besser ist als
                                             // die letzte beste Kombination und speichert sie
                                             // gegebenenfalls in der KombiS
    if Rest < 0 then
      Continue;
    if OkayCheck then // prueft ob Optimierung ausreichend ist - Abbruchkriterium
      Exit;
   
    Schleife(rest, i + 1, VorratsLaenge); // springt in die naechste Schleifenebene
  end;

  Kombi[Schleifentiefe] := -1; {löscht das letzte Holzstück aus der Kombi-Kombination}
  Dec(Schleifentiefe); // reduziert Schleifentiefe, weil jetzt auf eine untere Schleifenebene
                              // zurueckgesprungen wird
end;
"Liste" ist eine Liste mit den Teilstücken. Wichtig ist, dass sie vorab von lang nach kurz sortiert wird!

Bitte um Rückkopplung!

Geändert von Jens01 ( 6. Jun 2011 um 14:48 Uhr)
  Mit Zitat antworten Zitat