IBM Optimization Studio OPL,为什么不遵守约束?

时间:2018-09-13 17:47:03

标签: optimization cplex nonlinear-optimization opl

这是我需要解决的optimization problem的描述,但有一点曲折。我需要添加两个约束:

  • 第一个约束条件:我们只希望从每个组中选择一个产品,这意味着我们不能允许同一组中的两个产品位于同一购物篮中(即,Product11和Product12永远不应位于同一购物篮中)
  • 第二个约束:在用户购物篮中,我们只需要用户感兴趣的类别的产品。即,如果用户对“蛋白质”类别感兴趣,那么他永远不会在篮子中找到“碳水化合物”类别的产品或“脂肪”。

因此,我更改了OPL代码product.mod:

{string} categories=...;

{string} groups[categories]=...;

{string} allGroups=union (c in categories) groups[c];

{string} products[allGroups]=...;
{string} allProducts=union (g in allGroups) products[g];

float prices[allProducts]=...;

int Uc[categories]=...;
float Ug[allGroups]=...;

float budget=...;



dvar boolean z[allProducts]; // product out or in ?


dexpr int xg[g in allGroups]=(sum(p in products[g]) z[p]);
dexpr int xc[c in categories]=(1<=sum(g in groups[c]) xg[g]);




maximize
sum(c in categories) Uc[c]*xc[c]+
sum(c in categories) sum(g in groups[c]) Uc[c]*Ug[g]*xg[g];
subject to
{
ctBudget:// first constraint
    sum(p in allProducts) z[p]*prices[p]<=budget;
ctGroups: // second constraint 
    forall( g in allGroups )
        xg[g]==1;
ctCategories: // third constraint 
    forall( c in categories )
        Uc[c]==xc[c];
}
{string} solution={p | p in allProducts : z[p]==1};
 execute
 {
   writeln("xg=",xc);
   writeln("xg=",xg);
   writeln("Solution=",solution);

  }

这里是product.data的代码

categories={"Carbs","Protein","Fat"};
groups=[{"Meat","Milk"},{"Pasta","Bread"},{"Oil","Butter"}];
products=[
{"Product11","Product12"},{"Product21","Product22","Product23"},
{"Product31","Product32"},{"Product41","Product42"},
{"Product51"},{"Product61","Product62"}];

prices=[1,1,3,3,2,1,2,1,3,1,2,1];


Uc=[1,0,0];
Ug=[0.8,0.2,0.1,1,0.01,0.6];
budget=2;

IBM Studio给出的结果如下:{Product12,Product31};而我想要的结果是{Product11}或{Product12}。

我在“冲突”标签中也注意到了这一点: enter image description here

这在放松选项卡中: enter image description here

所以我有五个问题:

  1. 我看不到约束之间的任何冲突,因为如果我们选择产品“ Product12”(或Product11”),我们将遵守所有约束,并且预算将为<= 2,因为price [“ Product12”] == 1.
  2. 我不明白为什么优化器选择不遵守最后一个约束,而是最大化目标函数。
  3. 如果优化程序不使用任何松弛,是否会导致模型不可行(无法解决问题)?我不明白为什么?对我来说,仅选择“ Product12”(或“ Product11”)是一个完美的解决方案,无需任何放松。
  4. 如何让优化器不放松最后一个约束? (请注意,更改设置文件product.ops以仅放宽documentation中的带标签的约束没有帮助,因为我只想放宽一个约束)

  5. 在关于relaxing infeasible models的文档中,我发现了这一点:

  

但是,请注意,不可行可能是另一个约束建模错误的结果。

这是我的情况吗?

预先感谢您的帮助

1 个答案:

答案 0 :(得分:0)

  • 在1 + 2上=您有一些未在模型中定义的东西...您能说说如果AllGroups和Groups分别存在还是2个相同,那么这些数据是什么?同样,您使用“产品”和“所有产品”,与“组”的问号相同。您要在此处粘贴完整的.mod和.dat,它们已经运行并产生了显示的轻松结果...吗?一旦至少可以重现您显示的问题,我就可以开始查看“为什么”:-)
  • 3号=是,应该
  • 第4条=到达非松弛模型的方式是删除约束的命名。即如果没有解决方案,则每个被命名的约束都被认为是宽松的。每个未命名的约束都是“硬”的,即必须遵守,不能放宽。只需删除或注释掉以下行: ctBudget:// first constraint, ctGroups: // second constraint, ctCategories: // third constraint,如果您希望所有约束都像给定数据一样得到遵守...