【问题标题】:How to write average constraints in CPLEX OPL?如何在 CPLEX OPL 中编写平均约束?
【发布时间】:2019-10-11 12:46:43
【问题描述】:

我有几个关于建模约束的问题。我想它应该很简单,但我无法弄清楚。首先,让我概述一下情况:我想优化一个多维背包问题。但是,我在两个约束条件下遇到了一些困难。

我首先阅读包含以下列的 Excel 工作表:

{string} Items = …;
tuple Item {
int weight;
int classification_1;
int classification_2;
…}

dvar int a[Items] in 0..1;

classification_1和classification_2是物体的两个独立的分类,你可以想象一下,例如classification_1包含一个代表颜色的整数,而classification_2有另一个属性(例如形状,其中一个数字代表某种形状)。 为了更清楚地说明问题,您可以想象一个对象如下:

Ball_object; 23; 1; 2; …

其中 Ball_object 是名称,23 是重量,1 是蓝色,2 是圆形,其他属性与我的问题没有直接关系。 现在假设我有以下约束: 1. 所有商品的重量应小于所选商品总重量的10%。

我尝试了以下方法:

Subjected to {
    Forall ( i_1 in Items )
    ctItemRatio:
    (Item[i_1].weight * a[i_1]) / (sum (I in Items) (Item[i].weight * a[i])) <= 0.1;
}

但这似乎不起作用,因为我的 CPLEX 工作室无法提取表达式。但是我有点困惑我实际上在这个约束上做错了什么。有谁知道我该如何解决这个问题?

  1. 对于每个形状,给定形状的总重量不应超过总重量的 15%。

我实际上并没有真正的线索如何做到这一点,因为我不能只遍历分类_2 对吗?我如何对其进行建模,以便我可以通过分类_2 使用 forall? (我很想找到一个 OPL 解决方案,而不仅仅是手动命名所有形状。

感谢您的帮助!

【问题讨论】:

  • 对于约束 1,如果将两边都乘以 sum (I in Items) (Item[i].weight * a[i])(即从 LHS 中删除并放在 RHS 上),它是否有效?
  • 对于约束 2,我假设您的意思是给定形状的 选定 项的总重量不应超过 选定 项目?难道你不能先建立一个classification_2的唯一值列表,然后遍历这些值,为每个值建立约束吗?
  • 对于约束 2,给定形状的所选项目的总权重不应超过 15%。
  • 什么的 15%?所有物品的总重量?那种形状的所有物品?所有选定的项目?
  • 所有选中物品重量的15%。

标签: cplex opl


【解决方案1】:

对于约束 #1,您编写它的方式是非线性的。如果您只是将两边都乘以sum (I in Items) (Item[i].weight * a[i]),它就会变成线性的,CPLEX 应该很高兴:

Item[i_1].weight * a[i_1] <= 0.1 * (sum (I in Items) (Item[i].weight * a[i]));

对于约束 #2,我建议构建一个 category_2 的唯一值列表(在调用 OPL 代码之前),然后遍历这些值,为每个值构建一个约束。我不熟悉 OPL 的语法,但大概您可以在总和中添加一个条件;类似:

sum (i in Items : classification_2[i] == <some value>)

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多