【问题标题】:Excel Solver with non-adjacent cell constraint?具有非相邻单元格约束的 Excel 求解器?
【发布时间】:2014-07-24 23:32:17
【问题描述】:

我是 Excel 求解器的新手,只是在拿起一本数据科学书籍后才了解它。我想更熟悉这个工具,所以我一直在尝试解决不同的问题。我被困在一个,我什至不确定是否可以使用求解器?基本上,我需要检查的约束是两个单元格是否相邻。

我的问题:我有一堆装有不同数量弹珠的袋子。我想通过捡袋子来最大化我得到的弹珠数量,但它们不能彼此相邻。

这是我在电子表格中的内容:

  • 值 = 袋中弹珠的数量
  • Choose = 是否选择包(二进制)
  • 违规 = (Choose*Bag Number) of Bag 1 - (Choose*Bag Number) of Bag 2

如果我拿起两个相邻的包,违规将 = -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 和违规
  • 总目标值

我自己解决了这个问题。这甚至可行吗?

【问题讨论】:

    标签: excel solver


    【解决方案1】:

    是的,这个问题恰如其分。

    我会建议一种不同的方式来制定邻接约束。特别是,我会使用以下内容:

    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 和 1 之间:0 &lt;= choose_i &lt;= 1,对于所有 i = 1,...,5。这是因为得到的约束矩阵是Totally Unimodular,这意味着解决二元问题的linear programming relaxation会给出一个最优解,其中choose_i要么是0要么是1

    这是我的电子表格布局

    请注意,最好使用不同的颜色来区分变量(绿色)、约束(红色)和数据(蓝色)。我还用绿色字体标记了目标单元格。

    以下是公式

    这是求解器模型

    解决方案

    请注意,矩阵完全是单模的这一事实是guarantee,即最优解将具有二进制值。一般来说,这不是真的,我们需要将变量定义为二进制并求助于branch and bound

    我希望这会有所帮助。快乐的建模!

    【讨论】:

    • 哇,太棒了!很好的解释,感谢您的链接!
    猜你喜欢
    • 2016-10-09
    • 2015-04-02
    • 2017-11-09
    • 2011-09-09
    • 2016-12-09
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多