描述如何在问题中表示各种约束。
从问题描述中可以看出,这个问题存在多种限制因素。
对于每种类型的油,计划结束时必须存储 500 吨油。 这一想法可以表示为:
forall( p in Products )
ctStore:
Store[NbMonths][p] == 500;
每个月的生产约束全部可以表示为 forall 语句中的语句:
植物油精制量不得超过 200 吨。
ctUse1:
Use[m]["v1"] + Use[m]["v2"] <= 200;
非植物油精制量不得超过 250 吨。
ctUse2:
Use[m]["o1"] + Use[m]["o2"] + Use[m]["o3"] <= 250;
调和油不能使用三种以上类型的油;也就是说,在五种食用油中,不能在给定调和油中使用其中两种油。
ctUse7:
(Use[m]["v1"] == 0) + (Use[m]["v2"] == 0) + (Use[m]["o1"] == 0) +
(Use[m]["o2"] == 0) + (Use[m]["o3"] == 0) >= 2;
由植物油 1 (v1) 或植物油 2 (v2) 组成的调和油也必须包含非植物油 3 (o3)。
ctUse9:
(Use[m]["v1"] >= 20) || (Use[m]["v2"] >= 20) => Use[m]["o3"] >= 20;
以下示例表示的约束声明,如果某种油完全在调和油中使用,必须使用至少 20 吨这种油:
ctUse8:
(Use[m][p] == 0) || (Use[m][p] >= 20);
以下示例表示的事实是,可以存储有限数量的未加工油以供稍后使用:
forall( p in Products ) {
ctUse6:
if (m == 1) {
500 + Buy[m][p] == Use[m][p] + Store[m][p];
}
else {
Store[m-1][p] + Buy[m][p] == Use[m][p] + Store[m][p];
}