我有一个非线性约束,其形式为max_ {k in V,j in F ^ o:o> d} {U_ {jk} - U_ {ik}> F ^ d中的所有i都为0。集合V表示车队,而F ^ o表示某种类型的客户,而F ^ i表示某种类型的客户。如何实现能够在CPLEX,maxl()和IloMAx()中计算此功能的max函数似乎不起作用
答案 0 :(得分:0)
如果我理解正确,您的max
函数将返回U_jk - U_ik
对所有k in V
和j in F^o
的正值中的最大值,使o > d
k
}}。如果这是正确的,您只需要几个循环,一个在j
上,另一个在(k, j)
上。对于每个U_jk - U_ik
对,您需要验证所有条件:
o > d
具有正值。我假设您将在max函数之外检查IloInt myMaxFunction(IloIntArray V, IloIntArray Fo, Ilo2IntArray U, IloInt i) {
IloInt jMax;// j index of the maximum value
IloInt kMax;// k index of the maximum value
IloInt maxVal = -IloInfinity;// maximum value
IloInt Difference;
for (IloInt k = 0; k < V.getSize(); k++) {
for (IloInt j = 0; j < Fo.getSize(); j++) {
Difference = U[F0[j]][V[k]] - U[i][V[k]];
if ((Difference > 0) && (Difference > maxVal)) {
jMax = j;
kMax = k;
maxVal = Difference;
}
}
}
return maxVal;
}
条件以简化它。我建议你这样做:
d
您将进入两个线性阵列,第一个包含车辆组,第二个包含远离typedef IloArray<IloIntArray> Ilo2IntArray
距离库我认为的客户。第三个参数是您可以定义的二维整数集:i
。最后,您还需要客户(k, j)
作为输入。
对于所有k
元素对,V
是j
中的车辆而F^o
是U_jk - U_ik
集合中的客户,您将计算差异maxVal
,同时验证上述条件。在这种情况下,您将更新索引和最大值并继续。
请注意,list = [7,13,6,1]
x = 5
for i,j in enumerate(list):
if j==x:
print(i)
else:
print(-1)
必须初始化为在第一次验证条件时会得到改善的值。函数将返回最佳/更高的值。
很高兴能为您服务...... ÿ