我需要使用 Solver 在 Excel 中设计一个流程布局。我有一列值,我已将其指定为“通过更改单元格”,并且应该更改这些值以找到最小结果。问题是,我需要切换它们的位置,而不是更改这些值,直到找到最佳组合。
如何在 Solver 中或使用一些 Excel 魔法来指定我需要交换值但不覆盖,因为这种方法总是在各处返回 0?
也许我可以使用一个数学上合理的约束来阻止这些值的改变?
答案1
给定交换约束,您真正要问的是:在一组值的所有重新排序中,这些值的哪种排列可以最小化目标函数?
可以构造此问题,以便 Solver 找到解决方案。关键是使用值的顺序,而不是值本身,因为 Solver 会改变量以找到目标函数的最小值。Solver 有一个内置机制来排列这些值。
下图显示了一个说明性示例的工作表设置。
单元格
A4:A7
保存需要重新排序以找到最小值的值。单元格
C4:C7
保存这些值的初始行顺序 - 这些值C4:C7
将由规划求解改变。中的公式
E4:E7
查找与 中A4:A7
的行顺序相对应的值C4:C7
。单元格 C9 包含在我的示例中将最小化的公式 - 请注意,该公式取决于中的值
E4:E7
,而不是中的值A4:A7
。
接下来是问题的求解器设置。在这里,您需要将单元格的约束设置C4:C7
为, AllDifferent
并将求解方法设置为Evolutionary
。
要将 的约束设置为C4:C7
,请从“添加约束”对话框的下拉列表中AllDifferent
选择该选项。(请参阅dif
此链接有关 Solver 中可用的特殊约束选项的有益讨论。)
我发现没有必要摆弄求解方法的可选设置,例如,对解决方案搜索设置时间限制或迭代限制。仅使用四个变量单元格和一个非常简单的目标函数,规划求解只需几秒钟就能找到解决方案。产生最小解决方案的行顺序显示在中C4:C7
,值的顺序显示在中E4:E7
。