l52679 2024-02-28 10:40 采纳率: 61.5%
浏览 26
已结题

求单库优化调度代码(动态规划)

水库用于发电、生态、城镇、农业供水,发电尾水用于生态、城镇和农业,发电尾水无法满足用水时增加发电量,反之减少发电量。
1.发电水量由发电量反算(主要用到上水位与下水位,下水位为定值,上水位由发电前库容对应水位与发电后库容对应水位取均值,水位库容曲线已知,此处涉及发电水量循环引用)
2.水量平衡约束,六月份库容在1亿方左右
3.出库水量还有水库的漏损量,漏损量计算为上时段末库容抛去漏损量的库容若小于死库容则本时段漏损为0,反之本时段漏损为库容乘漏损率(漏损率为常数,可先自行设定,标注出来)
4.供水要求不破坏死库容
要求,能够从外部文件导入生态、城镇和农业需水以及逐月来水量
调度时段为月,1-12个月
最终得到符合要求的逐月发电量(即发电计划)
(最大蓄水库容、初始库容、死库容等相关需要参数自行设定,标注出来方便后续修改)
最好是Python或者matlab编写

  • 写回答

17条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-02-28 10:41
    关注

    🌈🌈🌈参考通义千问和郭老师的小迷弟雅思莫了-编写提供🌈🌈🌈
    您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复,直到您满意为止。

    以下是一个基于动态规划进行水库调度的Python代码示例。我们在这个例子中假设了最大库容、最大发电量、初始库容和需水量,以及每个月的来水量。在每个时刻,我们根据当前库容和来水量,选择一个发电量,目的是让总发电量最大并满足需水量和水位约束。

    import numpy as np
    
    v_max = 1e8                # 最大库容
    v_min = 0                   # 最小库容
    q_max = 1e7                # 最大发电量
    dt = 30 * 24 * 60 * 60        # 时步,一个月
    q0 = 0                     # 初始发电量
    v0 = 0.5 * v_max             # 初始库容
    demand = np.full((12,), 1e6) # 需水量
    inflow = np.random.uniform(0, 2e6, (12,)) # 来水量
    
    dp_table = np.ones((12, int(v_max)+1)) * -1   # 动态规划表
    
    def dp(month, v):
        if v < v_min or v > v_max:
            return -float('inf')   # 当前水位不满足约束,返回-无穷
    
        if month >= 12:
            if np.abs(v - 1e8) < 1e7: # 六月份库容在1亿方左右
                return 0
            else:
                return -float('inf')
    
        if dp_table[month, v] >= 0:
            return dp_table[month, v]   # 如果已经计算过,直接返回
    
        q_max_feasible = min(q_max, (v - v_min + inflow[month]) / dt)   # 可行的最大发电量
        best_q = 0
        best_val = -float('inf')
        for q in np.linspace(0, q_max_feasible, num=100):
            if q < demand[month]:    # 如果发电量无法满足需水量,减少发电量
                continue
            next_v = v + dt * (inflow[month] - min(q, demand[month]))   # 计算下个月的库容
            val = q + dp(month + 1, int(next_v))
            if val > best_val:
                best_val = val
                best_q = q
    
        dp_table[month, v] = best_val   # 保存到动态规划表
        return best_val
    
    # 调度开始
    v = v0  # 初始库容
    dp(0, int(v))  # 进行动态规划,计算各个月份的最佳发电量
    for month in range(12):
        v = int(v)
        q = dp_table[month, v] - dp_table[month + 1, min(int(v + dt * (inflow[month] - demand[month])), int(v_max))]  # 计算发电量
        print(f"Month {month + 1}, power generation {q:.2f}, water level {v:.2f}")
        v = v + dt * (inflow[month] - min(q, demand[month]))  # 更新库容
    
    

    上述python代码仅作为实现思路的参考,具体实现可能需要根据你的实际需求进行调整,例如你可能需要从文件中读取需水量和来水量,而不是使用我们在代码中随机生成的值。如果你在对代码进行适用你的具体应用过程中遇到任何困难,请随时给我留言。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(16条)

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 已采纳回答 3月6日
  • 修改了问题 3月1日
  • 创建了问题 2月28日

悬赏问题

  • ¥15 想要写一个跟百度网盘一样文件管理器,打开全部文件夹后 ,一级一级返回
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥30 关于R语言运行分区生存模型中的问题!
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码