具有非线性目标的线性约束MIP的CPLEX vs约束编程解决方案

时间:2020-02-19 11:53:39

标签: integer division cplex cp nonlinear-optimization

我正在尝试使用诸如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引擎解决方案的任何建议都将受到高度赞赏。 预先感谢。

2 个答案:

答案 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]”错误。我怎样才能解决这个问题? 谢谢。