Я действительно новичок в CVXPY. Я пытаюсь решить проблему 8 ферзей, то есть проблему размещения 8 шахматных ферзей на шахматной доске 8 х 8, чтобы никакие две королевы не угрожали друг другу. Насколько я понимаю, ограничения должны быть:
Кроме того, целевой функцией должно быть: максимизировать 2-норму матрицы (чтобы мы получили только 1 и 0, потому что мы можем получить сумму 1 также с float
s, но норма 1 с нулями больше, чем норма плавает от 0 до 1, что также в сумме до 1 (например: 0,8 ^ 2 + 0,2 ^ 2 <1 ^ 2 + 0 ^ 2).
Можно ли решить эту проблему в CVXPY? Я совершенно не понимаю, как сформировать ограничения и целевую функцию в CVXPY, но вот мои первоначальные первоначальные попытки (я сразу получил "Ошибка DCP", поэтому у меня не было причин продолжать, но все же):
from cvxpy import *
x=Variable(shape=(9,9), name='board')
obj = Maximize(norm(x))
const = [sum(x, axis=1)==1]
prob=Problem(objective=obj,constraints=const)
prob.solve()
Любая помощь будет оценена !!!
Как я уже сказал в комментариях:
Maximize(norm(x))
делает проблему невыпуклой. CVXPY только для выпуклых задач.
Проблемы с 8 ферзями обычно моделируются двоичными переменными (ссылка). Вы пытаетесь использовать невыпуклую цель, чтобы обойти это. В общем, это не работает:
Как правило, сложная дискретная проблема не может быть "легко решаемой" при помощи трюков. Другой такой трюк заключается в использовании ограничения x(1-x)=0
. Это страдает от той же проблемы: вам нужен глобальный решатель для сложной невыпуклой задачи. Так что лучше придерживаться линейной формулировки с бинарными переменными. Если бы существовал простой способ сделать это выпуклым и непрерывным, то, по сути, разработчики MIP-решателей были бы вне бизнеса. С другой стороны, если вы обнаружите такую трансформацию, я уверен, что вас ждет Нобелевская премия.
Также, как указано в комментариях, обратите внимание, что
3. sum of each diagonal equals to 1.
должен прочесть
3. sum of each diagonal <= 1.
Maximize(norm(x))
делает проблему невыпуклой. CVXPY только для выпуклых задач.