0

0

Pyomo教程:如何为动态时间窗口内的请求构建条件能量约束

花韻仙語

花韻仙語

发布时间:2026-01-29 22:40:05

|

155人浏览过

|

来源于php中文网

原创

Pyomo教程:如何为动态时间窗口内的请求构建条件能量约束

本文详解如何在pyomo中高效建模“每个请求仅能在其指定时间窗口内被分配能量”的核心约束,通过索引集(indexed sets)和稀疏变量定义实现逻辑清晰、计算高效的线性规划模型。

在能源调度、任务分配等时序优化问题中,一个常见且关键的建模挑战是:每个请求(request)只能在它自身定义的有效时间区间 ([E_r, L_r]) 内被供电或服务,且总供能必须精确匹配其所需能量(或至少满足最小阈值)。直接在全时域 (t \in \mathcal{T}) 上对所有请求-时段组合定义变量会导致大量冗余(尤其当请求时间窗远小于总时段数时),显著降低求解效率。Pyomo 提供了优雅的解决方案——索引集(Set indexed by another Set)与稀疏变量(sparse variables over filtered pairs)

✅ 正确建模思路:从“全量笛卡尔积”转向“按需稀疏”

你原方案中将 model.request_status[t, r] 定义在完整二维集合 model.t × model.r 上,虽语法合法,但会生成大量无意义的二元变量(例如:r1 的时间窗是 [0,3],却为 t=5 定义了 request_status[5,'r1'])。这不仅浪费内存,更会拖慢求解器预处理与分支定界过程。

理想做法是:仅对“物理上可行”的 (t, r) 组合建模。为此,我们分三步构建:

  1. 预处理数据:构建请求-时段兼容性映射
    使用 Python 字典(如 defaultdict(list))离线计算每个时段 t 允许服务哪些请求 r,或反之。该步骤在建模前完成,不引入额外变量。

  2. 定义索引集 windows[t]:声明每个时段的合法请求子集

    m.windows = pyo.Set(m.T, initialize=eligible_requests, within=m.R)

    此处 m.windows[t] 是一个 依赖于 t 的集合,例如 m.windows[2] = {'r1', 'r2'},明确表达了“时段 2 只能服务 r1 和 r2”。

  3. 定义稀疏决策变量 dispatch[t, r],定义域为 windows_flat

    m.windows_flat = pyo.Set(initialize={(t, r) for t in eligible_requests for r in eligible_requests[t]}, 
                              within=m.T * m.R)
    m.dispatch = pyo.Var(m.windows_flat, domain=pyo.NonNegativeReals)

    这确保 dispatch 仅在合法 (t,r) 对上存在,变量数量从 |T|×|R| 降至实际可能的交互数(常减少 50%–90%)。

? 核心约束:时间窗内能量守恒

假设 request_energy_needed_dict[r] 表示请求 r 所需总能量(kWh),sampling_period_dict[t] 是时段 t 的持续时间(小时),则功率 dispatch[t,r](kW)在时段 t 提供的能量为 dispatch[t,r] * sampling_period_dict[t]。

ONLYOFFICE
ONLYOFFICE

用ONLYOFFICE管理你的网络私人办公室

下载

要确保:若请求 r 被满足(satisfied[r] == 1),则其在自身时间窗内获得的总能量 ≥ 所需能量;否则可为 0。对应约束如下:

@m.Constraint(m.R)
def request_satisfied(m, r):
    # 动态获取请求 r 的所有可行时段:遍历 m.T,筛选出 r ∈ m.windows[t] 的 t
    feasible_times = [t for t in m.T if r in m.windows[t]]
    # 总供能 = Σ dispatch[t,r] * Δt[t],必须 ≥ satisfied[r] * required_energy[r]
    total_energy_provided = sum(m.dispatch[t, r] * m.sampling_period_dict[t] 
                                for t in feasible_times)
    return total_energy_provided >= m.satisfied[r] * m.request_energy_needed_dict[r]
⚠️ 注意事项: m.sampling_period_dict 需定义为 pyo.Param(m.T, ...),与 m.T 索引一致; 若希望严格等于(而非 ≥),可将 >= 改为 ==,但通常 ≥ 更符合“最大化满足数”的目标(允许超额供电,只要不超限); 若需同时限制最大功率 request_max_power_dict[r],可追加约束:m.dispatch[t, r]

? 完整约束体系与最佳实践

除上述核心约束外,一个健壮的能源分配模型还需:

  • 时段供应上限(防止超用):

    @m.Constraint(m.T)
    def supply_limit(m, t):
        return sum(m.dispatch[t, r] for r in m.windows[t]) <= m.available_supply[t]
  • 二元状态一致性(避免“部分满足”歧义):

    @m.Constraint(m.R)
    def satisfied_implies_dispatch(m, r):
        # 若 satisfied[r] == 1,则至少一个 dispatch[t,r] > 0(可选,增强整数性)
        feasible_times = [t for t in m.T if r in m.windows[t]]
        return sum(m.dispatch[t, r] for t in feasible_times) >= m.satisfied[r] * 1e-6
  • 目标函数建议
    原目标 sum(model.booked_supply[t]) 易导致“填满时段”而非“满足高价值请求”。更推荐:

    m.obj = pyo.Objective(expr=sum(m.satisfied[r] * priority_weight[r] for r in m.R), 
                          sense=pyo.maximize)

    其中 priority_weight[r] 可设为请求能量、经济价值或紧急度,使优化更具业务意义。

✅ 总结:为什么这个方案更优?

方案 变量规模 求解效率 逻辑清晰度 可扩展性
全笛卡尔积(原始) (O( T \times R
索引集 + 稀疏变量(本文) (O(\text{有效时段总数})) 高(求解器自动剪枝) 高(语义即约束) 优(轻松支持万级请求)

通过将业务规则(时间窗)前置到集合定义层,而非后置到约束表达式中,模型既保持了数学严谨性,又获得了工程级的性能与可维护性。这是 Pyomo 高阶建模的核心范式之一。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

787

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1129

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

803

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2355

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

823

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1626

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

1640

2023.08.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号