使用 Choco 建模网球比赛 (CSP)

2024-06-28

我正在尝试用 Choco 建模一个问题,以获得网球赛事(或任何运动)中可能的比赛组合。

我尝试这样做的方式如下:

// Set of timeslots when the event is held (i.e. 10am-10pm)
int nTimeslots = 12;

// Courts available: court #1, #2 and #3
int nCourts = 3;

String[] players = { "Novak", "Andy", "Roger", "Stan", "Rafel", "Kei", "Tomas", "David" };
int nPlayers = players.length;

// Timeslots when each player cannot play for whatever reason
int[][] unavailability = {
    { 0, 1, 5 },
    { 8, 10, 11 },
    { 1, 2, 11 },
    { 0, 1 },
    { 2, 3, 4, 5, 6 },
    { 3, 4, 9, 10, 11 },
    { 4, 5 },
    { 2, 3 }
};

// Number of timeslots each match will occupy
int matchDuration = 2;

// This will hold the final combinations
// rows -> players, columns -> timeslots, matches[i][j] -> court where the player plays at that timeslot (0 means the player does not play at that time)
IntVar[][] matches;

我的主要问题是,通过这种设置,我无法想出定义我的问题的方法。我已经花了几天时间在这上面但没有成功。我的问题似乎有点相似,但应该组合的不同元素的数量较少,通常是 1 或 2 个,但在我的问题中有 3 个:球员、时间段和球场。

在花费了大量时间之后,我无法得到比这更进一步的信息:

for (int player = 0; player < nPlayers; player++) {
    for (int timeslot = 0; timeslot < nTimeslots; timeslot++) {
        for (int playerUnavailbleTimeslot : unavailability[player]) {
            if (playerUnavailbleTimeslot != timeslot) {
                solver.post(IntConstraintFactory.arithm(matches[player][playerUnavailbleTimeslot], ">=", 0));
            } else {
                for (int i = 0; i < matchDuration; i++)
                    if (playerUnavailbleTimeslot - i >= 0)
                        solver.post(IntConstraintFactory.arithm(matches[player][playerUnavailbleTimeslot - i], "=", 0));
            }
        }
    }
}

IntVar matchesSum = VariableFactory.enumerated("Matches sum", 1 * matchDuration, nCourts * matchDuration, solver);
for (int player = 0; player < nPlayers; player++) {
    solver.post(IntConstraintFactory.sum(matches[player], matchesSum));
    //solver.post(IntConstraintFactory.nvalues(matches[player], VariableFactory.fixed(2, solver)));
}

第一个双循环只是将玩家不可用的时间段强制为 0(加上基于比赛持续时间值的范围),并且大于或等于玩家可用的时间段。这样最终的矩阵开始看起来像这样:

0 0 ? ? ? 0 ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? 0 0 0 0 ?
.........................

然后我只需确保每个球员的时间段中的值之和介于数字最低的球场乘以比赛持续时间和数字最高的球场乘以比赛持续时间之间。这是我想到的限制之一,所以每一行看起来像这样,例如,玩家 0 在 2 号球场的 3 和 4 时隙进行比赛:

0 0 0 2 2 0 0 0 0 0 0 0 

我尝试定义约束nvalues这应该强制执行不超过n不同的值符合数组,但如果我像上面看到的那样使用它,问题只会呈现一种解决方案(什么?!)。

但是我需要定义更多约束,我什至不知道如何开始:

  • 对于每一行,如果确实分配了球员所在的球场,则该球场必须具有连续的编号
  • 对于每一行,我只能有 0 和法院编号 [1 - nCourts]
  • 列应该配对以创建一对玩家之间的匹配。
  • 同一场地在同一时段范围内不能配对多次(意味着同一场地内最多只能进行一场比赛)

这就是我能想到的所有限制,但我确信还有更多。

我希望有任何建议可以帮助我继续这样做,因为现在我感觉完全无能为力,而且网上关于 Choco 的信息几乎为零,可以帮助我解决这个问题。


我会先用数学写下你想要的东西。

不确定这是否有帮助,但这是我的实现,将其作为数学编程问题来解决。它没有使用约束编程,但事情看起来与您在 Choco 中所做的类似:

我尝试最大化玩家的最小游戏次数,这样我们就不会有人玩零游戏。人们可以想到许多变化,例如不总是与同一个人比赛等。

结果如下:

表中的数字为法院编号(-1表示不允许)。在这个赛程表中,每个人都打三场。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Choco 建模网球比赛 (CSP) 的相关文章

