Clingo求解ASP最优回答集公共指定原子的等效性与效率问题
问题场景
我需要在回答集编程(ASP)问题的预定义原子集合中,找出存在于所有可能最优解中的原子。
当前问题的单个回答集包含两类原子:
- 目标相关原子:表征解的核心原子,例如
node(0)、edge(1,2) - 无关原子:不需要纳入最终筛选范围的原子,例如
color(0)
目标是计算所有最优回答集,仅保留node()、edge()类型的原子,最终筛选出在所有最优回答集中都存在的相关原子。
示例场景:
存在两个最优回答集:
回答集1:node(1) node(0) edge(1,0) edge(0,1) color(1)
回答集2:node(1) node(0) edge(1,0) color(0)
期望输出结果:node(1) node(0) edge(1,0)
已知Clingo特性
- 可通过
#show指令限制指定谓词/元数的原子输出 - 添加参数
--opt-mode=optN可计算所有最优回答集,搭配--quiet=1参数可仅输出最优回答集 - 使用
--enum-mode cautious参数可计算枚举范围内所有回答集的交集
待验证方案
目前梳理了两种可实现需求的方案:
- 运行clingo时添加参数
--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参数的交互逻辑。
解答
关于两种方案的等价性
两种方案逻辑完全等价,参数交互逻辑如下:
--enum-mode cautious的计算范围完全受--opt-mode约束:当指定--opt-mode=optN时,cautious枚举只会在所有最优回答集的范围内计算交集,不会纳入任何非最优回答集#show指令对所有枚举模式生效:无论是普通全量枚举还是cautious/brave推理枚举,最终输出的原子都会被#show规则过滤,无关的color()类原子既不会出现在普通枚举的输出中,也不会被纳入cautious交集的输出范围--quiet=1参数搭配cautious模式时,会自动屏蔽求解过程中的中间非最优集信息,仅输出最终的交集结果,不会产生多余输出。
关于效率最优方案
你倾向的方案2本身就是目前效率最高、资源占用最低的实现方式,完全不需要采用方案1的手动处理流程:
- 方案1需要将所有最优回答集全量写入磁盘,当回答集数量多、单个体量大时,会消耗大量磁盘IO和存储空间,后续手动求交集的时间、内存开销也会随回答集数量线性增长
- 方案2是Clingo内核层面在求解过程中直接维护cautious交集,不需要落地全量回答集,内存、磁盘开销远低于方案1,求解速度也更快。
补充提示:如果使用的是5.4及以上版本的Clingo,不需要额外添加--quiet=1参数,cautious模式搭配--opt-mode=optN默认就只会输出最终的最优集交集,不会打印中间结果;如果是旧版本,保留现有参数组合即可。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

