#cplex #opl
#cplex #opl
Вопрос:
Я пытаюсь реализовать многоцелевую оптимизацию принятия решений в CPLEX версии 12.10 в OPL IDE с использованием целевой функции staticLexFull. У меня есть 12 выражений решений, которые я включил в массив ключевых показателей эффективности, которые будут переданы в качестве первого аргумента staticLexFull . Хотя я не могу поделиться производственным кодом, по сути, это выглядит так:
dvar int a[1..10];
dvar int b[1..10];
dvar int c[1..25];
dvar int d[1..20];
dexpr float a_sum = sum(i in 1..10) a[i]*e[i] //e is a variable declared earlier
dexpr float b_sum = sum(i in 1..10) b[i]*f[i] //f declared earlier
dexpr float c_sum = sum(i in 1..25) c[i]*g[i]*h[i] //g amp; h declared earlier
dexpr float d_sum = sum(i in 1..20) d[i]*j[i] //j declared earlier
dexpr float kpis[1..4] = [a_sum, b_sum, c_sum, d_sum];
float weights[i in 1..4] = 1;
int priorities[1 in 1..4] = [1,2,3,3];
float abstol[i in 1..4] = 0.001;
float reltol[i in 1..4] = 0.001;
minimize staticLexFull(kpis, weights, priorities, abstol, reltol);
Это отличается от доступных примеров staticLexFull для Opl IDE; представленные примеры показывают, как инициализировать массив ключевых показателей эффективности, когда каждый элемент массива имеет дело с одной и той же переменной решения, и поэтому может быть инициализирован в общем виде, например:
dvar int Life[Bord][Bord] in States;
dexpr float kpis[i in Bord1] = sum(i1 in Bord, j1 in Bord : i1 != i] Life[i1][j1];
Когда я пытаюсь запустить приведенный выше код, я получаю сообщение об ошибке «Процесс OplRun не отвечает, необходимо перезапустить конфигурацию запуска». Затем я попытался запустить OplRun напрямую через командную строку и получил сообщение об ошибке: «ОШИБКА [СГЕНЕРИРОВАТЬ 209]: недопустимое выражение инициализации для элемента «kpi»».
Я не знаю, как я мог бы инициализировать этот массив в целом, что, по-видимому, является требованием для запуска staticLexFull. Это кажется странным, потому что кажется, что большинство вариантов использования будут соответствовать моим, а не примерам, приведенным в примерах. Есть ли способ использовать staticLexFull так, как я пытаюсь?
Примечание Я попытался задать этот вопрос на форуме сообщества IBM по оптимизации решений, но сообщение не отображалось, когда я нажимал кнопку «отправить».
Ответ №1:
можете ли вы переписать свои ключевые показатели эффективности в
dexpr float kpis[i in 1..4] = (i==1)?a:((i==2)?b:((i==3)?c:d));
?
dvar int a;
dvar int b;
dvar int c;
dvar int d;
dexpr float kpis[i in 1..4] = (i==1)?a:((i==2)?b:((i==3)?c:d));
float weights[i in 1..4] = 1;
int priorities[1..4] = [1,2,3,3];
float abstol[i in 1..4] = 0.001;
float reltol[i in 1..4] = 0.001;
minimize staticLexFull(kpis,weights,priorities,abstol,reltol);;
subject to
{
}
работает нормально