【问题标题】:Integer Programming - If then statement整数编程 - If then 语句
【发布时间】:2022-01-17 01:46:40
【问题描述】:
我是线性/整数编程的新手,我很难为固定电荷问题中的特定 if-then 语句制定约束。假设有 5 家 T 恤制造商,客户希望在最小化成本的同时购买 400 件 T 恤。
| Producer |
Variable cost/t-shirt |
Delivery |
Availability |
| A |
3 |
40 |
200 |
| B |
3.5 |
30 |
100 |
| C |
4.10 |
Free delivery |
100 |
| D |
4.1 |
30 |
200 |
| E |
3.2 |
30 |
First 100 t-shirts |
| E |
2.90 |
20 |
101st-150th t-shirt |
生产者 E 有 150 件 T 恤。从生产商 E 处购买的前 100 件 T 恤的可变成本为 3.20 美元,运费为 30 美元。如果客户从生产商 E 那里订购了超过 100 件 T 恤,她可以以 2.90 美元的可变成本和 20 美元的额外费用购买它们。
如何从这个 if-then 语句创建约束:
- Xe1 = 在生产商 E 处购买的昂贵 T 恤的数量
- Xe2 = 在生产商 E 处购买的廉价 T 恤的数量
当 Xe1
提前致谢!
【问题讨论】:
标签:
constraints
linear-programming
minimization
maximize
mixed-integer-programming
【解决方案1】:
由于 Xe1 和 Xe2 都是非负整数变量,因此您的约束与 Xe1 <= 99 ⇒ Xe2 = 0 相同。这可以表述如下:
b1 <= b2
99*b1 + 100*(1-b1) <= Xe1 <= 99*b1 + M*(1-b1)
1-b2 <= Xe2 <= M'*(1-b2)
其中b1,b2 是二进制辅助变量,M 和M' 是Xe1 和Xe2 的上限,即M = 101 和M' = 400。
【解决方案2】:
这是一种非常标准的“折扣定价模型”,即按一定数量授予折扣价格。您可以在模型中引入 1 个二进制变量来执行此操作。这听起来像是一个硬件任务.... :)
让:
Xe1 be the qty bought from E at price 1
Xe2 be the qty bought from E at price 2
Ye be the decision to buy at the second price point y ∈ {0, 1}
Me2 be the qty available at the 2nd price (or a reasonable upper bound)
然后:
Xe2 <= Ye * Me2 # purchase at 2nd price point held to zero, unless Ye==1
Xe1 >= 100 * Ye # Ye can only be 1 if 100 are purchased at Xe1
这里的运输存在一些细微差别。从问题描述中不清楚您是否从 E 购买了 101 件衬衫,如果运输成本为 30 + 20(这将是奇数)或整个运输成本降至 20。您可以使用相同的指示变量 @987654323 @ 也可以解决这个问题。