首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python库clingo枚举子集最小模型

用Python库clingo枚举子集最小模型
EN

Stack Overflow用户
提问于 2021-07-06 17:14:12
回答 1查看 222关注 0票数 0

我想列举所有子集最小模型。如果我从终端调用clingo,它就能工作,但是当我使用用于Python的clingo库时,它会失败。我遗漏了什么?

示例程序

代码语言:javascript
复制
1 {x(C) : C=1..10} 2.
#show x/1.

终端解决方案

代码语言:javascript
复制
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的解决方案

代码语言:javascript
复制
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]]

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-07 00:33:53

在缓存Control对象时,应该添加命令行中的所有命令选项,而不是手动设置。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68274838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档