【问题标题】:Accord.net's Cobyla optimization ConstraintsAccord.net 的 Cobyla 优化约束
【发布时间】:2019-06-25 14:53:12
【问题描述】:

为 Accord.net Cobyla 的优化定义的约束没有按预期工作

我需要使用 Accord.net Cobyla 的方法在 vb.net 中优化以下 excel 表计算。我正在测试总共 4 个变量:

Dim f1 As Func(Of Double(), Double) = Function(x)


                                              Dim var1 As New ArrayList
                                              Dim objsheets As Excel.Sheets = Nothing
                                              Dim app2 As Excel.Application = TryCast(Marshal.GetActiveObject("Excel.Application"), Excel.Application)
                                              'Access excel sheet
                                              file = "C:\kws_work\Blade.xlsx"
                                              books = app2.Workbooks
                                              objsheet = books(1).Sheets(2)

                                              'fill target cells-x0[ind] with variables x[ind]
                                              For ind = 0 To x.Count - 1

                                                  objsheet.Range(x0(ind)).Value = CInt(x(ind))
                                              Next
                                              Dim res As Double
                                              res = objsheet.Range("_res1").Value
                                              'Return the calculated value to optimizer
                                              Return (res)
                                          End Function

约束定义如下:

        Dim f5 = {New NonlinearConstraint(4, Function(x) x(0) >= 29),
        New NonlinearConstraint(4, Function(x) x(1) >= 29),
        New NonlinearConstraint(4, Function(x) x(2) >= 29),
        New NonlinearConstraint(4, Function(x) x(3) >= 29)
}
  • 首先,我希望在 Excel 工作表中输入的所有变量 x(i) 具有不同的值,但它们都是相同的。
  • 其次,我希望优化器从 x(i)>=29 开始,但它从 0 开始,在 29 结束。
  • 此外,有没有办法将 x(i) 限制为非线性约束中的整数
  • 变量/约束的数量实际上会发生变化,我可以管理x(i)的变量数量,但我仍在寻找一种方法来获得变量数量的约束。如果像下面的代码:

    Dim f5 = {New NonlinearConstraint(NumberOfVariables, for i=0 to NumberOfVariables-1
    函数(x) x(i) >= 29) 下一个}

或更好:

Dim f5 = {New NonlinearConstraint(NumberOfVariables, for i=0 to NumberOfVariables-1 
Function(x) aListofdoubles.contains(x(i)))
next}

【问题讨论】:

  • 我使用“System.Diagnostics.Debug.WriteLine”来检查每个 x(i) 的值:它们不相同,但可以关闭!有没有办法改变这种情况?

标签: vb.net optimization constraints accord.net


【解决方案1】:

我可以回答这个问题: "有没有办法将 x(i) 限制为非线性约束中的整数"

没有。 Cobyla 用于连续变量。理论上你可以使用约束

x*(1-x) = 0

强制x 成为二进制变量。在实践中这是行不通的。

对于具有整数约束的 NLP 问题,您确实需要一个 MINLP 求解器(或使用线性化或分段线性函数等技巧)。

我不明白你的模型。您的大多数“非线性约束”看起来就像界限。那些是线性的。当然我不知道 Excel 部分发生了什么。

一般来说,我建议在开始编码之前用数学写下模型并考虑一下数学模型。这通常有助于更好地理解问题。你似乎有一个基于一些 Excel 公式的函数。如果您想留在 Excel 中,使用 Excel 求解器可能会更好。此外 Excel 求解器可以处理 MINLP 问题。否则,我建议提取基础数学并在 Excel 之外制定完整的问题,并且仅与 Excel 交换数据(输入或解决方案数据)。

【讨论】:

  • 感谢欧文的回复。关于不遵守约束的任何想法:我输入“x(i)>=29”,但它实际上是“x(i)
  • 我不知道雅阁对这些限制做了什么。 Cobyla 本身就是一个著名的求解器。它不是最先进的,但当梯度难以获得时它会很有用。 Cobyla 仅支持 >= 不等式(<=constraints 必须乘以 -1)。我假设您检查了返回码。我建议从一些较小的测试用例开始,不使用 Excel,看看是否可以重现此行为。
  • 另请注意,Cobyla 直接支持决策变量的下限和上限。我不知道如何在 Accord 中指定它们,但 Cobyla 肯定支持它们。您将边界指定为一般不等式约束。我认为这可能是问题的原因。
猜你喜欢
  • 2016-11-16
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2021-12-28
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多