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!