Как решить эту ошибку, когда я использую CP в Cplex - PullRequest
0 голосов
/ 20 сентября 2019

Теперь я сталкиваюсь с ошибкой.

'Переменные решения типа dvar float не поддерживаются этим алгоритмом.'

Вот код, который я сделал.

Я напишу это просто.

Во-первых, у меня возникла проблема с ошибкой, что «q1» не является выпуклым. »

Итак, теперь я пытаюсь« Использовать CP; »

Using CP;

int a = 2;
int e = 4;
int h = 3;
int t = 6;

range arange = 1..a;
range erange = 1..e;
range hrange = 1..h;
range trange = 1..t;

int nd[erange][hrange] = [[0.8, 0.2, 0.3]
                          [0.3, 0.1, 0.6]
                          [0.1, 0.7, 0.5]];

dvar boolean x[arange][erange][trange];
dvar float y[erange][hrange][trange];

maximize
sum(a in arange, e in erange, h in hrange, t in trange)
  y[e][h][t] * x[a][e][t];

subject to {

forall(a in arange, e in erange, t in trange, h in hrange)
   y[e][h][t] == nd[e][h];

}

Мне нужно использовать тип 'float' в качестве переменной решения.

Но 'Using CP;'не поддерживает этот тип.

В этом случае, что я должен сделать, чтобы решить эту ошибку.

1 Ответ

1 голос
/ 20 сентября 2019

Как видно из примера floatexpr.mod, вы можете использовать выражения решения для использования десятичных значений.В вашем примере:

using CP;

int a = 2;
int e = 4;
int h = 3;
int t = 6;

range arange = 1..a;
range erange = 1..e;
range hrange = 1..h;
range trange = 1..t;

float nd[erange][hrange] = [[0.8, 0.2, 0.3],
                          [0.3, 0.1, 0.6],
                          [0.1, 0.7, 0.5]];

int scale=10;                          

dvar boolean x[arange][erange][trange];
dvar int yscale[erange][hrange][trange] in 0..1000;

dexpr float y[a in erange][b in hrange][c in trange]=yscale[a][b][c]/scale;

maximize
sum(a in arange, e in erange, h in hrange, t in trange)
  y[e][h][t] * x[a][e][t];

subject to {

forall(a in arange, e in erange, t in trange, h in hrange)
   (y[e][h][t] - nd[e][h])<=0.01;

}
...