我是Excel求解器的新手,只是在拿起数据科学书后才了解它。我想更熟悉这个工具,所以我一直在努力解决不同的问题。虽然我被困在一个,我甚至不确定是否可以使用求解器?基本上,我需要检查的约束是两个单元是否相邻。
我的问题:我有一堆包含不同数量弹珠的袋子。我想通过挑选袋子来最大化我获得的弹珠数量,但它们不能彼此相邻。
这就是我在电子表格中的内容:
如果我拿起两个相邻的行李,违规将= -1。
+------------+----+----+----+---+---+-------------+
| Bag Number | 1 | 2 | 3 | 4 | 5 | Total Value |
+------------+----+----+----+---+---+-------------+
| Value | 10 | 20 | 30 | 40| 50| 150|
| Choose | 0 | 0 | 0 | 0 | 0 | 0|
| Violation | 0 | 0 | 0 | 0 | | |
+------------+----+----+----+---+---+-------------+
最佳解决方案:
+------------+----+----+----+---+---+-------------+
| Bag Number | 1 | 2 | 3 | 4 | 5 | Total Value |
+------------+----+----+----+---+---+-------------+
| Value | 10 | 20 | 30 | 40| 50| 150|
| Choose | 1 | 0 | 1 | 0 | 1 | 90|
| Violation | 1 | -3 | 3 |-5 | | |
+------------+----+----+----+---+---+-------------+
我尝试了一些约束的组合:
我为自己解决了这个问题。这甚至可行吗?
答案 0 :(得分:3)
是的,问题很明确。
我建议采用不同的方式来制定邻接约束。特别是,我会使用以下内容:
choose_1 + choose_2 <= 1
choose_2 + choose_3 <= 1
choose_3 + choose_4 <= 1
choose_4 + choose_5 <= 1
这表明每对(1,2), (2,3), (3,4)
和(4,5)
中最多可以选择一个。它的优点是它不使用袋号,袋号通常可以是袋名(即字符串而不是数字)。它还有另一个好处:对于所有0 <= choose_i <= 1
,我们不需要将变量定义为二进制,而只需将其定义为连续的0到1之间:i = 1,...,5
。这是因为得到的约束矩阵是Totally Unimodular,这意味着求解二元问题的linear programming relaxation可以得到choose_i
都是0
或{{1
的最优解。 1}}。
以下是电子表格布局:
请注意,最好使用不同的颜色来区分变量(绿色),约束(红色)和数据(蓝色)。我还用绿色字体标记了目标单元格。
以下是公式:
这是求解器模型:
<强>解决方案强>:
请注意,矩阵完全是单模的事实是guarantee,最优解将具有二进制值。通常情况并非如此,我们需要将变量定义为二进制并求助于branch and bound。
我希望这会有所帮助。快乐的造型!