Python Gurobi中使用quicksum实现累加约束的写法问题咨询
你原代码的错误在于gp.quicksum(Git[i,t])仅传入了当期t对应的G参数,没有实现从首个时间点到当前t的前缀累加,正确实现可以参考两种方案:
方案1:直接实时计算前缀和(适合小规模问题)
需要确保time_shifts是按时间升序排列的有序序列,直接在约束中遍历当前时间点之前的所有时间步累加:
con3 = m.addConstrs( (wit[i,t] <= gp.quicksum(Git[i, k] for k in time_shifts[:time_shifts.index(t)+1]) for i in NC for t in time_shifts), name="con3" )
其中time_shifts.index(t)会获取当前时间t在时间序列中的索引,切片[:索引+1]就覆盖了从首个时间点到当前t的所有时间步,完成前缀累加。
方案2:预计算前缀和(适合中大规模问题,性能更优)
提前算好每个i、每个t对应的前缀G值,避免约束添加过程中重复计算索引和遍历时间序列,效率更高:
# 预计算前缀和字典 prefix_G = {} for i in NC: current_cum = 0 for t in time_shifts: current_cum += Git[(i, t)] prefix_G[(i, t)] = current_cum # 直接用预计算的前缀和添加约束 con3 = m.addConstrs( (wit[i,t] <= prefix_G[(i,t)] for i in NC for t in time_shifts), name="con3" )
内容的提问来源于stack exchange,提问作者MingyuSang
相关产品推荐
相关产品推荐

