定义的Accord.net Cobyla优化约束不像预期的那样工作
在vb.net中,我需要使用Accord.net Cobyla的方法来优化下面的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}发布于 2019-02-01 11:59:19
我可以回答这个问题:“有没有办法将x(i)限制在非线性约束下的整数”
不是的。Cobyla表示连续变量。理论上,您可以使用约束。
x*(1-x) = 0强制x成为二进制变量。在实践中,这是行不通的。
对于具有整数约束的NLP问题,您确实需要MINLP求解器(或者使用诸如线性化或分段线性函数之类的技巧)。
我不明白你的模特。大多数“非线性约束”看起来就像边界。这些都是线性的。当然,我不知道Excel部分中发生了什么。
一般来说,我建议在开始编写代码之前,先用数学记录模型,然后再考虑一下数学模型。这通常有助于更好地理解问题。您似乎有一个基于某些Excel公式的函数。如果您想留在Excel中,最好使用Excel解决程序。此外,Excel解决程序还可以处理MINLP问题。否则,我建议提取基础数学,在Excel之外提出完整的问题,只与Excel交换数据(输入数据或解决方案数据)。
https://stackoverflow.com/questions/54472546
复制相似问题