首页 > 解决方案 > 如何使用具有二进制约束的求解器插件

问题描述

我试图找到包含公式的单元格的最大可能值。公式的结果取决于一些二进制值。我创建了一个示例。这是一个简单得多的工作簿,但它有所有相同的问题。

截屏

在屏幕截图中:

我编写了三个宏来查找单元格 E2 中的最大值:

每次运行宏时,我都会将二进制值重置为原始值(例如,如图所示)。

宏“Maximise10”应返回值 100:

Sub Maximise10()
    Dim CellToChange, CellToSolve As String

    Sheets("Example").Select
    CellToChange = "C2:C11"
    CellToSolve = "E2"
    
    SolverReset
    SolverOptions Precision:=0.1, Convergence:=0.5
    SolverOK SetCell:=Range(CellToSolve), MaxMinVal:=1, ByChange:=Range(CellToChange), Engine:=3
    SolverAdd CellRef:=Range(CellToChange), Relation:=5
    SolverSolve UserFinish:=True
        
End Sub

宏“Maximise2”应返回值 28:

Sub Maximise2()
    Dim CellToChange, CellToSolve As String

    Sheets("Example").Select
    CellToChange = "C2:C3"
    CellToSolve = "E2"
    
    SolverReset
    SolverOptions Precision:=0.1, Convergence:=0.5
    SolverOK SetCell:=Range(CellToSolve), MaxMinVal:=1, ByChange:=Range(CellToChange), Engine:=3
    SolverAdd CellRef:=Range(CellToChange), Relation:=5
    SolverSolve UserFinish:=True
        
End Sub

宏“Maximise1”应返回值 19:

    Sub Maximise1()
    Dim CellToChange, CellToSolve As String

    Sheets("Example").Select
    CellToChange = "C2"
    CellToSolve = "E2"
    
    SolverReset
    SolverOptions Precision:=0.1, Convergence:=0.5
    SolverOK SetCell:=Range(CellToSolve), MaxMinVal:=1, ByChange:=Range(CellToChange), Engine:=3
    SolverAdd CellRef:=Range(CellToChange), Relation:=5
    SolverSolve UserFinish:=True
        
End Sub

我只能通过“进化”方法获得结果。在求解器选项中,我尝试调整:

上面的代码已经提供了最好的结果,但结果却不尽如人意。

我非常感谢一些帮助,以确定如何最好地配置求解器插件,以确保它只考虑整数值,以最快、最有效的方式确定最大值。

标签: excelvbabinaryconstraintssolver

解决方案


你的情况:

=IF(C2=0,A2,IF(C2=1,B2,0))

相当于

=IF(C2=0,A2,B2)

由于 Solver 的 Simplex 方法不喜欢 IF 函数,我们可以将其重写为:

=(1-C2)*A2+C2*B2

这是变量的线性函数,因此 Simplex 方法将起作用。虽然将 Integer Optimality 选项更改为 0%。在示例中,最优解是目标函数值为 100。


推荐阅读