Как кодировать ограничения сравнения массивов в cvxopt
Я хочу использовать python software cvxopt для решения небольшой проблемы с тестированием, которую я имею (если программное обеспечение способно решить эту проблему, мой босс сможет использовать ее в будущем проекте). Тем не менее, мне трудно понять из документации, как я могу кодировать некоторые ограничения, которые не имеют форму Ax = b или Ax Постановка задачи такова:
x - это пустой массив (1-d). Найдите массив y такой, что: Я вижу, как можно выполнить условия кодирования (3) и (4), но как я могу кодировать условие (2)? Спасибо христианин(1) We minimize ||x-y||^2
(2) y is increasing throughout (y[k] <= y[k+1] for all k)
(3) the last element of y = the last element of x
(4) y[0] >= 0
1 ответ
Первое замечание: нет A<b
только в (непрерывной) выпуклой оптимизации A<=b
,
Ваше условие (2) - это просто попарное ограничение на соседей, например:
y[0] <= y[1]
y[1] <= y[2]
....
Чтобы привести его в стандартную форму:
y[0] <= y[1]
<=>
y[0] - y[1] <= 0
Теперь вы можете использовать A<=b
формулировка:
A:
1 -1 0 0 ... meaning: y[0] <= y[1]
0 1 -1 0 ... y[1] <= y[2]
0 0 1 -1 ...
b:
0
0
0
...
Если вы не используете возможности cvxopt для настройки KKT-расчетов и соавторов. я настоятельно рекомендую использовать cvxpy (из того же учебного заведения), который намного проще в использовании, включая множество функций, таких как norm(x-y, 2)
и многое другое.... Он также может использовать cvxopt в качестве решателя при необходимости (но также и другие решатели с открытым исходным кодом, такие как ECOS, SCS).