Vb.net Accord.net';s-Cobyla优化约束
Accord.net Cobyla优化的定义约束未按预期工作 我需要使用Accord.net Cobyla的方法在vb.net中优化以下excel工作表计算。我使用总共4个变量进行测试:Vb.net Accord.net';s-Cobyla优化约束,vb.net,optimization,constraints,accord.net,Vb.net,Optimization,Constraints,Accord.net,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 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={新的非线性约束(NumberOfVariables,对于i=0到NumberOfVariables-1
函数(x)x(i)>=29) 下一个}
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交换数据(输入或解决方案数据)。我使用“System.Diagnostics.Debug.WriteLine”检查每个x(I)的值:它们不完全相同,但可以关闭!有没有办法改变这一点?谢谢你的回复。关于约束没有得到尊重的任何想法:我输入“x(I)>=29”,但它实际上是“x(I)我不知道Accord对这些约束做了什么。Cobyla本身是一个著名的解算器。它不是最先进的,但在梯度很难获得时它会很有用。Cobyla只支持
=
不等式(还请注意,Cobyla直接支持决策变量的上下限。我不知道如何一致地指定它们,但Cobyla肯定支持它们。您将边界指定为一般不等式约束。我认为这可能是问题的原因。