![]() |
Sortieren und kombinieren von Längen
Hallo zusammen,
suche schon seit längerem eine Routine um vorgegebene Längen zu sortieren und zu einheitlichen Größen zu kombinieren. Mein Fall liegt so: Ich habe verschiedene Kabellängen für bestimmte Einheiten, und es gibt diese Kabel auf Rollen in fixen Größen. Hier ein Beispiel (Längen in Meter<m>): Das sind die Längenabschnitte mit Ihren dazugehörigen Einheiten: 86m - 1/1 41m - 2/1 58m - 2/2 87m - 2/3 86m - 2/4 78m - 2/5 86m - 2/6 77m - 2/7 83m - 2/8 90m - 3/1 44m - 3/2 57m - 3+3 73m - 3/4 72m - 3/5 65m - 3/6 65m - 3/7 64m - 3/8 60m - 3/9 73m - 3/10 72m - 3/11 Es gibt Kabelrollen mit fixen Größen 200,300 und 500 Metern (wobei 500 zu vermeiden ist). Jetzt gilt es die Längenabschnitte so zu kombinieren dass sie auf die Rollen passen und idealerweise so, damit so wenig wie möglich Reste auf denn Rollen bleiben. Das Ergebnis des Beispiels würde so aussehen: Rollennummer - Rollengröße - Einheiten 1 - 300m - 1/1+2/1+2/3+2/4 2 - 300m - 2/2+2/5+2/6+2/7 3 - 300m - 2/8+3/4+3/10+3/11 4 - 200m - 3/5+3/8+3/9 5 - 325m - 3/1+3/2+3/3+3/6+3/7 Die letzte Rolle ist immer eine Restrolle und daher eine nicht fixe Größe. Hoffe das "Problem" ist einigermaßen deutlich beschrieben. Also wenn jemand da einen Lösungsansatz hat bitte posten, wäre super wenn Ihr Ideen hättet. Gruß andone68 |
AW: Sortieren und kombinieren von Längen
Schau mal
![]() |
AW: Sortieren und kombinieren von Längen
Danke Uwe,
könnte ziemlich genau das sein was ich brauch. Werde das mal testen. Gruß andone68 |
AW: Sortieren und kombinieren von Längen
Wenn ich das so noch mal einwerfen darf..
Solch ein Algorithmus habe ich vor 20 Jahren mal in meinem Studium programmiert. Noch auf TP 7.0. Für sehr lange Holzbalken, die auf bestimmte kleine Balken nach Liste aufgeteilt werden sollten. Das Programm funktionierte gut, ist mir aber abhandengekommen. Wenn dies Programmteil von Uwe funktioniert, wäre eine kurze Rückkopplung ganz nett, ansonsten würde ich den Algorithmus auch so noch zusammenbekommen. Gruss Jens |
AW: Sortieren und kombinieren von Längen
Hallo zusammen,
hab jetzt mal das Cutting Stock Programm getestet (Link von Uwe). Funktioniert definitiv nicht wenn die Längen nur in Stückzahl 1 gebraucht werden. In meinem Beispiel komme ich wenn ich alle Teillängen addiere auf 1424m. Das Programm errechnet dann (wenn ich Stablänge 300m eingebe) 20 Stäbe. Das wären dann 6000m - also definitiv zu viel. Offensichtlich werden die Stückzahlen ignoriert. Bei größeren Stückzahlen funktionierts dann irgenwie doch wieder was aber in meinem Fall nicht vorkommt. @Jens: wenn du nach 20! Jahren wirklich noch was zusammenkriegst wäre ich dir dankbar. @Uwe: Wie ich gesehen habe ist ja für dich englisch kein Problem. Vielleicht kannst du dem Autor ja mal eine Info schicken. Gruß andone68 |
AW: Sortieren und kombinieren von Längen
Also andone68,
gerade habe ich noch mal gesucht und tatsächlich die Diskette gefunden. Das Problem liegt in dem Wort Diskette 3,5". Die Diskette paßt nämlich nicht in das CD-Laufwerk. Ich versuche, meinen Uraltrechner noch mal zu starten und die Daten von Diskette auf USB zu bekommen. Du mußt etwas geduld haben. Versprechen kann ich aber nichts, da alles sehr alt. Gruss Jens |
AW: Sortieren und kombinieren von Längen
Hallo Jens,
super:thumb: Also ich hab noch nen Rechner mit Disketten-LW. Könntest mir ja die Diskette rübermailen. OK - da muss das Beamen wohl doch noch erfunden werden. Spass beiseite, erstmal danke für deine Mühen. Gruß andone68 |
AW: Sortieren und kombinieren von Längen
Also das Problem schaut schonmal nicht so ganz einfach aus. (Ich vermute, es ist NP-komplex)
In Wikipedia habe ich was unter ![]() ![]() ![]() P.S.: Ich glaube nicht, dass Disketten 20 Jahre durchhalten, aber ich lasse mich überraschen ;) |
AW: Sortieren und kombinieren von Längen
Zitat:
Brauche aber noch etwas, weil so kann ich das nicht veröffentlichen :) |
AW: Sortieren und kombinieren von Längen
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:
"Liste" ist eine Liste mit den Teilstücken. Wichtig ist, dass sie vorab von lang nach kurz sortiert wird!
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; Bitte um Rückkopplung! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz