使用 Python 库 clingo 枚举子集最小模型
enumerating subset minimal models with Python library 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", parameters={}, 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], [1, 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
我想枚举所有子集最小模型。如果我从终端调用 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", parameters={}, 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], [1, 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