2016-03-19 10 views
1

:) Lassen Sie uns sagen, ich habe die beiden Ziele. Ich möchte wirklich, dass die Ziele der Nähe erreichen: SieZiel Programmierung in Cplex

i=1) profit goal: 12 + 9y ≥ 125 
i=2) cost-goal: 5 + 7y ≤ 50 

In der Literatur kann durch Einfügen Variablen Ziel-Programmierung tun, die Abweichungen darstellen. Nehmen wir an, die Variable ai ist die Abweichung über dem Zielwert von Ziel I und bi ist die Abweichung unter dem Zielwert von Ziel i. Sie erhalten die folgenden Einschränkungen:

12 + 9y -a1 + b1 = 125 
5 + 7y -a2 + b2 = 50 

Im letzten Schritt legen Sie die Zielfunktion zu erstellen, in dem Sie die Abweichungen mit einem straf Faktor zu bestrafen (p) für jede Abweichung.

minimize: pd1*b1 + pa1*a1 + pd2*b2 + pa2*a2 

Ich bin mit dem Cplex API arbeiten, und ich sah, dass Sie mit Cplex-Ziele arbeiten können:

IloCplex.Goal 

Jetzt habe ich folgende Fragen:

  1. Gibt es eine Möglichkeit, dieses Problem mit Cplex API auf praktische Weise gelöst zu bekommen, oder muss ich dieses Verfahren selbst implementieren?
  2. Wenn es möglich ist, wie bekomme ich die resultierenden Zielwerte: 12 + 9y und 5 + 7y?

Vielen Dank für Ihre Hilfe!

+0

Cplex-Ziele dienen zur Steuerung der Verzweigung und stehen nicht im Zusammenhang mit der Zielprogrammierung. –

Antwort

0

Ja, das ist definitiv mit CPLEX möglich. In der Tat haben Sie bereits die meisten Formulierungen, die benötigt werden, durch die Einführung von a1, a2, b1 und b2 getan. Jetzt müssen Sie nur ein Cplex-Modellobjekt erstellen, ihm das Ziel geben und es lösen. (Sie brauchen nicht IloCplex.Goal) Nur eine gerade LP zu lösen.

Werfen Sie einen Blick auf diese Java examples und folgen Sie ihnen als Vorlage.

Legen Sie einfach Ihre Zielfunktion fest. (Pa0, PB1 usw. sind Konstanten)

IloNumExpr obj = cplex.sum(cplex.prod(pa0, a[0]), 
          cplex.prod(pa1, a[1]), 
          cplex.prod(pb0, b[0]), 
          cplex.prod(pb1, b[1])); 

    model.add(IloMinimize(env, obj)); 

Dann haben CPLEX Ihre LP lösen, geben Sie einfach die optimalen Werte von a erhalten können [0], a [1], b [0] und b [1 ] um die Abweichungen von den Zielen zu sehen. (Beachten Sie, dass nur einer von a oder b positiv ist.) Verwenden Sie cplex.getValues(x), um die Variablenwerte abzufragen.

Hoffe, dass hilft.