Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA解算器不喜欢注意约束_Vba_Excel_Excel 2010 - Fatal编程技术网

VBA解算器不喜欢注意约束

VBA解算器不喜欢注意约束,vba,excel,excel-2010,Vba,Excel,Excel 2010,我一直在努力使VBA中的解算器能够很好地处理具有命名范围的GRG非线性问题。它一直在忽略二进制约束。试图跟踪其他有类似问题的帖子的尝试失败了 Sub Solver() ' ' Solver Macro ' For solving once we have the data ' SolverReset 'Clearing out the old solver data, allows for named ranges to be used SolverAdd Ce

我一直在努力使VBA中的解算器能够很好地处理具有命名范围的GRG非线性问题。它一直在忽略二进制约束。试图跟踪其他有类似问题的帖子的尝试失败了

Sub Solver()
'
' Solver Macro
' For solving once we have the data
'

    SolverReset
       'Clearing out the old solver data, allows for named ranges to be used

    SolverAdd CellRef:=Range("VariableRange"), Relation:=1, FormulaText:=Range("One")
    ' Previous advice has been to used a range that ='s 1, as that can sometimes make things work. Part A
    SolverAdd CellRef:=Range("VariableRange"), Relation:=3, FormulaText:="0"
    'Part B
    SolverAdd CellRef:=Range("VariableRange"), Relation:=4, FormulaText:="integer"
    'Parts A and B along with this part are supposed to mimic the binary setting, in an attempt to get things working.

    SolverAdd CellRef:="$D$1", Relation:=1, FormulaText:="$D$2"
    'D2 is my limit that D1 needs to stay inside of.
    SolverAdd CellRef:="$D$1", Relation:=3, FormulaText:="-$D$2"
    'Could probably include an ABS on D1 to reduce VBA-ness. Either way, needs to fall within D2

    SolverOk SetCell:="$A$1", MaxMinVal:=1, ValueOf:=0, ByChange:=Range("VariableRange"), _
        Engine:=1, EngineDesc:="GRG Nonlinear"
        'And now we TRY to solve

        SolverSolve UserFinish:=True
        'I don't want to have to confirm to keep the results
        SolverFinish KeepFinal:=1
        'And I'd like to keep the results!

End Sub
我的研究使我与其他线索一起偶然发现。我试过了那条线索里的每一种组合,但都一无所获


值得注意的是:我还尝试了一种手动方法来强制二进制-sumproduct(range)=sum(range)必须为true-但这只会将所有内容生成为0,这是无用的

我通过执行求解器两次而不是一次来实现它:

SolverOk SetCell:="$A$1", MaxMinVal:=1, ValueOf:=0, ByChange:=Range("VariableRange"), _
    Engine:=1, EngineDesc:="GRG Nonlinear"
    'And now we TRY to solve

    SolverSolve UserFinish:=True
    'I don't want to have to confirm to keep the results
    SolverSolve UserFinish:=True
    'This second iterations solves it correctly
    SolverFinish KeepFinal:=1
    'And I'd like to keep the results!

我通过执行解算器两次而不是一次使其工作:

SolverOk SetCell:="$A$1", MaxMinVal:=1, ValueOf:=0, ByChange:=Range("VariableRange"), _
    Engine:=1, EngineDesc:="GRG Nonlinear"
    'And now we TRY to solve

    SolverSolve UserFinish:=True
    'I don't want to have to confirm to keep the results
    SolverSolve UserFinish:=True
    'This second iterations solves it correctly
    SolverFinish KeepFinal:=1
    'And I'd like to keep the results!

$D$1
可变范围的元素吗?如果不是,我看不出
$D$1
如何成为解算器解决方案空间的一部分。如果是,则约束可能存在冲突。举一个简单的例子,您的代码在我手中运行(在约束中找到的最大值)。$D$1=sumproduct(我正在处理的列*变量范围),其中变量范围是我正在处理的列的偏移量。基本上,我有一列数字。我需要找出哪一个,如果有的话,是数字的组合。所以-20,20,100和300应该给我-20和20的组合。但是,如果我有-20、-40、-50、100和40,我希望返回-20、-40、-50和100作为解决方案,而不是-40和40,因为这会清除更多的数字。奇怪的是,进化论是有约束的。但是如果我换成GRG非线性,它会坏得很厉害。
$D$1
可变范围的一个元素吗?如果不是,我看不出
$D$1
如何成为解算器解决方案空间的一部分。如果是,则约束可能存在冲突。举一个简单的例子,您的代码在我手中运行(在约束中找到的最大值)。$D$1=sumproduct(我正在处理的列*变量范围),其中变量范围是我正在处理的列的偏移量。基本上,我有一列数字。我需要找出哪一个,如果有的话,是数字的组合。所以-20,20,100和300应该给我-20和20的组合。但是,如果我有-20、-40、-50、100和40,我希望返回-20、-40、-50和100作为解决方案,而不是-40和40,因为这会清除更多的数字。奇怪的是,进化论是有约束的。但如果我换成GRG非线性,它会坏得很厉害。