如何在CPLEX OPL中写入平均约束?

如何在CPLEX OPL中写入平均约束?,cplex,opl,Cplex,Opl,关于建模约束,我有几个问题。我想应该很简单,但我想不出来。首先,让我来描述一下情况:我想优化一个多维背包问题。然而,在两个约束条件下,我遇到了一些困难 我首先阅读的是包含以下列的Excel表格: {string} Items = …; tuple Item { int weight; int classification_1; int classification_2; …} dvar int a[Items] in 0..1; 分类_1和分类_2是对象的两个独立分类,您可以想象,例如分类_

关于建模约束,我有几个问题。我想应该很简单,但我想不出来。首先,让我来描述一下情况:我想优化一个多维背包问题。然而,在两个约束条件下,我遇到了一些困难

我首先阅读的是包含以下列的Excel表格:

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

dvar int a[Items] in 0..1;
分类_1和分类_2是对象的两个独立分类,您可以想象,例如分类_1包含一个表示颜色的整数,而分类_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;
}
受到{
Forall(项目中的i_1)
比率:
(项目[i#1]。权重*a[i#1])/(项目[i]。权重*a[i])对于约束#1,您编写它的方式是非线性的。如果您只需将两边乘以
sum(项目[i])(项目[i]。权重*a[i])
,它就会变成线性的,CPLEX应该很高兴:

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

Item[i_1]。约束1的权重*a[i_1],如果您将两侧乘以
sum(i in Items)(Item[i]。权重*a[i])
(即,将其从左侧移除并放在右侧),它有效吗?对于约束2,我假设您的意思是,给定形状的选定项目的总重量不应超过选定项目总重量的15%?您不能先建立一个分类2的唯一值列表,然后循环这些值,为每个值建立约束吗?对于约束2,总重量给定形状的选定项目的总重量不应超过15%。所有项目总重量的15%?该形状的所有项目?所有选定项目?所有选定项目重量的15%。
sum (i in Items : classification_2[i] == <some value>)