如何在 Cplex C++ API 中比较两个 IloNumArray?
How do I compare two IloNumArrays in Cplex C++ API?
我想向我的 Cplex 模型添加约束,以确保一组数组成对不同。也就是说,至少有一个条目在这两个条目中应该不同。
(澄清一下:IloNumVarArray h 表示一个 n x m 矩阵,约束应确保没有两行相同)
我下面的代码有两个(至少)我似乎无法解决的错误:
- 首先是'no suitable conversion function from IloNumVar to 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 的新手,我将不胜感激 help/suggestions
您可以使用逻辑约束。
让我在 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);
}
我想向我的 Cplex 模型添加约束,以确保一组数组成对不同。也就是说,至少有一个条目在这两个条目中应该不同。
(澄清一下:IloNumVarArray h 表示一个 n x m 矩阵,约束应确保没有两行相同)
我下面的代码有两个(至少)我似乎无法解决的错误:
- 首先是'no suitable conversion function from IloNumVar to 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 的新手,我将不胜感激 help/suggestions
您可以使用逻辑约束。
让我在 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);
}