微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

clingo 中多项选择谓词的简写

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?