Программирование целей в 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
Теперь у меня есть следующие вопросы:
Есть ли возможность решить эту проблему с помощью Cplex API удобным способом или мне нужно реализовать эту процедуру самостоятельно?
Если это возможно, как мне получить итоговые значения цели: 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;
}
Но на самом деле не работает. Помогите, пожалуйста! знак равно