我正在尝试以非线性目标(例如sum(a(i)*x(i))/sum(b(i)*x(i))
)求解MIP,其中a(i)和b(i)是参数。由于CPLEX无法提取此表达式,因此我尝试使用CP。
但是,我有约束条件指出决策变量x(i)应该是2.5的乘数,因此应该是浮点数。由于CP无法处理浮点数,因此我将x设置为整数,并暗示它是25的乘数。在其他所有约束和表达式中,我将x除以10,因此计算结果保持不变。
[首先,我用乘数5求解了模型,得到了一个很小的间隙的解决方案,这很好。当我将乘数更改为25时,该模型无法在2小时内终止(相隔90%的距离)。我相信这是由于缩放而发生的,但由于我对CP算法不熟悉,因此仍然无法解决。
我仍在努力使倾斜的物体线性化,但是,对于CPLEX和CP引擎解决方案的任何建议都将受到高度赞赏。预先感谢。
您是否尝试过将平等变成不平等,以提供一定的灵活性?
例如
using CP;
int scale=1000;
dvar int scalex in 0..2000;
dexpr float x=scalex/scale;
subject to
{
x*x==2;
}
不提供解决方案,而
using CP;
float epsilon=0.001;
int scale=1000;
dvar int scalex in 0..2000;
dexpr float x=scalex/scale;
subject to
{
abs(x*x-2)<=epsilon;
}
给予
x = 1.414
谢谢@Alex Fleischer。我尝试了你的建议。我的决策变量的索引是一个元组,因此我编写了如下代码:
dvar int scalex[1..card(hm)] in 0..10000;
int scale=100;
dexpr float A[1..card(hm)]=[];
int max_range=card(hm);
execute{
for (var i=1;i<=max_range;i++){
A[i]==scalex[i]/scale;
}
}
我收到脚本运行时错误:无法转换为数字,“ [a IloNumVar]”错误。我怎样才能解决这个问题?谢谢。