Планирование классов для логической выполнимости [сокращение за полиномиальное время]

У меня есть теоретическая / практическая проблема, и я пока не знаю, как ею управлять. Вот она:

Я создаю решатель SAT, способный найти существующую модель и доказать противоречие. когда это не относится к проблемам CNF в C с использованием генетических алгоритмов.

Задача SAT выглядит примерно так: введите описание изображения здесьМоя цель - использовать этот решатель для найти решения для множества различных проблем NP-complete. По сути, я перевожу различные задачи в SAT, решаю SAT с помощью своего решателя, а затем преобразую решение в решение, приемлемое для исходной проблемы.

Я уже преуспел в решении N * N судоку, а также в задачах N-queens, но вот моя новая цель: уменьшить проблему планирования классов до SAT, но я не знаю, как формализовать проблему планирования классов, чтобы легко преобразовать это в SAT после.

Очевидно, что цель состоит в том, чтобы за несколько месяцев создать картину такого расписания:

введите описание изображения здесь

Я нашел этот исходный код кто может решить планирование классов, но без каких-либо сокращений до SAT, к сожалению: /

Я также нашел несколько статей о планировании в целом (http://www.cs.rochester.edu/users/faculty/kautz/papers/kautz-satplan06.pdf).

Но язык определения домена планирования, используемый в этой статье, кажется мне слишком общим, чтобы представлять класс- проблема планирования. : /

Есть ли у кого-нибудь представление о том, как эффективно формализовать расписание занятий, чтобы сократить его до SAT, а затем преобразовать решение SAT (если оно существует ^^) в расписание занятий?

Я в основном открыт для любых предложений, я пока не знаю, как представлять, как уменьшить проблему, как преобразовать SAT-решение в расписание ...


Дополнительный вопрос: Планирование классов до логической выполнимости [сокращение за полиномиальное время], часть 2


person Valentin Montmirail    schedule 11.03.2015    source источник
comment
Во-первых, пожалуйста, формализуйте ввод и ожидаемый результат планирования вашего класса (или укажите ссылку на то, что формализует его).   -  person amit    schedule 11.03.2015
comment
это может быть что угодно, вот в чем проблема: я ищу лучший формализм для задачи планирования классов, и для меня это означает, что проще всего преобразовать в SAT :) У меня пока нет формализованного ввода, и моя проблема состоит в том, чтобы найти его: /   -  person Valentin Montmirail    schedule 11.03.2015


Ответы (1)


Я попытаюсь сначала формализовать проблему, а затем попытаться свести ее к SAT.

Задайте задачу планирования занятий как:

Input = { S1,S2,....,Sn | Si = {(x_i1, y_i1), (x_i2, y_i2) , ... , (x_ik, y_ik) | 0 <= x_ij < y_ij <= M } } 

Неформально: входные данные - это набор классов, каждый класс - это набор (открытых) интервалов в форме (x, y)
(M - некоторая константа, описывающая «конец недели»)

Вывод: Истина тогда и только тогда, когда существует некоторый набор:

R = { (x_1j1, y_1j1) , ..., (x_njn, y_njn) | for each a,b: (x_aja,y_aja) INTERSECTION (x_bjb,y_bjb) = {} }

Неформально: истина тогда и только тогда, когда есть некоторое присвоение интервалов, такое что пересечение между каждой парой интервалов пусто.


Перевод на SAT:

Определите логическую переменную для каждого интервала V_ij
На ее основе определите формулу:

F1 = (V_11 OR V_12 OR ... OR V_1(k_1)) AND .... AND (V_n1 OR V_n2 OR ... OR V_n(k_n))

Неформально F1 удовлетворяется тогда и только тогда, когда хотя бы один из интервалов для каждого класса "удовлетворен".

Определите Smaller(x,y) = true тогда и только тогда, когда if x <= y 1
Мы будем использовать его, чтобы гарантировать, что интервалы не перекрываются.
Обратите внимание, что если мы хотим убедиться, что (x1, y1) и (x2, y2) не перекрываются, нам нужно:

x1 <= y1 <= x2 <= y2 OR  x2 <= y2 <= x1 <= y1

Поскольку ввод гарантирует x1<=y1, x2<=y2, он сводится к:

y1<= x2 OR y2 <= x1

И используя наши предложения Smaller и boolean:

Smaller(y1,x2) OR Smaller(y2,x1)

Теперь давайте определим новые предложения, чтобы справиться с этим:

Для каждой пары классов a, b и интервалов c, d в них (c в a, d в b)

G_{c,d} = (Not(V_ac) OR Not(V_bd) OR Smaller(y_ac,x_bd) OR Smaller(y_bd,x_ac))

Неформально, если один из интервалов b или d не используется - условие выполняется, и все готово. В противном случае используются оба, и мы должны гарантировать отсутствие перекрытия между двумя интервалами.
Это гарантирует, что если оба c, d "выбраны" - они не перекрываются, и это верно для каждой пары интервалов.

Теперь сформируйте нашу окончательную формулу:

F = F1 AND {G_{c,d} | for each c,d}

Эта формула гарантирует нам:

  1. Для каждого класса выбирается как минимум один интервал.
  2. Для каждых двух интервалов c, d - если выбраны и c, и d, они не перекрываются.

Небольшое примечание: эта формула позволяет выбрать более 1 интервала из каждого класса, но если есть решение с некоторыми интервалами t> 1, вы можете легко удалить t-1 из них, не изменяя правильность решения.

В конце выбранные интервалы - это определенные нами логические переменные V_ij.