随机推荐

  • 不使用 JS 防止图像可拖动或可选择

    有谁知道如何在 Firefox 中同时使图像不可拖动且不可选择 而不需要求助于 Javascript 看似微不足道 但问题是 可以在 Firefox 中拖动并突出显示 所以我们添加了这个 但是拖动时图像仍然可以突出显示 所以我们添加这个来解
  • 如何在 .map 函数中访问张量形状?

    我有多个长度的音频数据集 我想在 5 秒窗口内裁剪所有音频 这意味着 240000 个元素 采样率为 48000 因此 加载 tfrecord 后 我正在执行以下操作 audio sr tf audio decode wav image d
  • 测试 JavaScript 中是否有未定义的内容

    我正在查if response 0 title undefined 但我收到错误 未捕获的类型错误 无法读取未定义的属性 标题 response 0 未定义 检查是否已定义 然后检查其属性标题 if typeof response 0 un
  • Kotlin 不理解 ViewModelProviders.of(activity ?:fragment)

    在我的里面Fragment我初始化一个ViewModel using ViewModelProviders 我想让它采取它的Activity if not null 否则本身 Fragment private val viewModel M
  • 报告已完成的冲刺

    想要构建一份报告 显示每个团队成员在每个已完成的 Sprint 中的贡献百分比 我们将工作分解为 任务 并分配 剩余工作 值来指示所需的时间 那么问题是 随着冲刺的进行 剩余价值是明确的或减少的 一直在寻找一种方法来找到原始剩余价值 这样我
  • IntelliJ、Akka 和配置文件

    使用时akka http akka io 我放置akka conf in src main resources 当我run通过 sbt akka conf被正确识别 但当我运行 IntelliJ 时却没有 即使在gen idea 实现这一目
  • 围绕 glutMainLoop 执行程序的其余部分?

    我目前正在开发一个项目 其中有一个 android 应用程序 我在 PC 上的 OpenGL 窗口中编写了控件和对象 我已经让 OpenGL 窗口执行我想要的操作 并且我从 Android 设备获取了数据以流式传输到终端 但是我需要将数据传
  • 如何知道我正在使用 ndk-build 构建哪个 API 级别?

    我试图更好地理解使用 ndk build 时 api 级别的选择是如何工作的 我知道我可以明确设置APP PLATFORM in 应用程序 mk 否则 ndk build 将针对清单中指示的 apiandroid minSdkVersion
  • 尝试计算盒子的分数时小数精度损失

    我有一个场景 我有一个包含 3 个罐头的标准盒子 出于显示和查询的目的 我必须以其标准配置的十进制数量进行报告 不可能说1盒3罐 1盒2罐 等等 例如 最初我会有1盒3罐然后我移除 1 个罐子 结果是0 66 循环盒 3 罐然后我再移除 1
  • 在会话中检索并保存 gridview

    当我在文本框中写入我的名字时 我有一个用于搜索的页面 例如 它将搜索并在 GridView 中显示结果 我正在使用一个EntityDataSource with a QueryExtender所以我没有用C 编写任何代码 问题是 在 Gri
  • 使用 toYaml 进行 helm 模板化

    我有values yml 文件 它接受具有以下格式和默认值的端口列表 Ports number 443 protocol http 输出用作输入的端口列表的脚本给出了以下格式 port list get ports sh output 80
  • 在我自己的自定义 appSettings 上使用 foreach 所需的代码

    我搜索了该网站 但没有找到我想要的内容 接近 但没有雪茄 基本上我想要一个像这样的配置部分
  • 有没有文档描述 Clang 如何处理过多的浮点精度?

    当唯一允许使用的浮点指令是 387 指令时 几乎不可能 以合理的成本提供严格的 IEEE 754 语义 当人们希望让 FPU 工作在完整的 64 位有效数上时 这尤其困难 以便long double类型可用于扩展精度 通常的 解决方案 是以
  • 我可以通过 ssh 将 ssh 用户名与 git 的提交关联起来吗?

    我正在尝试通过 ssh 设置共享 git 存储库 将用户公钥复制到authorized keys 我真的希望 ssh key 中的 用户名 成为存储库中提交历史记录的一部分 这样用户 joe 就不能将他的名字设置为 kate 我们需要某种责
  • 如何清除Android应用程序中的所有活动

    我的应用程序有许多可以按任何顺序调用的活动 活动历史示例 A gt B gt C gt D gt A gt B gt E 现在在活动 E 中 我正在 注销 设备 注销用户 并删除他们可能已下载到 SD 卡的任何数据 期望的行为是应用程序 重
  • 使用 C 与 OpenMP 求和

    我已经尝试并行化这段代码大约两天了 但一直出现逻辑错误 该程序是使用非常小的 dx 之和来求积分的面积 并计算积分的每个离散值 我正在尝试使用 openmp 来实现这一点 但实际上我没有使用 openmp 的经验 我需要你的帮助 实际目标是
  • javascript - 全局变量不起作用

    我想保存一个变量 以便多个函数可以使用它 我按照 w3schools 的指示进行操作 但不起作用 我是不是忘记了什么 先感谢您 var name document getElementById name value function com
  • 将 bash 脚本转换为 python(小脚本)

    我有一个在 Linux 环境中使用的 bash 脚本 但现在我必须在 Windows 平台上使用它 并且希望将 bash 脚本转换为可以运行的 python 脚本 bash 脚本相当简单 我认为 我尝试通过 google 转换它 但无法成功
  • Python 中的 ZeroMQ 和多个订阅过滤器

    我想使用一个套接字使用 Python 中的 ZeroMQ 订阅多个过滤器 sock setsockopt zmq SUBSCRIBE first filter sock setsockopt zmq SUBSCRIBE second fil
  • 使用 Choco 建模网球比赛 (CSP)

    我正在尝试用 Choco 建模一个问题 以获得网球赛事 或任何运动 中可能的比赛组合 我尝试这样做的方式如下 Set of timeslots when the event is held i e 10am 10pm int nTimesl