如何解决使用 Python 库 clingo 枚举子集最小模型
我想枚举所有子集最小模型。如果我从终端调用 clingo 会起作用,但是当我使用 python 的 clingo 库时它会失败。我错过了什么?
示例程序:
1 {x(C) : C=1..10} 2.
#show x/1.
来自终端的解决方案:
clingo program.asp --models=0 --enum-mode=domrec --heuristic=Domain --dom-mod=5,16
clingo version 5.4.0
Reading from program.asp
Solving...
Answer: 1
x(1)
Answer: 2
x(10)
...
Answer: 10
x(5)
SATISFIABLE
Models : 10
Calls : 1
Time : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
cpu Time : 0.001s
使用 Python 和 clingo 的解决方案:
from clingo import Control,Model
control = Control(arguments=[f"--models=0","--opt-mode=optN"])
control.heuristic = "domain"
control.dom_mod = "5,16"
control.enum_mode = "domrec"
control.add(name="base",parameters={},program="1 {x(C) : C=1..10} 2.")
control.add(name="base",program="#show x/1.")
solutions = []
def add_solution_to_list(model: Model):
solution = [symbol.arguments[0].number for symbol in model.symbols(shown=True)]
solutions.append(solution)
control.ground(parts=[("base",[])])
result = control.solve(on_model=add_solution_to_list)
-
solutions
包含 55 个元素:[[1],[2],[1,2],[3],3],...,[9,10],[8,9]]
我做错了什么?
解决方法
当您创建 Control
对象而不是手动设置时,您应该从命令行添加所有命令选项。
control = Control(arguments=[f"--models=0","--opt-mode=optN","--enum-mode=domRec","--heuristic=Domain","--dom-mod=5,16",])
如果您想以不同的方式发送它们,则必须使用 Configurarion
API:
https://potassco.org/clingo/python-api/5.5/clingo/configuration.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。