OPL CPLEX — использование многоцелевой оптимизации с различными ключевыми показателями эффективности

#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
{
  
}
  

работает нормально