[VB] wie lege ich die Inhalte eines offenen Array hintereinander?

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
16.347
Reaktionspunkte
5.935
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo VB Spezialisten,
folgendes Problemm, ich habe eine Werkstükliste in einen offene Array, diese
möchte ich in allen Kombinationen einmal hintereinander legen.
Gehen wir mal davon aus das es in unseren Beispiel 5 Teile wären soll es wie
folgt aussehen.

Code:
1
1-2
1-3
1-4
1-5
1-2-3
1-2-4
1-2-5
1-3-4
1-3-5
1-4-5
1-2-3-4
1-2-3-5
1-2-4-5
1-3-4-5
1-2-3-4-5

Wie bekomme ich das jetzt in einer Schleife hin, indem ich von außen die
Anzahl der Werkstücke anlege. Die Anzahl der möglichkeiten ist 2^(Anzahl-1).

Ich bin dankbar für jeden Tip.
 
Hallo Helmut,

was verstehst Du unter "einmal hintereinander legen"?

Willst Du in einer Programmschleife alle Kombinationen der Werkstücke in ein zweidimensionales Array eintragen?

Oder sollen alle Kombinationen der Werkstücke nacheinander in einem FC oder FB als Ausgang ausgegeben werden?

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kai,
ich möchte die Werkstücke alle einmal hintereinander legen, du musst
dir das so vorstellen ich habe leisten von sagen wir 2100mm, jetzt habe
ich 5 Werkstücke von 1200, 800, 450, 450 und 1600mm Jetzt muss ich raus
bekommen in welcher kombination am wenigsten Verschnitt habe.

Gestartet wird mit der ersten leiste, der 1200 und dann wird geschaut was
Da hinter passt.
1200 / 450 / 450
800
1600

Das wäre jetzt mein ergebnis so hab ich am wenigsten Verschnitt
Gelöst werden soll das in flexibel, da ich dort die werkstücklisten als TXT
Datei habe.
 
