Ограничения оптимизации Accord.net Cobyla - PullRequest
0 голосов
/ 01 февраля 2019

Определенные ограничения для оптимизации 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 до NumberOfVariables-1
    Функция (x) x (i)> = 29) следующая}

или лучше:

Dim f5 = {New NonlinearConstraint(NumberOfVariables, for i=0 to NumberOfVariables-1 
Function(x) aListofdoubles.contains(x(i)))
next}

1 Ответ

0 голосов
/ 01 февраля 2019

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

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

x*(1-x) = 0

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

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

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

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

...