Оптимизация Accord.net Cobyla Ограничения

Определенные ограничения для оптимизации Accord.net Cobyla не работают должным образом

Мне нужно оптимизировать следующий расчет листа Excel в vb.net, используя метод Accord.net Cobyla. Я тестирую в общей сложности 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)
}
  • Во-первых, я ожидаю, что все переменные x(i), введенные на листе Excel, будут иметь разные значения, но все они идентичны.
  • Во-вторых, я ожидаю, что оптимизатор начнет с x(i)>=29, но он начинается с 0 и заканчивается на 29.
  • Кроме того, есть ли способ ограничить x (i) целыми числами в нелинейных ограничениях?
  • Количество переменных/ограничений на самом деле может быть изменено, я могу управлять переменным числом x(i), но я все еще ищу способ получить переменное количество ограничений. Если что-то вроде кода ниже:

    Dim f5 = {Новое нелинейное ограничение (NumberOfVariables, для 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}

person ンドング 一信 ndong    schedule 01.02.2019    source источник
comment
Я использовал System.Diagnostics.Debug.WriteLine для проверки значений каждого x(i): они не идентичны, но близки! есть ли способ изменить это?   -  person ンドング 一信 ndong    schedule 01.02.2019


Ответы (1)


Я могу ответить на этот вопрос: "есть ли способ ограничить x(i) целыми числами в нелинейных ограничениях"

Нет. Cobyla предназначена для непрерывных переменных. Теоретически вы можете использовать ограничение

x*(1-x) = 0

чтобы заставить x быть двоичной переменной. На практике это не работает.

Для задачи NLP с целочисленными ограничениями вам действительно нужен решатель MINLP (или используйте такие приемы, как линеаризация или кусочно-линейные функции).

Я не понимаю вашу модель. Большинство ваших «нелинейных ограничений» выглядят точно так же, как границы. Это линейные. Конечно, я понятия не имею, что происходит в части Excel.

В общем, я бы порекомендовал записать модель по математике и немного подумать о математической модели, прежде чем начинать кодировать. Часто это помогает лучше понять проблему. Кажется, у вас есть функция, основанная на некоторых формулах Excel. Если вы хотите остаться в Excel, может быть лучше использовать решатель Excel. Кроме того, решатель Excel может обрабатывать проблемы MINLP. В противном случае я предлагаю извлечь базовую математику и сформулировать полную проблему вне Excel и обмениваться данными (входными данными или данными решения) только с Excel.

person Erwin Kalvelagen    schedule 01.02.2019
comment
Спасибо за ответ Эрвин. Любая идея о несоблюдении ограничений: я ввожу x(i)›=29, но на самом деле x(i)‹=29. это потому, что я использую линейные ограничения в задаче НЛП? или это просто поведение, характерное для библиотеки Accord.net? - person ンドング 一信 ndong; 04.02.2019
comment
Я не знаю, что Аккорд делает с этими ограничениями. Cobyla сама по себе является известным решателем. Это не самая современная технология, но она может быть полезна, когда трудно найти градиенты. Cobyla поддерживает только >= неравенства (<=ограничения должны умножаться на -1). Я предполагаю, что вы проверили код возврата. Я предлагаю начать с небольших тестовых случаев без Excel и посмотреть, сможете ли вы воспроизвести это поведение. - person Erwin Kalvelagen; 04.02.2019
comment
Также обратите внимание, что Cobyla напрямую поддерживает нижние и верхние границы переменных решения. Я не знаю, как указать их в Accord, но Cobyla их точно поддерживает. Вы задаете границы как ограничения общего неравенства. Я думаю, что это может быть причиной проблемы. - person Erwin Kalvelagen; 04.02.2019