如何解决clingo 中多项选择谓词的简写
#const nRounds = 3.
#const nPlayers = 17.
#const nSeats = nRounds * nPlayers.
#const nRooms = 3.
#const nDecks = 6.
nSeats { seat(1..nPlayers,1..nRooms,1..nDecks) } nSeats.
我想限制这个搜索空间,因为我开始遇到性能问题。在我的设置中,每个玩家只能出现在 4 个“座位”谓词中,所以我想要一些类似的东西:
#for i in 1..nPlayers
nRounds { seat(i,1..nDecks) } nRounds.
#endfor
这基本上会在内部变成这样:
nRounds { seat(1,1..nDecks) } nRounds.
nRounds { seat(2,1..nDecks) } nRounds.
nRounds { seat(3,1..nDecks) } nRounds.
...
当然,我可以“自己拼写出来”,即使用另一种语言来生成这些行,但我不明白为什么这在 clingo 中不存在。
我首先要寻找一种方法来执行此操作的原因是因为我预计 (nRooms*nDecks choose nRounds) * nPlayers
将比 (nRooms*nDecks*nPlayers) choose nRounds*nPlayers
小得多,而 {seat(P,R,D)}
又比 2^(nRooms*nDecks*nPlayers)
好得多}} 和它的 SELECT
column_1
FROM
XXX
WHERE
column_1 BETWEEN DATEADD(Year,-2,'2021-05-12') and '2021-05-12'
,这是我开始使用的。
即使我的代码中的约束限制了我最终可以得到的实际可能集,以便所有这三种表示都是等效的,但这种手动搜索空间修剪仍然可以获得性能优势,对吗?
解决方法
您正在寻找的“for 循环”是一个直截了当的规则:
nRounds { seat(S,1..nRooms,1..nDecks) } nRounds :- S = 1..nPlayers.
使用 clingo --text
我还建议您将 seat(P,R,D)
谓词分成几个较小的谓词(取决于您的问题。
就像每个玩家都被分配了一个房间 p2r(P,R)
,每个房间都被分配到一个甲板 r2d(R,D)
。通过这种方式,您可以在以后的约束中节省大量不必要的组合。当然,我的两个谓词可能对您的问题没有意义,但我相信您会找到一个组合来拆分您的席位谓词。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。