微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为每个决策变量指定区间? CPLEX

如何解决如何为每个决策变量指定区间? CPLEX

我有一组代表产品数量的决策变量。我希望它们中的每一个都可以是 0(如果它没有被选中)或在某个区间([0.2;0.8])。 forall 不起作用。

{string} Produkti = ...;
{string} Vielas = ...;

float Izmaksas[Produkti] = ...;
float vielVertibas[Produkti][Vielas]= ...;
float normas[Vielas]= ...;
dvar float+ prodApjoms[Produkti];

minimize
    sum(p in Produkti) Izmaksas[p] * prodApjoms[p];
    
subject to{
    forall(v in Vielas) sum (p in Produkti) vielVertibas[p][v] * prodApjoms[p] >= normas[v]*0.95;
    forall(v in Vielas) sum (p in Produkti) vielVertibas[p][v] * prodApjoms[p] <= (normas[v]*1.05);
    sum (p in Produkti) prodApjoms[p] <= 15;
    sum (p in Produkti) prodApjoms[p] >= 5;
}

解决方法

forall(p in Produkti) 
    (prodApjoms[p]==0) || ((0.2<=prodApjoms[p]) && (prodApjoms[p]<=0.8));

将完成工作

https://github.com/AlexFleischerParis/zooopl/blob/master/zoosemiinteger.mod 中的完整工作示例

int nbKids=300;
float costBus40=500;
float costBus30=400;
 
dvar int+ nbBus40;
dvar int+ nbBus30;
 
minimize
 costBus40*nbBus40  +nbBus30*costBus30;
 
subject to
{
 (nbBus40==0) || (4<=nbBus40<=20);
 (nbBus30==0) || (4<=nbBus30<=20);
 
 
 40*nbBus40+nbBus30*30>=nbKids;
} 

/*

which gives

nbBus40 = 8;
nbBus30 = 0;

*/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。