Программирование целей в Cplex

Допустим, у меня есть две цели. Я хочу достичь этих целей очень близко:

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

В литературе вы можете заниматься целевым программированием, вставляя переменные, которые представляют отклонения. Допустим, переменная ai - это отклонение выше значения цели от цели I, а bi - отклонение ниже значения цели от цели I. Вы получаете следующие ограничения:

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

На последнем шаге вы создаете целевую функцию, где вы можете наказывать отклонения с помощью коэффициента наказания (p) для каждого отклонения.

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

Я работаю с Cplex API и увидел, что вы можете работать с Cplex-Goals:

IloCplex.Goal

Теперь у меня есть следующие вопросы:

  1. Есть ли возможность решить эту проблему с помощью Cplex API удобным способом или мне нужно реализовать эту процедуру самостоятельно?

  2. Если это возможно, как мне получить итоговые значения цели: 12 + 9y и 5 + 7y?

1 ответ

Решение

Да, это определенно возможно при использовании CPLEX. Фактически, вы уже выполнили большую часть необходимой формулировки, введя a1, a2, b1 и b2. Теперь вам просто нужно создать объект модели Cplex, дать ему цель и решить ее. (Вам не нужно IloCplex.Goal) Просто решите прямой LP.

Взгляните на любой из этих примеров Java и используйте их в качестве шаблона.

Просто установите свою целевую функцию. (pa0, pb1 и т. д. являются константами)

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

Затем, если CPLEX решит ваш LP, вы можете просто получить оптимальные значения a[0], a[1],b[0] и b[1], чтобы увидеть отклонения от Целей. (Обратите внимание, что только один из a или b будет положительным.) Используйте cplex.getValues(x) запросить значения переменных.

Надеюсь, это поможет.

Примерно так: // переменная решения dvar int x; dvar int y;

//obj function 
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));

// constraints
subject to {

12* x + 9*y -a1 + b1 <= 125;
5* x + 7*y -a2 +b2 <= 50;

}

Но на самом деле не работает. Помогите, пожалуйста! знак равно

Другие вопросы по тегам