如何在Cplex C++ API中比较两个IloNumArrays?

问题描述 投票:0回答:1

我想在我的Cplex模型中添加约束条件,以确保一堆数组是成对的不同。也就是说,两个数组中至少要有一个条目不同。

(说明一下:IloNumVarArray h代表一个n x m的矩阵,约束条件应该保证没有两行相同)

我下面的代码有两个错误(至少),我似乎无法解决。- 第一,"没有合适的从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很陌生,如果有任何帮助建议,我将感激不尽。

c++ arrays constraints cplex
1个回答
0
投票

你可以使用逻辑约束。

让我给你一个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);
}
© www.soinside.com 2019 - 2024. All rights reserved.