Итерация элементов в массиве

Я пытаюсь написать код CPLEX OPL на примере (из систем управления) типичной проблемы MPC (Model Predictive Control). Как описано здесь:

С переменными оптимизации:

Со следующими параметрами:

Я попытался написать это, но я застрял на итерации массива переменной x (переменная состояния), как указано в ограничении задачи оптимизации. Код, который я до сих пор написал для OPL CPLEX, имеет следующий вид: (Файл модели имеет расширение .mod на платформе OPL)

//data

{string} state = ...;
{string} input = ...;

float A[state][state] =...;
float B[state][input] =...;
float Q[state] =...;
float R[input] =...;

//variable

dvar float State[state];
dvar float Input[input];
 
 
minimize
  sum( s in state, u in input ) 
    (State[s]*Q[s]*State[s] + Input[u]*R[u]*Input[u]);
    
subject to {
 
  forall( s in state, u in input )
    ct1: 
      A[s][s]*State[s] + B[s][u]*Input[u] == State[s+1];
} 

И файл данных, который я использую, имеет вид: (файл данных платформы OPL с расширением .dat)

state = {"x","y","vx","vy"};
input = {"ux","uy"};

A = [[1, 0, 0.2, 0],
     [0, 1, 0, 0.2],
     [0, 0, 1, 0  ],
     [0, 0, 0, 1  ]];
     
B = [[0,   0],
     [0,   0],
     [0.2, 0],
     [0, 0.2]];

Q = [[1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1]];

R = [[1, 1],
     [1, 1]];

Поэтому мне нужна любезная помощь для решения этой системы, так как я не могу решить вопрос итерации в переменной переменной состояния в ограничении данной задачи.

Мы будем очень признательны за вашу помощь, так как я застрял на этом на несколько недель.


person Luqman Saleem    schedule 23.05.2021    source источник


Ответы (1)


Вы можете превратить ct1 в

forall( s in state, u in input:s !=last( state ))
    ct1: 
      A[s][s]*State[s] + B[s][u]*Input[u] == State[next(state,s)];

.mod

//data

{string} state = ...;
{string} input = ...;

float A[state][state] =...;
float B[state][input] =...;
float Q[state] =...;
float R[input] =...;

//variable

dvar float State[state];
dvar float Input[input];
 
 
minimize
  sum( s in state, u in input ) 
    (State[s]*Q[s]*State[s] + Input[u]*R[u]*Input[u]);
    
subject to {
 
  forall( s in state, u in input:s !=last( state ))
    ct1: 
      A[s][s]*State[s] + B[s][u]*Input[u] == State[next(state,s)];
} 

.dat

state = {"x","y","vx","vy"};
input = {"ux","uy"};

A = [[1, 0, 0.2, 0],
     [0, 1, 0, 0.2],
     [0, 0, 1, 0  ],
     [0, 0, 0, 1  ]];
     
B = [[0,   0],
     [0,   0],
     [0.2, 0],
     [0, 0.2]];

Q = [1, 1, 1, 1]
     ;
R = [1, 1];

работает

person Alex Fleischer    schedule 23.05.2021