首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Accord.net的Cobyla优化约束

Accord.net的Cobyla优化约束
EN

Stack Overflow用户
提问于 2019-02-01 03:38:13
回答 1查看 288关注 0票数 0

定义的Accord.net Cobyla优化约束不像预期的那样工作

在vb.net中,我需要使用Accord.net Cobyla的方法来优化下面的excel表格计算。我正在测试总共4个变量:

代码语言:javascript
复制
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

约束的定义如下:

代码语言:javascript
复制
        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) 函数(X) x(i) >= 29) next}

或更好:

代码语言:javascript
复制
Dim f5 = {New NonlinearConstraint(NumberOfVariables, for i=0 to NumberOfVariables-1 
Function(x) aListofdoubles.contains(x(i)))
next}
EN

回答 1

Stack Overflow用户

发布于 2019-02-01 11:59:19

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

不是的。Cobyla表示连续变量。理论上,您可以使用约束。

代码语言:javascript
复制
x*(1-x) = 0

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

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

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

一般来说,我建议在开始编写代码之前,先用数学记录模型,然后再考虑一下数学模型。这通常有助于更好地理解问题。您似乎有一个基于某些Excel公式的函数。如果您想留在Excel中,最好使用Excel解决程序。此外,Excel解决程序还可以处理MINLP问题。否则,我建议提取基础数学,在Excel之外提出完整的问题,只与Excel交换数据(输入数据或解决方案数据)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54472546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档