在使用 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
输入。思路是:
- 您打开 VBE 编辑器并向您的工作簿添加一个模块;
你插入你的"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()
函数,其余所有独立。
我有一个 monte carlo 仿真模型,我需要将其中一个参数(服务级别)设置为至少 95%。问题是,据我所知,当 Solver 运行时,它会尝试不同的解决方案,但由于 RAND() 函数,目标单元格一直在变化。有什么办法可以解决这个问题吗?禁止 RAND() 暂时改变?我试图将计算切换为手动,但这不起作用,因为目标单元格根本不会更新。感谢您的帮助,谢谢!
根据求解器的original authors,它旨在使用Excel的内置逻辑来确定需要重新计算的内容。这意味着在每一步,求解器都会调整一个值,然后要求 Excel 重新计算。在那个时间点,Rand
函数将 运行,因为它们是易变的。
我建议将随机生成的数字硬编码到 sheet(特殊粘贴 -> 值)中,然后 运行 求解器,然后调用Rand
返回,一旦你的模型被校准。
您可能要做的是创建您自己的 =RAND()
函数(我们称之为 MYRAND()
函数),它接受 ON/OFF
输入。思路是:
- 您打开 VBE 编辑器并向您的工作簿添加一个模块;
你插入你的"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()
函数,其余所有独立。