минимизация эвристики булевой функции для алгоритма A *

Мне нужно написать программу на питоне, которая минимизирует логическую функцию, но загвоздка в том, что я должен использовать алгоритмы поиска, например, A* или более простой алгоритм BFS или что-то в этом роде. Я написал программу с итеративным углублением, она решает все проблемы, но слишком медленная (лимит 20 секунд на каждую проблему).

Итак, я написал другую программу, используя алгоритм A* (нам сказали, что если мы хотим получить более высокую оценку, мы должны использовать эту), но мне удалось сделать ее в 10 раз медленнее, чем та, которая использует итеративное углубление, и это потому, что я могу Не могу понять правильную эвристику для алгоритма. Я не могу понять, каковы критерии эффективной минимизации (хорошая эвристика).

ПРОБЛЕМА:

Вам дан список списков ([[0,1,0,1],[...],[...],[....],...]), представляющих таблицу истинности (последний элемент в внутренний список представляет значение функции). Напишите программу, которая находит минимальную дизъюнктивную форму булевой функции, используя только алгоритмы поиска (пример A*, BFS, IDA*, DFS, ..). На каждую задачу у вас есть 20 секунд, чтобы решить ее.


person Aljaž Prijatelj    schedule 14.11.2011    source источник
comment
Пожалуйста, добавьте оригинальное описание проблемы.   -  person Wisdom's Wind    schedule 14.11.2011


Ответы (1)


Я собираюсь предположить, что ваши состояния являются действительными наборами конъюнктов. Вот простая допустимая эвристика. Пусть U будет набором входных параметров функции, отображаемых в 1, которые не совпадают ни с одним из конъюнктов в текущем состоянии. Пока U не пусто, выберите вход x в U. Удалите из U все входы y такие, что существует допустимый конъюнкт, соответствующий x и y. Возвращает количество элементов, выбранных из U.

На самом деле, эту задачу можно рассматривать как пример укрытия, и эта эвристика жадно строит решение дуальной релаксации ЛП. Если у вас есть доступ к решателю LP, вы можете получить более качественную (но, возможно, более медленную) эвристику, решив двойную LP до оптимальности.

person Per    schedule 14.11.2011
comment
Я использую списки [[1,2],[3,4]] => (x1 и x2)|(x3 и x4), и еще один момент: лучше начать с полной формы и начать сворачивать или лучше? начать с нуля, а затем добавить их, пока я не получу правильную функцию. - person Aljaž Prijatelj; 15.11.2011
comment
@Aljaž Prijatelj Единственное, на что следует обратить внимание со списками, это то, что вы не должны рассматривать [[1,2],[3,4]] и [[3,4],[1,2]] как отдельные состояния, и вы не следует рассматривать [[1,2],[3,4]] и [[2,1],[3,4]] как отдельные состояния. Я никогда не применял A* к этой проблеме, поэтому я не знаю, какие состояния/переходы работают лучше всего. - person Per; 16.11.2011