Как решить проблему 8 ферзей с CVXPY?

1

Я действительно новичок в CVXPY. Я пытаюсь решить проблему 8 ферзей, то есть проблему размещения 8 шахматных ферзей на шахматной доске 8 х 8, чтобы никакие две королевы не угрожали друг другу. Насколько я понимаю, ограничения должны быть:

  1. сумма каждой строки равна 1.
  2. сумма каждого столбца равна 1.
  3. сумма каждой диагонали равна 1.
  4. все переменные должны быть больше 0.

Кроме того, целевой функцией должно быть: максимизировать 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()

Любая помощь будет оценена !!!

  • 0
    сумма каждой диагонали равна 1 Не так. Некоторые диагонали останутся пустыми, с суммой 0.
  • 2
    Maximize(norm(x)) делает проблему невыпуклой. CVXPY только для выпуклых задач.
Теги:
optimization
mathematical-optimization
n-queens
cvxpy

1 ответ

2

Как я уже сказал в комментариях:

Maximize(norm(x)) делает проблему невыпуклой. CVXPY только для выпуклых задач.

Проблемы с 8 ферзями обычно моделируются двоичными переменными (ссылка). Вы пытаетесь использовать невыпуклую цель, чтобы обойти это. В общем, это не работает:

  • Выпуклые решатели не примут вашу проблему
  • Местные решатели НЛП окажутся в локальном оптимуме
  • Таким образом, требуется глобальный решатель НЛП (например, Baron, Antigone или Couenne). Но это не проще, чем использовать линейный MIP-решатель.

Как правило, сложная дискретная проблема не может быть "легко решаемой" при помощи трюков. Другой такой трюк заключается в использовании ограничения x(1-x)=0. Это страдает от той же проблемы: вам нужен глобальный решатель для сложной невыпуклой задачи. Так что лучше придерживаться линейной формулировки с бинарными переменными. Если бы существовал простой способ сделать это выпуклым и непрерывным, то, по сути, разработчики MIP-решателей были бы вне бизнеса. С другой стороны, если вы обнаружите такую трансформацию, я уверен, что вас ждет Нобелевская премия.

Также, как указано в комментариях, обратите внимание, что

3. sum of each diagonal equals to 1.

должен прочесть

3. sum of each diagonal <= 1.
  • 0
    спасибо за ссылку. Есть ли способ в cvxpy, чтобы заставить переменные быть 0 или 1?
  • 0
    Да, CVXPY поддерживает двоичные переменные и решатели MIP (см. Документацию ). Таким образом, вы можете просто сформулировать линейные модели MIP (они выпуклые по своей природе, поэтому CVXPY не будет жаловаться на невыпуклости).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню