Vb.net Accord.net';s-Cobyla优化约束

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

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={新的非线性约束(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肯定支持它们。您将边界指定为一般不等式约束。我认为这可能是问题的原因。