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)

  1. я могу запустить клинго с--opt-mode=optN --quiet=1затем вручную найдите все атомы node() или edge(), которые являются общими для всех наборов ответов.

  2. Я могу добавить#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и ваш подход должен работать.

https://potassco.org/clingo/python-api/current/clingo/

Другие вопросы по тегам