Sie versuchen, eine Einschränkung der folgenden Form an ein lineares Programm hinzuzufügen:
(-0.275 y0 + 0.15 y1 + 0.15 y2 + 0.236 y3 + 0.14745 y4)/(-0.175 y0 + 0.05 y1 + 0.05 y2 + 0.136 y3 + 0.04745 y4) >= 0;
Für Notations Einfachheit, ich A = (-0.275 y0 + 0.15 y1 + 0.15 y2 + 0.236 y3 + 0.14745 y4)
und B = (-0.175 y0 + 0.05 y1 + 0.05 y2 + 0.136 y3 + 0.04745 y4)
definieren werden. Ihre Einschränkung ist daher:
A/B >= 0
Das bedeutet, eine der folgenden zwei Bedingungen erfüllt sind:
A >= 0
und B >= 0
A <= 0
und B <= 0
Dies stellt eine nicht-Konvexität in Ihrer Formulierung, weil Punkte (A, B) = (4, 4)
und (A, B) = (-2, -6)
sind beide machbar, aber ihr Mittelpunkt (A, B) = (1, -1)
ist nicht machbar. Da Ihre machbare Menge nicht konvex ist, ist es tatsächlich unmöglich, Ihre Situation mit einem linearen Programm mit allen kontinuierlichen Variablen zu modellieren, wie Sie es in Ihrem Code versucht haben.
Sie müssen eine binäre Variable in Ihre Formulierung einführen, um diese Nichtkonvexität zu modellieren. Eine natürliche Möglichkeit, dies zu modellieren, wäre, die Binärvariable z
gleich 1 zu machen, wenn A >= 0
und B >= 0
und z
gleich 0 zu machen, wenn A <= 0
und B <= 0
. Dann könnten Sie die folgenden Einschränkungen einführen (hier M
ist eine große positive Konstante):
A <= Mz
B <= Mz
A >= M(z-1)
B >= M(z-1)
z binary
Wenn z=0
, dann die Einschränkungen geben uns -M <= A <= 0
und -M <= B <= 0
, während, wenn z=1
, dann sind die Zwänge geben uns 0 <= A <= M
und 0 <= B <= M
. Wenn der ausgewählte Wert M
ausreichend groß ist, wird dies Ihre Situation erfassen.
Hallo josliber, vielen Dank für Ihre Hilfe. Ich habe Probleme ein laufendes Beispiel zu bekommen. Ich versuche das. [Code] A = -0,275 y0 + 0,15 y1 + 0,15 y2 + 0,236 y3 + 0,14745 y4; B = -0,175 y0 + 0,05 y1 + 0,05 y2 + 0,136 y3 + 0.04745 y4; A <= Mz; B <= Mz; A> = M (z-1); B> = M (z-1); z binär; [/ code] Aber ich bekomme Parse-Fehler. Ich verstehe die Logik nicht im Detail ... – ABSimon
@ABSimon 'M' sollte durch eine große Zahl, wie 1000000 ersetzt werden. – josliber
Hallo Josliber, ich muss auch die Klammern in" A> = 1000000 (z-1) platzieren "und" B> = 1000000 (z-1) ". Ich denke ich bekomme dann "A> = 1000000 z - 1000000" und "B> = 1000000 z - 1000000". Insgesamt habe ich dann den Workaround "A <= 1000000 z; B <= 1000000 z; A> = 1000000 z - 1000000; B> = 1000000 z - 1000000; bin z;" statt "A/B> = 0"? Vielen Dank! Ich denke, es ist eine große Hilfe für jeden lp_solve Anfänger :) – ABSimon