
本文探讨了cpmpy库中累积约束(cumulative constraint)在使用ortools求解器时遇到的性能瓶颈,特别是在大规模非抢占式任务调度场景下,求解时间随任务数量呈指数级增长。文章揭示了问题源于累积约束的线性松弛实现,并指出cpmpy已通过更新解决了这一性能问题,显著提升了求解效率。
在约束编程(Constraint Programming, CP)领域,cpmpy 是一个强大且灵活的Python库,用于构建和求解各种优化问题。其中,Cumulative 约束是处理资源受限任务调度的核心工具,它允许我们定义一组任务,每个任务有开始时间、持续时间、结束时间、资源需求,并确保在任何时间点,所有正在运行任务的资源需求之和不超过给定容量。然而,在使用 cpmpy 结合 ortools 求解器处理大规模任务调度问题时,用户可能会遇到显著的性能瓶颈。
我们以一个典型的非抢占式任务调度问题为例:目标是在给定时间范围内,确定完成一系列任务所需的最少机器数量。任务具有相同的持续时间和资源需求(例如,每台机器一次只能处理一个任务)。在实际测试中,当任务数量适度增加时,使用 cpmpy 的 Cumulative 约束与 ortools 求解器结合,求解性能会急剧下降,甚至出现无法在合理时间内找到解决方案的情况。
这种性能下降尤其在以下场景中表现突出:当部分机器已经满负荷运行,而剩余的少量未分配任务的总持续时间小于前几台机器的空闲时间总和时。这意味着求解器需要进行更复杂的推理来分配这些“零散”的任务,从而导致搜索空间急剧膨胀。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
以下是用于模拟此问题的 cpmpy 代码示例:
import cpmpy as cp
import logging
from typing import List
class CumulativeTestModel:
def __init__(self, task_duration: int, nb_tasks: int, end_date: int):
self.model: cp.Model = cp.Model()
# 定义变量
self.objective: cp.IntVar = cp.intvar(0, nb_tasks) # 目标:最小机器数
starts: List[cp.IntVar] = [cp.intvar(0, end_date) for _ in range(nb_tasks)]
durations: List[int] = [task_duration] * nb_tasks
ends: List[cp.IntVar] = [cp.intvar(0, end_date) for _ in range(nb_tasks)]
demands: List[int] = [1] * nb_tasks # 每个任务需求1个资源
# 添加累积约束
self.model += cp.Cumulative(
start=starts,
duration=durations,
end=ends,
demand=demands,
capacity=self.objective, # 机器容量由目标变量决定
)
# 最小化目标变量
self.model.minimize(self.objective)
logging.info(f"Model created with {nb_tasks} tasks.")
def run(self):
solver = cp.model.SolverLookup.get("ortools", self.model)
has_solution = solver.solve()
if not has_solution:
logging.info("No solution found.")
else:
logging.info(f"Solution found: {solver.status()} -> {self.objective.value()}")
if __name__ == &q
uot;__main__":
logging.basicConfig(level=logging.INFO)
# 示例用法
CumulativeTestModel(task_duration=10, nb_tasks=3, end_date=15).run()
CumulativeTestModel(task_duration=10, nb_tasks=5, end_date=25).run()
CumulativeTestModel(task_duration=10, nb_tasks=7, end_date=35).run()
CumulativeTestModel(task_duration=10, nb_tasks=以上就是解决CPMpy中累积约束的性能问题及其优化实践的详细内容,更多请关注其它相关文章!
相关文章:
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
ACG动漫视频网入口 ACG动漫*免费正版观看地址
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
黑猫投诉统一入口官网 消费者权益保护投诉平台
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
韩小圈电脑版在线入口_网页版免费登录地址
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
解决深度学习模型训练初期异常高损失与完美验证准确率问题
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
J*aScript DOM操作:高效清空列表元素的策略与实践
优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
照顾宝贝2小游戏点击立即在线玩
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置
快手官方唯一登录入口 谨防山寨钓鱼网站
学习通在线学习平台 学习通网页版直接进入课程中心
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
微信网页版扫码登录入口 微信网页版二维码登录入口
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
Lar*el Migration:重命名列后添加新列的正确操作顺序
Go语言中构建可靠数据存储的原子性与持久化策略
J*aScript类型检查_j*ascript代码规范
如何提高微信支付的安全性_微信支付安全防护与设置建议
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
在哪找SublimeJ远程工具_SFTP插件配置教程
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
mc.js游戏直达 mc.js网页免下载版本秒进地址
在python-socketio事件处理器中安全访问Flask应用上下文
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
Python实现多节点属性重叠度分析教程
C++ vector二维数组定义_C++ vector of vector用法
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
Go语言中JSON数据解码与字段访问指南