Пример:

Alebgra = {(1,3),(3,5),(4,6)} Calculus = {(1,4),(2,5)}

Определите F:

F1 = (V1,1 OR V1,2 OR V1,3) AND (V2,1 OR V2,2)

Определите G:

G{A1,C1} = Not(V1,1) OR Not(V2,1) OR  4 <= 1 OR 3 <= 1 //clause for A(1,3) C(1,4)
         = Not(V1,1) OR Not(V2,1) OR false = 
         = Not(V1,1) OR Not(V2,1)
G{A1,C2} = Not(V1,1) OR Not(V2,2) OR  3 <= 2 OR 5 <= 1 // clause for A(1,3) C(2,5)
         = Not(V1,1) OR Not(V2,2) OR false = 
         = Not(V1,1) OR Not(V2,2)
G{A2,C1} = Not(V1,2) OR Not(V2,1) OR  5 <= 1 OR 4 <= 3 //clause for A(3,5) C(1,4)
         = Not(V1,2) OR Not(V2,1) OR false = 
         = Not(V1,2) OR Not(V2,1)
G{A2,C2} = Not(V1,2) OR Not(V2,2) OR  5 <= 2 OR 5 <= 3 // clause for A(3,5) C(2,5)
         = Not(V1,2) OR Not(V2,2) OR false = 
         = Not(V1,2) OR Not(V2,2)
G{A3,C1} = Not(V1,3) OR Not(V2,1) OR  4 <= 4 OR 6 <= 1 //clause for A(4,6) C(1,4)
         = Not(V1,3) OR Not(V2,1) OR true= 
         = true
G{A3,C2} = Not(V1,3) OR Not(V2,2) OR  6 <= 2 OR 5 <= 4 // clause for A(4,6) C(2,5)
         = Not(V1,3) OR Not(V2,2) OR false = 
         = Not(V1,3) OR Not(V2,2)

Теперь мы можем показать нашу окончательную формулу:

    F = (V1,1 OR V1,2 OR V1,3) AND (V2,1 OR V2,2) 
        AND  Not(V1,1) OR Not(V2,1) AND Not(V1,1) OR Not(V2,2)
        AND  Not(V1,2) OR Not(V2,1) AND Not(V1,2) OR Not(V2,2)
        AND  true AND Not(V1,3) OR Not(V2,2)

Вышеуказанное выполняется только тогда, когда:

V1,1 = false
V1,2 = false
V1,3 = true
V2,1 = true
V2,2 = false

А это означает расписание: Algebra = (4,6); Исчисление = (1,4) по желанию.


(1) довольно просто вычислить как константу формулы, таких констант полиномиальное количество.

person amit    schedule 11.03.2015
comment
Я очень надеюсь, что не ошибся, это было нетривиальное сокращение, прокомментируйте, если вы заметили какие-либо проблемы - person amit; 11.03.2015
comment
Большое спасибо :) но я должен признать, что я не думаю, что понимаю все, что вы сказали: D Ваша формализация действительно самая простая, и поэтому лучше преобразовать в SAT :) Я понимаю, как получить в конце планирование из решения SAT. Но можете ли вы привести небольшой пример, например, 2 занятия и 3 интервала. Я так понимаю, что будет 2 * 3 = 6 логических переменных; Но как будет выглядеть файл CNF? - person Valentin Montmirail; 11.03.2015
comment
@ValentinMontmirail Я обновил ответ простым примером. с 2 занятиями и 3,2 антрактами. Обратите внимание, что количество переменных в этом случае равно 3 + 2. Количество статей почти O(#variables^2). - person amit; 11.03.2015
comment
Еще раз спасибо :) В то же время я работал над вашими идеями, и теперь я их понял ^^ (Я отвечаю, может быть, слишком быстро, прежде чем подумать ^^) Но на самом деле, я полностью впечатлен, ваш метод такой элегантный, простой и работает отлично :) Спасибо за ваш пример, он проиллюстрировал то, что я понял :) на всякий случай :) - person Valentin Montmirail; 11.03.2015
comment
@ValentinMontmirail Я бы не сказал просто, у меня ушло довольно много времени, чтобы подумать об этом, и даже больше, чтобы его формализовать. Хотя программировать просто :) - person amit; 11.03.2015
comment
Ага: P, когда я сказал просто, я имел в виду алгоритм, лежащий в основе: p ​​точно не процесс мышления :) в любом случае: еще раз спасибо! привет из Франции! - person Valentin Montmirail; 11.03.2015
comment
Привет @ Amit, я кодирую ваш метод, и он отлично работает в течение одного дня (от N до M). Но я обобщаю ваш метод не только на 1 день (от N до M), но и на 1 неделю (от N до 5 * M), и есть проблема: проблема недостаточно ограничена, поэтому иногда говорится, что дважды один и тот же класс верно (но не должно). Я думаю, это произошло из-за того, что в CNF написано Vi_1 OR Vi_2 OR ... Но нет ничего, чтобы сказать, что если Vi_1 истинно, то Vi_j должно быть ложным ...: / У вас есть идея, как исправить это ? : / - person Valentin Montmirail; 12.03.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person Valentin Montmirail; 12.03.2015
comment
q = (-_-) Хм ... без исходного кода не весело, что такое S1, x_i1 и _3 _ ??? по крайней мере, пожалуйста, кто-нибудь отредактируйте это и замените Sudo-код на фактическую математику и / или алгебру (например, я все еще не понимаю значения подчеркивания) - person Top-Master; 30.06.2021