首页 > 解决方案 > Accord.net 的 Cobyla 优化约束

问题描述

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)
}

或更好:

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

标签: vb.netoptimizationconstraintsaccord.net

解决方案


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

不,Cobyla 适用于连续变量。理论上你可以使用约束

x*(1-x) = 0

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

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

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

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


推荐阅读