Optimierung mit diskreten Parametern in Matlab

Habe ich 12 Sätze von Vektoren (etwa 10-20 Vektoren) und ich will ein pick-Vektor, der jeden Satz so, dass eine Funktion f, der die Summe dieser Vektoren als argument wird maximiert. Darüber hinaus habe ich Einschränkungen für einige Komponenten dieser Summe.

Beispiel:

a_1 = [3 2 0 5], a_2 = [3 0 0 2], a_3 = [6 0 1 1], ... , a_20 = [2 12 4 3]
b_1 = [4 0 4 -2], b_2 = [0 0 1 0], b_3 = [2 0 0 4], ... , b_16 = [0 9 2 3]
...
l_1 = [4 0 2 0], l_2 = [0 1 -2 0], l_3 = [4 4 0 1], ... , l_19 = [3 0 9 0]

s = [s_1 s_2 s_3 s_4] = a_x + b_y + ... + l_z

Einschränkungen:

s_1 > 40
s_2 < 100
s_4 > -20

Ziel: Wähle x, y, ... , z zur Maximierung von f(s):

f(s) -> max

Wobei f eine nichtlineare Funktion, die den Vektor s und liefert einen Skalar.

Bruteforcing dauert zu lange, weil es über 5.9 Billion Kombinationen, und da Brauch ich die maximale (oder noch besser die top 10 Kombinationen) kann ich nicht verwenden Sie eine der greedy-algorithmen, die mir in den Sinn kam.

Vektoren sind Recht spärlich, etwa 70-90% sind Nullen. Wenn das hilft irgendwie ...?

Der Matlab-Optimization toolbox nicht helfen, da es nicht viel Unterstützung für diskrete Optimierung.

  • können Sie etwas über die nicht-lineare Funktion f(s)? was wissen Sie über ihn? was können Sie übernehmen?
  • Wenn Sie uns ein vollständig reproduzierbares Beispiel (mit den Einschränkungen, und der obj Funktion detailliert aus) können wir nur empfehlen, Wege zu gehen, über das problem zu lösen.
  • Mit den Einschränkungen, die Suche nach Raum ist nicht so groß.
  • verwenden fminsearch oder bintprog und minimieren 1/f(s)...
  • wie bintprog helfen wird? die Objektive Funktion der bintprog wird angenommen, lineare
  • Ich schrieb auch "oder fminsearch", da mehr Daten würde ich wahrscheinlich einen besseren Kommentar...
  • Über die Funktion f(s): ich muss verschiedene Funktionen und ich bin nicht 100% sicher sind, wie Sie Aussehen, aber hier sind einige Beispiele: f(s) = s_1 * (s_2 * s_3 - s_2 + 2) oder f(s) = s_1 * s_2 * 0.5 / (1.5 * s_3). Einschränkungen sind wie in meinem Beispiel, nur größer/kleiner.
  • tut a_x bedeutet, x eine Zahl von 1 bis 20, im Zusammenhang mit a_1...a_20 ? Was bedeutet s1= bedeutet ? nur einer von vier Vektoren, die abgetastet wird, aus dem Satz a_i ... l_j?
  • Sie haben die global optimization toolbox?
  • 1/f(s) ist problematisch, mit Methoden, die Derivate einsetzen (und andere Dinge), in der Regel, einfach -f(s) ist die bessere Wahl.
  • Woher weißt du das? Angenommen, 75% aller Kombinationen wäre ja Weg von den Zwängen. Das lässt (20^12)/4 oder zum 1 Billiarde - Kombinationen. Auf eine Milliarde Kombinationen pro Sekunde, das heißt fast 12 Tage Zahlenverarbeitung...scheint nicht sehr effizient zu mir.
  • Nur um zu überprüfen: 1) sind Ihre Vektoren tatsächlich Ganzzahlen? Wenn ja, welche Art (int8, uint64, etc.)? Was ist Ihre wahre Größe, in Ihrem realen Programm ich meine?
  • Die Vektoren sind eigentlich Schwimmer, aber Sie enthalten nur ganze zahlen, so dass die Rundung zu Ihnen zu int8 ist in Ordnung. Sie haben 24 Elemente.

InformationsquelleAutor Johannes | 2013-06-25
Schreibe einen Kommentar