具有非线性目标(部门)的线性约束MIP的CPLEX与约束规划解决方案

问题描述 投票:0回答:2

我正在尝试以非线性目标(例如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引擎解决方案的任何建议都将受到高度赞赏。预先感谢。

integer division cplex cp nonlinear-optimization
2个回答
0
投票

您是否尝试过将平等变成不平等,以提供一定的灵活性?

例如

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


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

© www.soinside.com 2019 - 2024. All rights reserved.