【发布时间】:2021-08-02 16:25:07
【问题描述】:
现在我有一个单选谓词来定义我的搜索空间。
#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..nRooms, 1..nDecks) } nRounds.
#endfor
这在内部基本上会变成这样:
nRounds { seat(1, 1..nRooms, 1..nDecks) } nRounds.
nRounds { seat(2, 1..nRooms, 1..nDecks) } nRounds.
nRounds { seat(3, 1..nRooms, 1..nDecks) } nRounds.
...
当然,我可以“自己拼出来”,即使用另一种语言来生成这些行,但我不明白为什么这在 clgo 中不存在。
我首先寻找一种方法的原因是因为我预计(nRooms*nDecks choose nRounds) * nPlayers 会比(nRooms*nDecks*nPlayers) choose nRounds*nPlayers 小得多,而{seat(P, R, D)} 的@987654327 又比{seat(P, R, D)} 好得多@这是我开始的。
即使我的代码中的约束限制了我最终可以得到的实际可能集合,因此所有这三种表示形式都是等效的,但仍然可以从这种手动搜索空间修剪中获得性能优势,对吧?
【问题讨论】:
标签: logic-programming answer-set-programming clingo