问题标签 [clingo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
logic - 如何在 clgo 中实现关键约束?
我现在正在学习 prolog 并尝试使用 cligo 来建模关键约束,但遇到了一些麻烦,希望有人能帮帮我。这是我的问题:
- 我想建立一个关键约束并在 cligo 中编写如下内容
作为完整性约束,但出现语法错误。我尝试了另一种方式,它似乎工作。
但是我仍然想知道是否可以将单独的约束组合成一个关键约束,从而使程序更简洁?
- 另一个问题是关于如何在 cligo 中建立“存在某些东西”的事实,我想要实现的是使用 cligo 来判断两组给定的规则是否可以满足,这里是一个例子。
第一组规则说“存在一个 id 为 1 名称为 mike 的学生”:
和“具有相同 id 的两个学生应该具有相同的姓名和年龄”(这是一个关键约束):
所以我在 Clingo 中写了第一组规则:
假设给定第二组规则,即“存在一个 id 为 1 且年龄为 27 的学生”:
第二组规则用 Clingo 写成:
我的问题是,如果简单地将这两组规则放在一个程序中,Clingo 会判断它们不能满足原因 ("mike",v) != (v, 27)。所以我的解决方案肯定有问题(可能是建立存在的方式),因为如果你有一个 id = 1、name = "mike" 和 age = 27 的学生,这两组规则实际上是可以满足的。我想知道如果有办法使用 Clingo 来判断上述两组规则的可满足性,谢谢!
logic-programming - Clingo 计划有望令人满意
我正在 Clingo 5.0.0 中测试一些涉及算术的程序,但我不明白为什么下面的程序不能满足:
我期望的答案包含:a(object1) a(object2) b(object3) go(object1,object2,object3)。
关于 Clingo 的算术,我可能想念一些东西。
answer-set-programming - 如何在答案集编程(ASP Clingo)中找到倒数第二个值
我正在使用答案集编程(Clingo)模拟大学课程时间表。要求是每节课必须分配到特定的星期、日期和开始/结束时间,直到达到总时间。
一天最多8小时,每节课最少2小时。预定的课程也将持续到第 10 周。
所以首先我生成了每个分配的课槽
之后,对于其他要求和规则,我需要找到时间表中分配的最后一门课程。我不知道这是否是一个好方法,但我能够找到解决方案
我是 ASP 的新手,到目前为止,我找不到一个好方法来找到其他时间表要求所需的时间表(周、日、开始、结束)中分配的课程的倒数第二课。
所以举个例子
我想找到历史的倒数第二课,即
分配(4,星期二,16,18)
非常感谢任何提示或解决方案
cycle - 从 Clingo 骑士路径程序中的棋盘中删除 a1 字段
我需要对棋盘上的骑士路径和汉密尔顿循环进行一些模拟,但我想知道如果我从棋盘中排除一些字段会怎样
以上是cligo中的代码,我需要从这个棋盘中删除一些像a1这样的文件,但我不知道该怎么做,有人可以帮我吗?谢谢
logic-programming - 如何定义多个惩罚以最小化 clgo 中的整体?
我正在尝试使用 cligo 生成锦标赛玩家房间分配:
前 5 行应该是“输入”:
- 在场的玩家数量是可变的
- 可用房间的数量也是如此
- 每个玩家需要整晚打 4 局,所以我们记录了每个玩家到目前为止玩的局数
- 每个玩家都有一个排名(在联赛表中),每轮后都会更新 - 理想情况下,每个房间的玩家应该有相似的级别(想想 ELO)
- 为了阻止算法一直将相同的玩家放在一起,我们还跟踪任何给定的玩家在同一个房间里一起度过的回合数
这个想法是在每一轮之后(一旦点进入)更新这些输入,并将它们反馈给求解器以产生下一轮的分配。
然后,我尝试添加一些约束:
- 有一定数量的房间可供使用,但并非所有房间都必须使用。每个房间可以在每一轮使用或未使用
- 对于任何使用的房间,必须分配 3 或 4 名玩家(由于游戏机制 - 总是首选 4,3 用于处理边缘情况)
- 在任何给定回合中,任何玩家都不能被分配到一个以上的房间
最后,我尝试定义一些“惩罚”来指导求解器选择最佳分配:
- 对于放置在同一房间的每一对玩家 P1、P2,将 X 加到罚分中,其中 X 是他们已经一起玩过的次数。
- 对于放置在同一个房间的每一对玩家 P1、P2,将他们排名的(绝对)差异添加到罚分中。
- 对于每个还需要多打 X 轮但尚未被选中参加本轮比赛的球员,将 X 加到罚分中。
我的意思是让这个惩罚累积起来,这样每个还有 4 轮的玩家(所以每个玩家在开始时)都会在惩罚上加 4 分,而不仅仅是 1 分(这就是这段代码发生的情况)。在实践中,运行它penalty(4).
并没有任何game(player, room).
分配。
另外,我想有一些限制,这样我就不会遇到一些玩家还有几轮要玩但没有足够的玩家的情况(例如,如果你有 1、2 或 5 个玩家只需要打一轮)。我不确定正确的不变量是什么,它可以保证即使提前几轮也不会发生这种情况。这更像是一个实际的逻辑问题,而不是固执己见。在实践中,您有大约 3-4 个房间和大约 20-30 个玩家 - 重要的是,永远不能保证 # 个玩家是 4 的因素。
我目前的“实施”中缺少的其他东西是一个约束,即对于特定的玩家子集(让我们称他们为“专家”),他们中的至少一个必须留在当前回合之外(并领导它)。一般来说,对于每个使用的房间,至少有一名玩家必须留在外面(包括一名专家)。这应该是一个硬约束。
最后,我们希望最大化房间的利用率,即最大化每轮的玩家数量并最小化总体轮数。这应该是一个弱约束(就像到目前为止一起玩的排名和游戏的约束一样)。
非常感谢您的任何帮助或建议!不幸的是,文档没有提供这么多复杂的示例,所以我无法弄清楚我的用例的正确语法是什么。
logic-programming - 如何在 cligo 中总结所有而不是不同的值?
下面的代码产生x(3)
而不是x(4)
因为它将 1 和 2 加在一起,即使 1 出现了两次。在 clgo中获得总金额的正确方法是什么?
logic-programming - cligo 中多项选择谓词的简写
现在我有一个单选谓词来定义我的搜索空间。
当我开始遇到性能问题时,我想限制这个搜索空间。在我的设置中,每个玩家只能出现在 4 个“座位”谓词中,所以我想要以下内容:
这基本上会在内部变成这样的东西:
当然,我可以“自己拼写”,即使用另一种语言来生成这些行,但我不明白为什么这在 cligo 中不存在。
我首先要寻找一种方法来做到这一点的原因是因为我希望它会比我开始使用(nRooms*nDecks choose nRounds) * nPlayers
的要小得多,而(nRooms*nDecks*nPlayers) choose nRounds*nPlayers
这反过来又要好得多。{seat(P, R, D)}
2^(nRooms*nDecks*nPlayers)
即使我的代码中的约束限制了我最终可以得到的实际可能集合,因此所有这三种表示形式都是等效的,但从这种手动搜索空间修剪中仍然可以获得性能优势,对吧?
logic-programming - 在 clgo 中有效地减少搜索空间
我正在努力扩展约束问题(它会因大值和/或如果我尝试优化而不是仅仅寻找任何解决方案而崩溃)。根据之前一些问题的建议,我已经采取了一些步骤来分解搜索空间,但它仍然停滞不前。还有其他技术可以帮助我优化此计算吗?
何时或如果这变得可以管理,我希望添加更多优化目标以选择最佳配置:
更新 - 问题描述
- P 玩家聚在一起进行问答之夜。D甲板和R房间 可以玩。
- 每个房间只能容纳 3 或 4 名玩家(由于游戏规则,而不是空间)。
- 每个套牌最多播放一次,并同时在多个房间播放 - 所以从某种意义上说,套牌是“回合”的代名词。
- 每个玩家最多只能玩同一个套牌一次。
- 每个玩家在晚上只能玩 N 次(N 几乎是固定的,为 4)。
- 因此,如果在晚上玩 9 套牌(即如果有很多玩家在场),则每张牌都会玩这 9 套中的 4 套。
- 因此,每个玩家没有必要在每个“套牌/回合”中玩。事实上,每一副牌都有一个作家,而且通常是其中一名玩家。
- 当然,作者不能玩他们自己的套牌,所以他们必须在这一轮中呆在外面。此外,对于每一副牌/回合,必须有人阅读每个房间的问题,因此如果有 16 名玩家在场并且有 4 个房间,那么 16 名玩家不可能全部参与。可以有 4 个房间,每个房间有 3 名玩家(其余 4 名玩家读出问题)或有 3 个房间,每个房间有 4 名玩家(有 3 名玩家读出问题和 1 名旁观者)。
希望这可以消除混淆,如果不是,我可以尝试提供更详细的示例,但基本上,假设您有 4 个房间和 30 个玩家:
- 你选择了 16 位选手和另外 4 位选手读出问题
- 然后你有 16 个人玩了他们的 1/4 套牌/回合,还有 14 个人仍然在 0/4
- 因此,您可以让其他 14 人玩(每个房间 4、4、3、3 名玩家)或继续最大化房间实用性,以便在第二轮之后每个人至少玩一次,并且 2/30 玩家已经玩过 2/ 4场比赛。
- 然后你继续挑选一些人,直到每个人都玩了 4 副牌/轮。
PS你有2个回合的概念——一个是个人级别的,每个人都有4个可以玩,另一个是联赛级别,有一些甲板数量> 4,每个甲板在在场的每个人眼中都被认为是“一轮” . 据我了解,这是关于设置的最令人困惑的一点,我一开始没有很好地澄清。
logic-programming - Clingo:操作未定义
将以下规则添加到我的代码会导致错误消息 ( info: operation undefined (Max-Min)
):
played(Room, Deck)
意味着每个玩家都存在至少一个seat(Player, Room, Deck)
谓词(实际上恰好存在 3 或 4 个),rank(Player, Rank)
因此这不应该是一个空集问题。
更新 - 可运行示例(没有任何约束):
combinatorics - 在 Clingo/ASP 中为匹配人员生成候选解决方案
我有一个人员列表,我想将他们全部配对,然后根据偏好进行一些过滤。当我生成候选解决方案时,如何避免创建重新配对人员的候选解决方案。
例如:
这会生成候选解决方案,包括match(a,b) match(c,b) ...
我只想要不匹配任何人的候选解决方案,例如:match(a,b) match(c,d) ...
我的目标是不必通过额外的约束来过滤重新匹配。此外,并不是每个人都需要匹配。谢谢!