Optimierung
-
Ich suche ein Optimierungsprogramm oder -tool mit dem ich eine bestimmte Reihenfolge von Begriffen nach bestimmten Parametern optimal anordnen kann!
Ich versuche es gerade mit der Toolbox für Matlab doch komme ich damit nicht so ganz klar!Wenn jemand von sowas weiß oder sogar hat, bitte ich Ihn, hier zu posten!
mfg
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
--Neo-- schrieb:
Ich suche ein Optimierungsprogramm oder -tool mit dem ich eine bestimmte Reihenfolge von Begriffen nach bestimmten Parametern optimal anordnen kann!
Ich versuche es gerade mit der Toolbox für Matlab doch komme ich damit nicht so ganz klar!Wenn jemand von sowas weiß oder sogar hat, bitte ich Ihn, hier zu posten!
mfg
Mit Matlab sollte sowas eigentlich schon ganz gut gehen. Kannst Du vielleicht ein bißchen spezifischer werden, was das genaue Problem angeht? Sehr viele Probleme lassen sich so formulieren, daß man "nur" eine Reihenfolge finden muß, die gewissen Kriterien genügt.
-
Es geht darum daß ich ein tool suche, daß mir eine bestimmte reihenfolge von von variablen sortiert nach bestimmten parametern:
z.B.
A B C D A C B D
jede variable steht für einen flugzeugtyp und das ganze stellt eine anflug reihenfolge dar.
ich muß jetzt die summe der anflugzeit optimieren:z.B.
folgt auf A ein B dann ist die Zeit: 40sec
folgt auf A ein C dann ist die Zeit: 60sec
und so weiterich soll die reihenfolge so ändern, daß die summe der zeit möglichst klein wird um in einem def. zeitfenster möglichste viele flieger zu landen !!
ich hoffe ich konnte mein problem etwas erklären!!
Danke für die Hilfe
-
Noch eine Frage:
Gibt es in C++ eine Funktion die mir eine Reihenfolge von Variablen so sortiert, dass deren Summe minimal ist ??
D.h. die Variabeln nehmen andere Werte an, je nachdem wo sie in der Reihe stehn!
z.B. A B C D
wenn A vor dem B steht nimmt es den Wert 20 anz.B. B A C D
steht A hinter dem B nimmt es den Wert 40 anGibt es so etwas in c++ ???
Danke
Gruß
Neo
-
du koenntest fuer jedes flugzeug alle moeglichen nachfolgenden flugzeuge berechnen, fuer die wieder das gleiche... bis in die tiefe ausschoepfen. dieser brute force algorithmus hat ne grauenhafte laufzeit, aber man muss nicht viel ueberlegen.
schau dir mal en.wikipedia.org/wiki/Dijkstra's_algorithm an.
-
Hi
man könnte auf sowas algs aus der KI los lassen. z.B. einen gewichteten Suchbaum. was aber ab einer bestimmten komplexität (die leider sehr schnell eintritt) verdammt lange dauert. Falls da nicht noch gewisse randbedingungen mit berücksichtigt werden müsste. ( z.B. der Flieger muss inerhalb der nächsten 30 min landen sonst gibts 175 Tote )
Auch stellt sich die frage wie optimal die sortierung sein soll. muss die beste lösung gesucht werden, oder reicht es wenn ein bistimtens zeitkriterium erfüllt wird ( z.B. 20 Flugzeuge inerhalb von 30 Min )
Anderemöglichkeit währe ein art Agentensystem, das durch mehr oder weniger wilkürliche mütationen versucht die reihenfolge zu optimieren. Da hat unser Dozent mal eine Optimierung für Spedition umgesetzt.
Das problem müsste sich sicherlich auch als Netzwerk darstellen lassen. Und somit könnte man algs aus der Grapenteorie drauf los lassen ( fals das nicht wieder auf einen suchbaum rauslaufen würde )
gruss
-
Ich denke, daß das Problem NP-vollständig ist. Brauchst Du die optimale Lösung? Oder reicht eine gute?
In dem Fall könntest Du zum Beispiel ne zufällige Reihenfolge wählen und solange Positionen tauschen wie es besser wird. Das Ergebnis ist dann schonmal nicht ganz schlecht. Das wiederholst Du dann einige Male (100 oder 1000 mal) und nimmst davon die beste Variante.
MfG Jester
-
um die optimale lösung zu finden musst du alle möglichkeiten permutieren => n! . oben stehen schon ein paar ansätze, um nicht die optimale, aber zumindenst keine ganz miese zu finden.
-
Also laut Vorgabe soll ich die optimale Lösung finden !! Aber ein "gute" würde mir auch schon reichen !
Gruß
-
mata^ schrieb:
um die optimale lösung zu finden musst du alle möglichkeiten permutieren => n!
Bist Du sicher? Oder ist das nur ne Vermutung?
Wenn ich n Zahlen so anordenen will, daß n*zahl_1 + (n-1)*zahl_2 +...+1*zahl_n minimal wird, dann gibt's dafür zwar auch n! Möglichkeiten. Trotzdem kann man in O(n*log n) sortieren.
Ich denke aber auch, daß es nicht viel besser als O(n!) geht. Vielleicht exponentiell, aber viel schneller würde mich wundern. Es sei denn, es gibt noch Informationen, die wir nicht wissen.
Nehmen wir zum Beispiel an: es gibt A und B, jeweils 3 Stück. Wechsel zwischen Buchstaben sind teuer, Gleiche hintereinander ist günstig.
Dann ist entweder AAABBB oder BBBAAA optimal. Je nachdem wierum der Wechsel günstiger ist.
@OP: Kannst Du vielleicht noch mehr Infos rausrücken?
-
Also wichtig bei dieser Geschichte ist die Abhängigkeit der einzelnen Variablen von einander!
Man muß sich das so vorstellen:
Es gibt 3 Typen von Flugzeugen: Typ A, Typ B und Typ C !!
Und die müssen bestimmte Abstände beim Landeanflug einhalten und damit entstehen feste Zeitintervalle!
Beispiel:
Fliegt A hinter B, benötigt diese Kombination 50sec
Fliegt aber B hinter A brauchen sie nur 40sec, da der Sicherheitsabstand zwischen von B auf A geringer sein muß als A auf B !!Ich soll nun eine zufällige Reihenfolge von Fliegern so sortieren, das möglichst geringe Mindestabstände einzuhalten sind!
D.h. das zum Beispiel in 60min möglichst viele Flieger landen können und sie dementsprechend angeordnet sein müssen!Ich hoffe, ich konnt euch mein Problem etwas näher bringen und bin weiterhin dankbar für eure Tipps !
Gruß
Neo
-
Ein paar zusätzliche infos währen würklich nicht schlecht.
Wieviele Flugzeugtypen gibt es, und wieveile flugzeuge müssen verarbeitet werden? zur ungefähren abschätzung ob sich das ggf mit einem suchbaum in einer angemessenen zeit realiesieren läst.
Wobei sich das bei einer entsprechenden optimierung ggf sogar soweit verkürzen lässt, das nicht alle pfade bis zum schluss durchgerechnet werden müssen. Pfade bie schon mehr zeitbrauchen, aber wo noch nicht alle flugzeuge unten sind gegenüber der bisher besten lösung, brauchen nicht weiter betrachtet zu werden (zeitersparrniss). Da ich ja den Baum nicht vollständig expandieren muss, um die suche durchführen zu können, sondern im prinzip mir nur 2 äste davon merken muss (einer wird dann entsprechend so manipoliert, das er durch die endpunkte des Baumswandert), ist das speicherpoblem nicht gegeben.
Nur kurtz zum aufwand. bei sagen wir mal 5 Flugzeugtypen und 30 zu landenden Flugzeugen ergeben sich WENIGER als 5^30 mögliche kombinationen die im schlimsten falle erst mal berechnet und geprüft werden müssen. (die anzahl wird sich dadurch reduziehren, da nur eine bestimmte anzhal von flugzeugen je type existiert.)
gruss
-
Ich muss mich jetzt wohl korigieren.
Wieveile Flugzeuge von den einzelnen typen gibt es die man runterbringen muss?
Oder ist die frage wieveile flugzeuge kann man inerhalb einer Stunde runterbekommen?
Zumindestens beim Suchbaum verändert sich da ein bischen was. zumindestens bei der Suchtiefe und den abbruchkriterien. Auch ergeben sich da ganz andere Optimierungsmöglichkeiten wenn die Flugzeuganzahl je type egal ist. ggf läst sich dann sowas sogar noch von Hand expandieren und oder eine optimale wiederholungsfolge finden.gruss
-
Da ich mit Flugzeugklassen arbeite gibt es im Prinzip nur 3 verschiedene Flugzeugtypen: Heavy, Medium und Small !
Das Programm soll dann im Prinzip ein Feld generieren können mit einer bestimmten Zahl von Flugzeugen, so zwischen 10 und 200 vielleicht! Wieviele von jedem Typ is dabei willkürlich !
Für diese Menge soll dann die optimale Reihefolge bstimmt werden, also die minimale Zeit die sie benötigen um alle zu landen!
Ziel ist es also die Reihenfolge so zu verändern das die Summe der Zeit minimal wird!
-
Und wie sind die Zeitunterschiede? Das ist doch die wichtige Frage.
Wenn alle Paare gleich teuer sind, dann ist jede Reihenfolge optimal.Ohne die genauen Kostenangaben können wir Dir nicht genauer sagen, wie schwierig das Problem ist.
-
Termite schrieb:
ergeben sich WENIGER als 5^30 mögliche kombinationen die im schlimsten falle erst mal berechnet und geprüft werden müssen. (die anzahl wird sich dadurch reduziehren, da nur eine bestimmte anzhal von flugzeugen je type existiert.)
Schon, nennt sich Backtracking, kann man beim TSP (Traveling Salesman Problem) auch einsetzen. Trotzdem ist TSP NP-vollständig.
-
Die Zeitintervalle werde ich nachher mal hier posten!
Die sollen aber auch veränderbar sein!sagen wir folgende Reihenfolge: A >> B >> C >> A >> C >> B
B landet zuerst!
dann folgt im Abstand von 20sec C, d.h C auf B ist 20 sec,
dann folgt im Abstand von 15sec A, d.h A auf C ist 15 sec,
dann folgt im Abstand von 30sec C, d.h C auf A ist 30 sec,
dann folgt im Abstand von 35sec B, d.h B auf C ist 35sec,
dann folgt im Abstand von 10sec A, d.h A auf B ist 10 sec !!!Summe wäre 110sec !!
Und jetzt möchte ich die Reihenfolge so ändern das die Summe geringer wird!
Man sieht ja das, z.B. A auf C nur 15sec braucht, wogegen C auf A 30sec braucht!
Das sind jetzt nur fiktive Werte, die reellen hab ich gerade nicht zur Hand, kann ich aber gerne mal posten !
-
Ja, und vergiß bitte auch nicht alle Kombinationen zu posten:
Was ist mit AC, AA etc.?
Es gibt 9 verschiedene Kombinationen. Wenn wir nicht für alle die Werte kennen ist es witzlos.
-
Unten seht ihr einen Ausschnitt aus dem Programm:
Gibt die Typen 1,2,3 !
Und bei Summe steht dann immer das Zeitintervall....
12 >> 82
21 >> 146
31 >> 167
13 >> 78
...for (i=0; i <=9; i++)
{
if (flieger [i] == 1 && flieger [i+1] == 2)
{
Summe = Summe + 82;
}
else if (flieger [i] == 2 && flieger [i+1] == 1)
{
Summe = Summe + 146;
}
else if (flieger [i] == 3 && flieger [i+1] == 1)
{
Summe = Summe + 167;
}
else if (flieger [i] == 1 && flieger [i+1] == 3)
{
Summe = Summe + 78;
}
else if (flieger [i] == 3 && flieger [i+1] == 2)
{
Summe = Summe + 138;
}
else if (flieger [i] == 2 && flieger [i+1] == 3)
{
Summe = Summe + 78;
}
else if (flieger [i] == 1 && flieger [i+1] == 1)
{
Summe = Summe + 82;
}
else if (flieger [i] == 2 && flieger [i+1] == 2)
{
Summe = Summe + 82;
}
else if (flieger [i] == 3 && flieger [i+1] == 3)
{
Summe = Summe + 167;
}
}