Das riecht irgendwie stark nach Rekursion, aber man kann es auch normal programmieren.
Wenn es nur darum geht alle möglichkeiten auszugeben, kannst du mal probieren das in VB umzusetzen:
Code:
void printArr(int *arr, int len)
{
    int i;
    for (i = 1; i <= len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main(int argc, char *argv[])
{
    int len;
    const int anzahl = 5;
    int i = 1;
    int brk = 0;    
    /* Array muss so groß wie die Anzahl der Zahlen+1 sein, Index 0 nicht belegt */
    int num[anzahl+1]; 
    /* erster Wert muss so ausgegeben werden */
    num[1] = 1;
    len = 1;
    printArr(num, len); 
    do{
        if (num[len] >= anzahl) {
            len--;
            num[len]++;
        } else {
            len++;
            num[len] = num[len-1] + 1; 
        }
        if (num[2] >= anzahl) { // Fertig!
            brk = 1;
        }
        printArr(num, len);   
    } while (!brk);   
  	
    return 0;
}
Die eigentliche Logik steckt in der do/while Schleife.

Bis 5 wird dann folgendes ausgegeben:
Code:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 5
1 2 4
1 2 4 5
1 2 5
1 3
1 3 4
1 3 4 5
1 3 5
1 4
1 4 5
1 5
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kai,
ich möchte die Werkstücke alle einmal hintereinander legen, du musst
dir das so vorstellen ich habe leisten von sagen wir 2100mm, jetzt habe
ich 5 Werkstücke von 1200, 800, 450, 450 und 1600mm Jetzt muss ich raus
bekommen in welcher kombination am wenigsten Verschnitt habe.

Ist die Anzahl und Länge der Werkstücke flexibel?

Wie viele Werkstücke hast Du maximal?

Gelöst werden soll das in flexibel, da ich dort die werkstücklisten als TXT
Datei habe.

Hast Du in Wincc flexible ein Panel oder eine PC-Runtime?

Gruß Kai
 
Anzahl und Länge ist flexibel, je nach tagesproduktion.
Es ist eine PC Runtime und ich weiß worauf du hinaus willst, die Schleife
könnte wohl etwas länger laufen. Ich habe das heute mal getestet und
2^100 durchlaufen lassen......ja....mmh....da war erst mal Kaffee Pause
angesagt.

Aber mein Gedanke ist Schleife so zu gestalten das wenn das zusammen
legen nicht weiterläuft wenn die leistenlänge überschritten wird.

Im Beispiel

1200 + 800 + 450 würde Ende heißen, 450 und 1600 bzw die vlt 100
folgenden passen eh nicht mehr rein.

Ich glaube Tom sein Code ist schon das was ich brauche, wenn ich ihn
verstehen würde wäre das die Lösung

@Tom
was bewirkt len++ bzw len--
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anzahl und Länge ist flexibel, je nach tagesproduktion.
Es ist eine PC Runtime und ich weiß worauf du hinaus willst, die Schleife
könnte wohl etwas länger laufen. Ich habe das heute mal getestet und
2^100 durchlaufen lassen

Wie viele Werkstücke hast Du denn maximal?

Bei 10 Werkstücken bräuchte man in einer einfachen Programmversion 2^10 - 1 = 1023 Durchläufe.

Gruß Kai
 
So eine Tagesproduktion liegt so bei 300-1000 Leisten, gefiltert auf einen
Leistentyp können das schon mal bis zu 50-90 werden. Aber die durchläufe
würden (dürfen) nie die große Anzahl erreichen weil die Werkstücke so zwischen
450-1200mm liegen und die leisten um die 2500mm.

Wenn ich zb 10 x 450mm Werkstücke habe, kann ich ja nur 5 hintereinander
legen, die anderen 5 passen ja nicht mehr. Also hätte ich ja schon von 10
Durchläufen 5 gespart.
 
Gehen wir mal davon aus das es in unseren Beispiel 5 Teile wären soll es wie
folgt aussehen.

Code:
1
1-2
1-3
1-4
1-5
1-2-3
1-2-4
1-2-5
1-3-4
1-3-5
1-4-5
1-2-3-4
1-2-3-5
1-2-4-5
1-3-4-5
1-2-3-4-5
.

Bei der obigen Aufstellung ist immer das Werkstück 1 (Länge 1200) enthalten.

Kann die Leiste aber auch eine Länge haben, bei der man eine optimale Lösung ohne das Werkstück 1 (Länge 1200) hat?

Beispiel:

Leiste (Länge 2400) = Werkstück 2 (Länge 800) + Werkstück 5 (Länge 1600)

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das kann schon gut sein, mein Gedanke war das ich das erste Werkstück
aus der Liste nehme, dann dahinter lege was möglich ist und dann die
Kombination nehme wo der wenigste Verschnitt ist.
Dein Gedanke ist eigentlich richtig, aber dann wird die Laufzeit für das
Optimieren einfach zu lange. Es soll ja zyklisch während den Wechsel der
Leisten optimiert werden. Ein zusätzlicher Gedanke ist das ich noch eine
Toleranz einbaue, dh das ich einfach sage ob der Verschnitt 50 oder 100mm
ist, vernachlässigt wird. Zusätzlich dann noch kontrolliere wenn die Optimierung
länger als 10 sec dauert, den Vorgang abreche und das nehme was bis dahin
den geringsten Verschnitt hat.
 
Aber die durchläufe
würden (dürfen) nie die große Anzahl erreichen weil die Werkstücke so zwischen
450-1200mm liegen und die leisten um die 2500mm.

Wenn ich zb 10 x 450mm Werkstücke habe, kann ich ja nur 5 hintereinander
legen, die anderen 5 passen ja nicht mehr. Also hätte ich ja schon von 10
Durchläufen 5 gespart.

Ich verstehe das Problem noch nicht.

Wenn Du maximal 5 Werkstücke hast, dann hast Du doch nur 2^5 - 1 = 31 Durchläufe.

Gruß Kai
 
Nein es können 50 bis 90 Werkstücke sein, 5 habe ich nur als Beispiel
gewählt. Es werden natürlich nach jeder leiste die geschnitten wurde weniger.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst Du den Produktionsablauf noch einmal etwas ausführlicher erklären?

Du bekommst eine txt-Datei mit einer Auflistung von 50 - 90 Werkstücken und deren jeweilige Länge?

Du hast also bei der ersten Leiste eine Auswahl von 50 - 90 Werkstücken?

Und wieso wird nach jeder Leiste die Auswahl der Werkstücke geringer?

Soll mit jedem Werkstück nur einmal geschnitten werden?

Gruß Kai
 
Ich habe eine TXT-Datei mit bis zu 1000 Werkstücke oder auch Aufträge, dafür
habe ich dann Leisten aus den die Aufträge geschnitten werden sollen.
Die Aufträge bestehen aus unterschiedlichen Dekoren und leistentypen, also
einmal 26 Buche, 13 Eiche oder 20 Kirsche usw. Also muss ich die Aufträge
Ersteinmal filtern, dann kann ich pro leistender schon mal bis zu 90 Aufträge
(Werkstücke) kommen. Diese muss ich dann auf Leisten optimieren, so das ich
den wenigsten Verschnitt habe, so weit wie möglich.
 
Hallo Helmut,

bei allem Respekt vor Deinem Ehrgeiz, doch mußt Du Dein Verschnitt-Optimierungs-Problem unbedingt
mit der flexible-RT selber lösen?

Aus dem Schiffbau kenne ich es so, daß die Zuschnittmaschinen nicht die Teilelisten bekommen,
sondern von speziellen Verschnitt-Optimierungs-Programmen extern vorberechnete Schnittlisten.
Meistens sind da sogar mehrere Materialbestellungen zur besseren Optimierung zusammengefasst.

Dein Problem ist ja nur eindimensional, doch auch da kann eine wirkliche Optimierung schon
ziemlich aufwändig werden. Zum Einlesen in die Materie (und zur Abschreckung) kannst Du Dir
das Kapitel 2 dieser Mathematik-Diplomarbeit zur Verschnittoptimierung reinziehen.
Ziemlich umfassend auch dieser Diskussionsthread: Kombinatorische Verschnittoptimierung
Und hier ein einfaches Verfahren der Schnittaufteilung: http://de.wikipedia.org/wiki/Bin-Packing

Vielleicht kommst Du bei der Menge Deiner Teile mit einem zugekauften Programm besser. Da Dein
Problem ein häufig zu lösendes Problem ist, gibt es die Programme schon ab 100 bis 400 EUR.
Ich kann Dir aber keines empfehlen, weil ich mich da zu wenig auskenne.
Von einigen Programmen kann man funktionsfähige Demoversionen downloaden und dann mal die
Möglichkeiten und Arbeitsweise der Programme erkunden, z.B.
http://www.verschnittoptimierung.com/software/optimex/index.html
http://www.bestopt.de/index.html

Harald
 
Zurück
Oben