Как сравнить два IloNumArrays в Cplex C ++ API? - PullRequest
0 голосов
/ 02 мая 2020

Я хочу добавить ограничения в мою модель Cplex, которая гарантирует, что куча массивов попарно отличается. То есть как минимум одна запись должна отличаться от двух.

(Чтобы уточнить: IloNumVarArray h представляет матрицу nxm, и ограничения должны гарантировать, что нет двух одинаковых строк)

В моем коде ниже есть две ошибки (по крайней мере), которые я не могу кажется, чтобы решить: - Во-первых, «нет подходящей функции преобразования из IloNumVar в IloNum»,
- Во-вторых, нельзя использовать оператор! = Для сравнения IloNumArrays.

IloNumVarArray h(env, n*m);
IloNumArray temp1(env, m);
IloNumArray temp2(env, m);
for (int i = 0; i < n - 1; i++) {
    temp1.clear();
    temp2.clear();
    for (int k = 0; k < n - i; k++)
        for (int j = 0; j < m; j++) {
            temp1[j] = h[j + i * m];
            temp2[j] = h[j + (i + k) * m];
        }
    model.add(temp1 != temp2);
}

Так как я могу изменить temp1 и temp2 такие, что можно скопировать из h и сравнить два?
(или сделать это совсем по-другому)
Я новичок в Cplex и буду признателен за любую помощь / предложения

1 Ответ

0 голосов
/ 02 мая 2020

вы могли бы использовать логические ограничения.

Позвольте мне привести вам пример в OPL CPLEX, который вы можете адаптировать к C ++

int n=3;
int m=2;

range N=1..n;
range M=1..m;

float epsilon=0.0001;

dvar float temp1[N][M] in 0..10;
dvar float temp2[N][M] in 0..10;

minimize sum(i in N,j in M) (temp1[i][j]+temp2[i][j]);
subject to
{
  // at least for one (i,j) the 2 arrays are different
  1<=sum(i in N,j in M) (abs(temp1[i][j]-temp2[i][j])>=epsilon);
}
...