我正在尝试使用诸如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引擎解决方案的任何建议都将受到高度赞赏。 预先感谢。
答案 0 :(得分:0)
您是否尝试过将平等变成不平等,以提供一定的灵活性?
例如
@Component({
selector: "app-newsfeed",
templateUrl: "./abc.component.html",
styleUrls: ["./abc.component.css",],
providers:[DialogService]
})
不提供解决方案,而
using CP;
int scale=1000;
dvar int scalex in 0..2000;
dexpr float x=scalex/scale;
subject to
{
x*x==2;
}
给予
x = 1.414
和
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;
}
也很好
答案 1 :(得分:0)
谢谢@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]”错误。我怎样才能解决这个问题? 谢谢。