Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
Excel 将最佳值设置为位于任何给定的指定值中_Excel_Optimization_Solver_Vba - Fatal编程技术网

Excel 将最佳值设置为位于任何给定的指定值中

Excel 将最佳值设置为位于任何给定的指定值中,excel,optimization,solver,vba,Excel,Optimization,Solver,Vba,我正在使用开放解算器来解决一个优化问题。问题如下: 假设我在给定总成本约束和输入可用性的情况下优化输入。我们有投入成本,希望将成本降到最低。另一个约束是优化的输入落在任何设置值中,例如input11、input12、input13和input14。此离散输入范围因输入而异 因此,我们有3个限制: 预算 每个输入和输出的输入容量 输入应属于四个选项中的任何一个 我创建的代码部分: Sub TestOpensolver() Dim TestSheet As Worksheet Set TestSh

我正在使用开放解算器来解决一个优化问题。问题如下:

假设我在给定总成本约束和输入可用性的情况下优化输入。我们有投入成本,希望将成本降到最低。另一个约束是优化的输入落在任何设置值中,例如input11、input12、input13和input14。此离散输入范围因输入而异

因此,我们有3个限制:

  • 预算
  • 每个输入和输出的输入容量
  • 输入应属于四个选项中的任何一个
  • 我创建的代码部分:

    Sub TestOpensolver()
    
    Dim TestSheet As Worksheet
    Set TestSheet = Worksheets("Optimized_Results")
    
        OpenSolver.ResetModel Sheet:=TestSheet
    
        'Objective Definition
        OpenSolver.SetObjectiveFunctionCell TestSheet.Range("AC3"), Sheet:=TestSheet
        OpenSolver.SetObjectiveSense MinimiseObjective, Sheet:=TestSheet
    
        'Variables Definition
        OpenSolver.SetDecisionVariables TestSheet.Range("AK3:AK8"), Sheet:=TestSheet
        OpenSolver.SetDecisionVariables TestSheet.Range("AQ3:AR8"), Sheet:=TestSheet
    
        ' Constraints       
    
        OpenSolver.AddConstraint TestSheet.Range("AK3:AK8"), RelationLE, TestSheet.Range("W3:W8"), Sheet:=TestSheet
        OpenSolver.AddConstraint TestSheet.Range("AK3:AK8"), RelationGE, TestSheet.Range("X3:X8"), Sheet:=TestSheet
    
    
        OpenSolver.AddConstraint TestSheet.Range("AS3:AS8"), RelationLE, TestSheet.Range("AT3:AT8"), Sheet:=TestSheet
    
    
        OpenSolver.RunOpenSolver , False
    
    
    
    End Sub
    
    谁能帮我解决这个问题吗


    谢谢大家!

    “或”条件通常意味着我们需要使用二进制变量,例如:

    input1 = input11*y11 + input12*y12 + input13*y13 + input14*y14
    y11+y12+y13+y14 <= 1
    y11,y12,y13,y14 binary variables
    
    input1=input11*y11+input12*y12+input13*y13+input14*y14
    
    y11+y12+y13+y14谢谢您的回答。但这不是我要找的。假设没有额外的约束,我得到input1的值10。但我希望优化的输入1是9或11或14或16。10是不可接受的值。所以输入1个额外的约束,应该取[9,11,14,16]中的任意一个。希望我能澄清这个问题。我对使用解算器解决优化问题是个新手。所以我发现更简单的答案很难解决。我很难写出你建议的答案。我正在更新我到目前为止所做的工作。如果你能进一步帮助。非常感谢。我想你没有注意到y是二进制变量。我正在对2组变量进行优化,I)二级)二进制变量。所以我把所有的二进制文件都设为1,并把“和”比“二进制常数”小。如果我在这里出错,请告诉我我不知道你在说什么。“将变量设为1”?不知道这意味着什么,没有时间写一个答案,但我认为这非常接近你想要实现的目标,尽管它没有使用opensolver。@OldTumble:谢谢你的建议。我根据你的建议找到了一些答案。但是需要更多的测试。而且,它在“开放解算器”中不起作用。我需要在OpenSolver上运行它,因为优化问题很大,excel solver无法解决它。但再次感谢你给我指路!现在,这听起来像是一个快速破解,但由于您是从VBA运行解算器,您可以在for循环中针对四个不同的等式约束分别运行解算器,并从四个等式约束中选择最佳答案。