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



## rostiger Nagel (29 Januar 2011)

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. 


```
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.


----------



## Kai (29 Januar 2011)

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


----------



## rostiger Nagel (29 Januar 2011)

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.


----------



## Kai (29 Januar 2011)

Die Aufgabe erinnert mich an das Rucksackproblem:

http://sps-forum.de/showthread.php?t=14230

http://sps-forum.de/showthread.php?t=16981

Gruß Kai


----------



## Thomas_v2.1 (29 Januar 2011)

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:

```
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:

```
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
```


----------



## Kai (29 Januar 2011)

Helmut_von_der_Reparatur schrieb:


> 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?



Helmut_von_der_Reparatur schrieb:


> 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


----------



## rostiger Nagel (29 Januar 2011)

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--


----------



## Thomas_v2.1 (29 Januar 2011)

Helmut_von_der_Reparatur schrieb:


> @Tom
> was bewirkt len++ bzw len--


Variable um 1 incrementieren bzw. decrementieren.
Also len++ wäre in vb len = len + 1 , len-- wäre len = len -1


----------



## Kai (29 Januar 2011)

Helmut_von_der_Reparatur schrieb:


> 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


----------



## rostiger Nagel (29 Januar 2011)

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.


----------



## Kai (29 Januar 2011)

Helmut_von_der_Reparatur schrieb:


> Gehen wir mal davon aus das es in unseren Beispiel 5 Teile wären soll es wie
> folgt aussehen.
> 
> 
> ...


 
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


----------



## rostiger Nagel (29 Januar 2011)

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.


----------



## Kai (29 Januar 2011)

Helmut_von_der_Reparatur schrieb:


> 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.
> 
> ...


 
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


----------



## rostiger Nagel (29 Januar 2011)

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.


----------



## Kai (29 Januar 2011)

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


----------



## rostiger Nagel (29 Januar 2011)

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.


----------



## rostiger Nagel (29 Januar 2011)

Wie das aussieht kannst du hier sehen http://www.sps-forum.de/showthread.php?t=42158


----------



## Kai (29 Januar 2011)

Alles klar, jetzt verstehe ich das Problem.

Gruß Kai


----------



## majaestix (29 Januar 2011)

*Traveling Salesman*

Hallo Helmut,

das, was Du da vorhast, haben schon viele Andere vor Dir versucht und sich mehr oder weniger die Zähne ausgebissen.

Die Holz-Leute haben das gleiche Problem mit der optimalen Aufteilung von Platten und die Spediteure mit ihren Routen.

Siehe hier:

http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden

Gruss

Majaestix


----------



## PN/DP (29 Januar 2011)

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


----------



## Kai (29 Januar 2011)

Helmut_von_der_Reparatur schrieb:


> 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.
> ...


 
Man muss also die Kombinationen aus 2, 3, 4 und 5 Einzelwerten überprüfen.

Bei 90 Werten für die Werkstücke kommt man auf die folgende Anzahl von Kombinationen (Lottoformel):


```
Kombinationen 2 Werte aus 90 Werten
 
       90!
K = -------- = 4.005
    88! * 2!
 
Kombinationen 3 Werte aus 90 Werten
 
       90!
K = -------- = 117.480
     87! * 3!
 
Kombinationen 4 Werte aus 90 Werten
 
       90!
K = -------- = 2.555.190
    86! * 4!
 
Kombinationen 5 Werte aus 90 Werten
 
       90!
K = -------- = 43.949.268
    85! * 5!
 
Summer Kombinationen
 
K = 46.625.943
```
 
Gruß Kai


----------



## Larry Laffer (30 Januar 2011)

Hallo Helmut,
jetzt mal ungeachtet der Durchläufe etc.
Nach meiner Meinung muß die Quelle deiner Teile-Liste ja etwas wie eine Datenbank sein. Eine komfortable Bearbeitung dieser Liste ist durch eine (Siemens-) Visu m.E. nicht zu leisten. Dazu kommt dann auch noch, dass es ja sein kann, dass der Bediener einen bestimmten Leistentyp vorrangig gar nicht haben will. Ich könnte mir hier vorstellen, dass der Bediener festlegt, dass er vorrangig 1200er und 900er Leisten haben will und das die anderen aus der Liste quasi als Lückenfüller verwendet werden sollen. Außerdem müßte eine bereits gefertigte Leiste in der Soll-Stückzahl reduziert bzw. ganz aus der Liste ausgetragen werden.

Alles das spricht für mich für ein PC-Programm, dass entsprechend der Vorgabe seine Ergebnisse z.B. in den DB der SPS übermittelt wo sie dann abgearbeitet werden. Das genannte PC-Programm (das könnte dann ja auch in VB erstellt werden) hätte dann auch nicht mehr ganz so große Probleme mit der ggf. exponentiell ansteigenden Anzahl von Schleifendurchläufen und wäre vom Bediener wahrscheinlich auch leichter zu handhaben ...

Gruß
Larry


----------



## rostiger Nagel (30 Januar 2011)

Larry Laffer schrieb:


> Hallo Helmut,
> jetzt mal ungeachtet der Durchläufe etc.
> Nach meiner Meinung muß die Quelle deiner Teile-Liste ja etwas wie eine Datenbank sein. Eine komfortable Bearbeitung dieser Liste ist durch eine (Siemens-) Visu m.E. nicht zu leisten. Dazu kommt dann auch noch, dass es ja sein kann, dass der Bediener einen bestimmten Leistentyp vorrangig gar nicht haben will. Ich könnte mir hier vorstellen, dass der Bediener festlegt, dass er vorrangig 1200er und 900er Leisten haben will und das die anderen aus der Liste quasi als Lückenfüller verwendet werden sollen. Außerdem müßte eine bereits gefertigte Leiste in der Soll-Stückzahl reduziert bzw. ganz aus der Liste ausgetragen werden.


 
Das ist nicht das Problemm oder gerade weil ich das so haben möchte, will
ich das ganze ja aus flexibel raus lösen. Es ist so weit, das der Bediener
sehr konfortabel filtern kann. 

So sieht eine komplette Liste aus, da kann er einfach drin scrollen,
das wäre dann die echte Tagesproduktion von 384 Teilen



hier als Datei, wie ich die Daten bekomme
Anhang anzeigen RMW_1101_20110104_001.txt


möchte er Filtern kann er die auswählen und somit sagen ich möchte jetzt
die Sorte Leisten schneiden weil ich sie gerade an der Maschine habe oder
er möchte einen bestimmten Auftrag vorziehen.



Hier wird jetzt mal der Filter ausgewählt, für Profil "28", Variante "KB" und 
"nicht geschnitene Leisten", da die Leisten die geschnitten wurden ab-
gehackt werden und nicht merh Optimiert werden. Den Hacken kann der
Bediener wieder raus nehmen, falls er die Leiste nocheinmal schneiden
muss (ist halt runtergefallen). Welcher Filter gesetzt ist sieht er an den
kleinen grünen Dreiecken in der Spaltenüberschrift, wenn ein Filter nichts
gefunden hat wird das Dreieck rot.




Ich möchte folgendes erreichen:

Es soll alles aus flexibel heraus laufen, da ich den Bediener da nicht
rauslassen möchte und er in der Windowsebene rumpflückt.
Eine externe Optimierung würde ja die ganze Tagesproduktion 
Optimieren und die müsste dann wahrscheinlich so ablaufen, er 
kann dann nicht während der Produktion mal eben schnell auf 
wünsche aus der Fertigung reagieren ohne erneut mit dem Fremd-
programm zu Optimieren.
Wenn eine Leiste mal wirklich neu geschnitten werden muss, kann
er das sofort machen und dann ganz normal weiter produzieren
oder diese Leiste einfach erneut, durch die flexibel Optimierung 
laufen lassen.
Zur Zeit kämpfe ich damit erstmal den Code von Tom in VB umzuwandeln,
ich komme nicht ganz mit dem Syntax klar.


----------



## Larry Laffer (30 Januar 2011)

Hallo Helmut,
hier mal der Code von Thomas in VB :
	
	



```
Sub printArr(int *arr, int len)

    for i = 1 to len
        printf("%d ", arr[i])  // gibt das Ergebnis aus
    next 
    printf("\n")
end sub

Sub main

    dim len as Integer
    const anzahl as Integer = 5
    dim i as integer = 1
    dim brk as integer = 0 

    /* Array muss so groß wie die Anzahl der Zahlen+1 sein, Index 0 nicht belegt */
    dim num[anzahl+1] as integer 
    /* erster Wert muss so ausgegeben werden */
    num[1] = 1
    len = 1
    printArr(num, len)  
    repeat 
        if (num[len] >= anzahl) then
            len=len-1
            num[len]=num[len]+1
        else 
            len=len+1
            num[len] = num[len-1] + 1
        end if

        if (num[2] >= anzahl) then brk = 1
        
        printArr(num, len);  
    until brk<>0  
      
    end sub
}
```
Ob dir das aber hilft weiß ich nicht ...

Gruß
Larry

Nachsatz:
Ich weiß jetzt nicht, ob Repeat-Until in Flex machbar ist - aber ich glaube, du erkennst, wo es hingehen soll ...
Es gibt auf jeden Fall etwas äquivalentes ...


----------



## Larry Laffer (30 Januar 2011)

... wenn du das alles in Flex löst, gelöst hast oder lösen willst - Hut ab ...!!!


----------



## rostiger Nagel (30 Januar 2011)

das in Beitrag #23 Funktioniert schon wunderbar, aber das schwere ist
natürlich die Optimierung. Aber ich werde morgen mal Kontakt zu den
von Harlad genannten Firmen aufnehmen.

schaun wir mal "Nichts ist es schon..."


----------



## rostiger Nagel (16 März 2011)

Larry Laffer schrieb:


> ... wenn du das alles in Flex löst, gelöst hast oder lösen willst - Hut ab ...!!!



Ich wollte noch mal ein kleines Feedback geben und für die Hilfestellung
bedanken. Also ich habe das Projekt abgeschlossen und es funktioniert gut.
Die Reaktionszeiten bzw die Antwortzeit der Optiemierung ist wirklich sehr
schnell und mehr als zufriedenstellend. Obwohl der Rechner pro sec. so ca.
500 Möglichkeiten schafft dh bei 30 Werkstücken müsste man 12 Tage warten,
habe ich es so hinbekommen das die Optimierung, selbst bei über 100 Werkstücken
in der Praxis wirklich nur 1-2 sec läuft, genauso habe ich es mir vorgestellt. 
Der anfangs sehr skeptische Maschinbediener, ist sehr zufrieden, da er sehr
Komfortabel auf Produktionsanforderungen reagieren kann.


----------

