在使用 rand() 函数的单元格上使用规划求解加载项

Using Solver add-in with on cells that use the rand() function

我有一个 monte carlo 仿真模型,我需要将其中一个参数(服务级别)设置为至少 95%。问题是,据我所知,当 Solver 运行时,它会尝试不同的解决方案,但由于 RAND() 函数,目标单元格一直在变化。有什么办法可以解决这个问题吗?禁止 RAND() 暂时改变?我试图将计算切换为手动,但这不起作用,因为目标单元格根本不会更新。感谢您的帮助,谢谢!

根据求解器的original authors,它旨在使用Excel的内置逻辑来确定需要重新计算的内容。这意味着在每一步,求解器都会调整一个值,然后要求 Excel 重新计算。在那个时间点,Rand 函数将 运行,因为它们是易变的。

我建议将随机生成的数字硬编码到 sheet(特殊粘贴 -> 值)中,然后 运行 求解器,然后调用Rand 返回,一旦你的模型被校准。

您可能要做的是创建您自己的 =RAND() 函数(我们称之为 MYRAND() 函数),它接受 ON/OFF 输入。思路是:

  1. 您打开 VBE 编辑器并向您的工作簿添加一个模块;
  2. 你插入你的"Random on/off function",像这样:

    Public Function MYRAND(ByVal activation As String) As Double
    Application.Volatile
    If activation = "ON" Then
        MYRAND = Rnd()
    Else
        MYRAND = Application.Caller.Value
    End If
    End Function
    

现在,您可以将包含 "ON/OFF" 的列表框放入单元格(假设为 A1)并将其引用到像 =MYRAND(A1) 这样的单元格中。从现在开始,如果 A1 的值为 ON,该函数将 return 您期望从 =RAND() 函数获得的经典结果。但是,如果它位于 OFF,在这种情况下,它将跳过计算并让先前的值进入。

像这样,您将模拟 Calculation Manual/Automatic 的效果,但仅将其应用于 RAND() 函数,其余所有独立。