- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过游戏的不同事件分配玩家。
在比赛期间,一支球队可以进行固定数量的回合。
主要限制是:每个球队必须参加每场比赛,但每个球队不必与比赛>所有团队。
我已经在网上搜索了答案,但它们都与锦标赛有关,没有像我一样的限制。
您现在可以跳过接下来的两个部分。
我是大型游戏组织的一员,我有责任通过游戏期间的不同事件来分配玩家。当我意识到这不是一个容易解决的问题时,我尝试编写一个 Python 脚本来完成这项工作。然后,我意识到我做错了,因为我的脚本以一种确定性的方式工作。人们告诉我应该使用求解器(约束编程)来完成。但是我在这个领域没有概念。它试图使用包 python-constraint解决我的问题,但我没有成功定义良好的约束。
我也在网上搜索过这个问题,但我找到的大部分答案都与锦标赛有关,它没有像我一样的限制。事实上,锦标赛的主要目标是确保每支球队都与所有其他球队比赛。在这里,主要的限制是确保每个团队都参加每项事件。
我找到了 a similar thread在 math.stackexchange 上,但约束不一样,没有正确的答案。
由于有36支球队进行22场对决,所以每轮都会有一些事件是空的。
由于有 22 项事件和 22 轮,一个团队不能多次进行一项事件。
| Round 1 | Round 2 | Round n
------ | -------------- | -------------- | --------------
Game 1 | Team1 vs Team2 | Team3 vs Team5 | Team? vs Team?
Game 2 | Team3 vs Team4 | Team1 vs Team6 | Team? vs Team?
Game n | Team? vs Team? | Team? vs Team? | Team? vs Team?
from constraint import *
problem = Problem()
problem.addVariable("Activity", [i for i in range(1, 22+1)])
problem.addVariables(["Team1", "Team2"], [i for i in range(1, 36+1)])
problem.addVariable("Round", [i for i in range(1, 22+1)])
problem.addConstraint(lambda a, b: a != b, ("Team1", "Team2"))
???
我正在寻找能够:
它可以使用任何语言或使用任何工具。我以 Python 为例。
无论如何,我们将不胜感激。先感谢您!
最佳答案
你的问题一点也不简单,但我会尝试解决它。:) 我会尝试根据约束可满足性定义问题。我会依靠Boolean satisfiability并使用 Tseitin transformation对您的任务进行编码。
首先,让我们介绍一组 bool 变量,它们对应于一个团队在一轮比赛中进行的比赛:
game0_team0_round0, g0_t0_r1, ..., gk_tm_rn
我们将把约束编码为 bool 公式。它返回 True 当且仅当存在满足所有给定约束的这样的时间表。上面定义的一组变量值表示一个时间表:如果变量等于 True,则相应团队在相应轮次中进行了比赛。我们引入了很多约束。让我们同意,如果约束公式返回 True,则违反了此约束。
第一个约束禁止球队在一轮内打几场比赛:
for round in rounds:
for team in teams:
games = get_games_from_team_and_round (round, team)
constr = greater_then_equal (games, 2)
add_must_be_false_constr (constr)
'greater_then_equal' 构建伪 bool 值 约束,确保只有一场比赛对于团队/回合而言可以是True。你可以阅读here如何实现。 'add_must_be_false_constr' 确保不会违反约束。
接下来,让我们引入决斗约束:在一个回合内,必须有两支队伍进行比赛。同时,他们必须玩同一个游戏:
for round in rounds:
for game in games:
teams = get_teams_from_round (round)
constr = greater_then_equal (teams, 3)
add_must_be_false_constr (constr)
最后,每支球队必须参加每场比赛:
for round in rounds:
for team in teams:
games = get_games_from_team_and_round (round, team)
constr = boolean_or (games)
add_must_be_false_constr (constr)
我们确保每轮至少进行一场比赛。
您可以将结果公式放入求解器(例如 Glucose ),它会找到满足所有给定约束的随机计划。
现在是棘手的部分 - 最小化。我不确定如何正确地做到这一点,但是,例如,如果一对团队在给定的一轮比赛中进行了一场比赛,您可以引入一个变量,该变量为 True。接下来,您将引入“greater_then_equal”约束来限制这些变量的 True 值的数量。最后,你可以使用 assumptions找到重复次数最少的最佳时间表。
请注意,使用这种方法可能会花费很多时间来解决任务:以正确的方式实现所有内容并非易事,所以这就是为什么我不为您提供代码,而只是给您一个非常通用的原因描述如何去做。解决一个问题可能需要几个小时,但这取决于问题本身和限制条件。其他问题 - 它可能会消耗大量内存。我有通过做类似的事情解决非常大(10^4 个变量,10^6 个约束)问题的实践经验。祝你好运!
关于python - 组合学 - 安排比赛的团队协会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574440/
我们有一个接口服务为下游的系统提供数据服务,本来好好的大家都愉快地传递JSON,非常和谐。可最近有个新需求去对接一个很老的系统,这倒是不算啥,可这个老系统数据不是以JSON传递的而是以XML传递
我想完成这样的事情: results = [] for i in range(N): data = generate_data_slowly() res = tasks.process
如何安排 SSIS 每天在给定时间从文件中自动执行包? 最佳答案 你有几个选择,但我会给你一些让你快速启动和运行的东西...... 打开 SQL Server Management Studio 并连
我们有两个服务器 Azure 配置,运行由 Umbraco 提供支持的网站。当我们需要向Azure服务器添加新域时,我们修改配置文件,然后依次重新启动每台服务器。 理论上,因为我们永远不会同时重新启动
我给出了一个创建电子邮件 C# 控制台应用程序的任务,该应用程序的目标是批量运行。我对 C# 领域非常陌生,因此我不知道我的方向。此 C# 控制台应用程序将部署在服务器上,并期望根据服务器时间在特定时
我有一个控制台应用程序,运行时会执行一些操作,并使用docker生成它的镜像。现在,我想将其部署到Kubernetes并每小时运行一次,是否有可能在K8中完成? 我已经阅读了有关Cron作业的信息,但
这是我的 CronJob 规范的一部分: kind: CronJob spec: schedule: #{service.schedule} 对于特定环境,设置了 cron 作业,但我从不希望
我的任务是创建一个应用程序,该应用程序将每 (n) 分钟向选定的收件人发送一封电子邮件。它所在的应用程序的结构方式是通过回调 .main(args) 来重置自身。每当需要的时候。我的问题是,当我调用.
安排 Airflow Dag 使其仅在工作日运行的正确方法是什么?我已经尝试在 start_date 和 schedule_interval 表达式中都包含小时偏移量,但它仍然没有在所需的时间开始。
我有许多测试都安排了一些 TestFixtures,我发现我正在复制该安排代码很多。每个测试的前几行几乎相同。 有没有一种方法可以在所有测试中声明一个共享的 TestFixture,同时仍然在每个测试
我有一个问题,我正在创建一个应用程序,我想在系统与 azan 时间匹配时在后台播放 azan 文件,无论用户正在使用应用程序的任何屏幕,azan 都应该开始播放。 我在 Azan.java 中创建了一
在我没有重启我的手机之前一直在 toast ,但是在重启之后 broadcastreceiver2 没有收到并且没有任何反应。 我关注了http://stacktips.com/tutorials/a
自动将一个数据库表的表数据复制到另一个数据库表;当表格更新或按某个特定时间间隔更新时,安排 数据库MySQL;语言 PHP 我有两个数据库; A和B 数据库 A 包含一个表 USERS 我想将USER
我的 Android 应用程序将定期轮询服务器以检查数据。我希望无论用户与应用程序交互如何进行此轮询,类似于(在概念上)Gmail 和 Google Reader 应用程序如何在后台同步数据。安装应用
我可以将android中的警报管理器(.set()方法)安排到当前时间一个月后的时间吗它会活那么久吗?操作系统对此 alarmManager 有何影响? 最佳答案 用户重启手机时的提示。您可以使用以下
安排 AsyncTask 每分钟运行一次的最佳做法是什么(请注意,在 AsyncTask 完成后我应该能够更新 UI)。 我不打算使用服务,因为这些任务应该只在应用处于 Activity 状态时运行。
我在排列从 php 中的 while 循环返回的数据时遇到问题。 基本上,我正在尝试从数据库返回工作的时间段计划,问题是我似乎在所有时间段中得到相同的结果,或者在一个时间段中的所有客户端得到相同的结果
我想创建一个仅在周六和周四运行的 mysql 事件。 是否可以定义事件本身的日期? 我有一个想法,每天运行调度程序,如果是星期四或星期六,则该过程将继续,否则它将退出调度程序而不执行任何操作。 最佳答
如何使用 MySQL 调度程序安排查询运行(如果这是最好的方法)?我按照 link here 中的说明进行操作但我有点迷路了。 我想在我们拥有的特定数据库上每 30 分钟运行一次以下查询。 u
我想在使用事件轮换我的日志后读取我的表日志,我希望我的事件在我选择的一周中的任何一天运行。 经过一番研究,我想到了这个 CREATE EVENT read_rotated_logs ON SCHEDU
我是一名优秀的程序员,十分优秀!