vb.net - 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)
}
- 首先,我希望 Excel 表中输入的所有变量 x(i) 具有不同的值,但它们都是相同的。
- 其次,我希望优化器从 x(i)>=29 开始,但它从 0 开始,在 29 结束。
- 此外,有没有办法将 x(i) 限制为非线性约束中的整数
变量/约束的数量实际上会发生变化,我可以管理 x(i) 的可变数量,但我仍在寻找一种方法来获得可变数量的约束。如果像下面的代码:
Dim f5 = {New NonlinearConstraint(NumberOfVariables, for i=0 to NumberOfVariables-1
Function(x) x(i) >= 29) next}
或更好:
Dim f5 = {New NonlinearConstraint(NumberOfVariables, for i=0 to NumberOfVariables-1
Function(x) aListofdoubles.contains(x(i)))
next}
解决方案
我可以回答这个问题:“有没有办法将 x(i) 限制为非线性约束中的整数”
不,Cobyla 适用于连续变量。理论上你可以使用约束
x*(1-x) = 0
强制x
成为二进制变量。在实践中这是行不通的。
对于具有整数约束的 NLP 问题,您确实需要一个 MINLP 求解器(或使用线性化或分段线性函数等技巧)。
我不明白你的模型。您的大多数“非线性约束”看起来就像界限。那些是线性的。当然,我不知道 Excel 部分发生了什么。
一般来说,我建议用数学写下模型,并在开始编码之前稍微考虑一下数学模型。这通常有助于更好地理解问题。你似乎有一个基于一些 Excel 公式的函数。如果您想留在 Excel 中,使用 Excel 求解器可能会更好。此外 Excel 求解器可以处理 MINLP 问题。否则,我建议提取基础数学并在 Excel 之外制定完整的问题,并且仅与 Excel 交换数据(输入或解决方案数据)。
推荐阅读
- angular - SVG 图标在开发模式下显示,但在生产模式下不显示
- ip-geolocation - 像 Airbnb 这样的网站如何在未经我同意的情况下知道我的位置?
- javascript - Select2 多值选择框无法在 CI 中加载数据
- javascript - Node.js mssql 返回记录集
- flutter - 创建没有重叠边框的框行
- azure - AzCopy 未知 /source 命令
- jquery - Chrome Throwing 无法使用“in”运算符搜索“length”
- python - Python网络刮刀打印“无”,我该如何解决?
- networking - nmap 使用默认端口检测服务名称,使用不同的端口呢?
- postgresql - 在 asp.net 核心身份中,无需重置密码即可将用户凭据传输到不同的数据库?