Clingo: пересечение всех возможных оптимальных решений (ASP)
Я хочу найти атомы в заранее определенном наборе атомов, которые находятся во всех возможных оптимальных решениях задачи ASP.
Я объясню, что я хочу сделать. У меня есть проблема оптимизации, в которой может существовать несколько оптимальных наборов ответов. Набор ответов состоит из атомов, характеризующих решение, например,edge(1,2)
, а также некоторые неактуальные, напримерcolor(0)
.
Я хочу вычислить все оптимальные наборы ответов, показать только атомы типа node() и edge(), а затем найти конкретные релевантные атомы (например,node(0)
иedge(1,0)
), которые существуют во всех оптимальных наборах ответов.
Я знаю, что могу ограничить выход определенных атомов с помощью#show
директива. Я также могу добавить флаги--opt-mode=optN
чтобы вычислить все оптимальные ответы и ограничить вывод только теми, у кого--quiet=1
. Согласно руководству, используя--enum-mode cautious
вычисляет пересечение всех наборов ответов.
Пример:
Если у меня есть два оптимальных набора ответов:
Набор ответов 1: узел(1) узел(0) край(1,0) край(0,1) цвет(1)
Набор ответов 2: узел (1) узел (0) край (1,0) цвет (0)
Я хочу получить результат node(1) node(0) edge(1,0)
я могу запустить клинго с
--opt-mode=optN --quiet=1
затем вручную найдите все атомы node() или edge(), которые являются общими для всех наборов ответов.Я могу добавить
#show node/1 #show edge/2
в мою кодировку, затем запустите clingo с помощью--opt-mode=optN --quiet=1 --enum-mode cautious
.
Являются ли все эти два варианта логически эквивалентными?
Есть ли более эффективный способ добиться того, чего я хочу?
Я не уверен насчет взаимодействия между директивой #show и флагами --opt-mode, --quiet и --enum-mode. У меня проблема, когда наборы ответов могут быть очень большими, поэтому я бы предпочел использовать вариант 2, так как он занимает меньше места на диске.
Заранее спасибо.
1 ответ
Вы определенно на правильном пути. Однако я не уверен в сочетании вариантов, особенно--quiet
так как это только предотвращает отображение неоптимальных моделей, но они все равно будут считаться моделями для--enum-mode=cautious
штуковина
Вы должны просто использовать API-интерфейс Clingo Python для достижения своей цели. Сначала вычислите одно оптимальное решение. Тогда у вас есть граница, которую вы можете дать в качестве дополнительного аргументаopt-mode
и ваш подход должен работать.