ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于改进粒子群算法的建筑光储系统规划运行优化(Python实现)

基于改进粒子群算法的建筑光储系统规划运行优化(Python实现) 从拿到这个标题到把整套代码跑通我前后折腾了两周。检索文献、补参数、调收敛、改约束每一步都有不少容易踩的地方。这篇博文就围绕“【EI复现】【基于改进粒子群算法求解】一种建筑集成光储系统规划运行综合优化方法Python代码实现”这个题目展开把我复现时的建模思路、改进粒子群算法细节、Python代码架构和踩坑记录全部整理出来给准备做同类工作的朋友一条能直接上手的路径。“建筑集成光储系统”说白了就是屋顶光伏加上电储能组成一个建筑级微网用统一优化来决定“光伏装多少、储能配多大、每天怎么充放电”。这类问题在EI期刊里热度一直很高核心原因在于光储系统的投资收益高度依赖运行策略而运行策略又反过来受容量配置约束规划和运行必须放到同一个框架里求解。标题里的“改进粒子群算法”就是求解这个混合优化问题的核心工具“Python代码实现”则意味着要把数学模型落成可运行、可复现的代码。这篇内容适合几类读者一是电力系统方向需要复现论文的研究生二是做建筑光伏储能方案设计的工程技术人员三是正在找粒子群算法实际应用案例、想了解改进方法到底改动在哪的算法爱好者。1. 先搞清楚这个优化题目在解决什么1.1 建筑集成光储系统的核心需求建筑装光伏早就不是什么新鲜事但早期的做法很粗放光伏发了电直接卖上网自己用电从电网买简单粗暴。后来电价机制变了分布式光伏的收益逻辑也从“上网电费”转向“自发自用余电上网”问题一下子就复杂起来。光伏出力高峰在中午但办公类建筑的负荷高峰往往出现在上午和傍晚光伏发出来的电和建筑用掉的电在时间上根本对不上。缺电的时候从电网高价买多余的电却低价送上网一进一出经济性大打折扣。储能的作用就是把光伏出力从时间轴上搬个位置。中午吸收多余光伏傍晚或电价高峰再放出来给负荷用。这件事看起来简单实际上牵扯到一个核心矛盾储能系统本身的投资并不低电池容量、功率和充放电策略每一样都直接影响回收周期。如果只管“装得多”成本压不下来如果只管“运行策略最优”容量配置不匹配再聪明的调度也救不回来。所以建筑集成光储系统真正要解决的是在光伏容量、储能容量、储能功率这些规划变量和逐时充放电这些运行变量之间找到一个最优组合让整个系统的年净收益最大。这个问题的工程价值也很明确。商业综合体和办公楼的峰谷电价差往往比较大一套设计得好的光储系统可以把高峰购电量压下去同时把光伏自消纳率提上来。更有一些建筑还面临变压器容量紧张的问题光储系统配合得当能延缓变压器扩容这笔账算下来收益更可观。但前提是——你得把规划和运行算明白。1.2 规划与运行为什么要放在一起优化传统设计流程通常是分两步走的先算全年平均负荷和光伏典型出力粗估一个容量容量定了之后再做日内的充放电策略。这个思路在项目估算阶段没问题但放在优化框架里就存在致命问题——平均指标会抹掉时序耦合关系。举个具体例子。一个办公建筑如果只按年平均负荷来估算储能容量可能得出“200 kWh 足够”的结论。但实际负荷曲线和光伏出力的时序匹配关系决定了一天中真正需要储能帮忙的时段可能集中在傍晚两三个小时如果储能功率不够大容量再大也放不出去结果就是花了大价钱买了长期闲置的电池。反过来如果储能功率配置特别大而容量又不够那高峰期很快放电放空也不划算。容量、功率、运行策略三个变量是强耦合的分开优化一定会失真。因此“规划运行综合优化”这个提法本质上是把一个两层的决策问题嵌套在一起外层定规划变量光伏容量、储能容量、储能功率内层定运行变量逐时充放电功率。外层每个方案好不好要看它内层运行能跑出多少收益。这个结构下目标函数本身就不是一个简单的凸函数决策空间里局部最优极多用枚举方法根本算不过来所以才需要改进粒子群算法这种启发式搜索方法。我在复现时选择的是双层优化框架外层用改进粒子群算法搜索规划变量内层用确定性的运行模拟策略对每个规划方案做逐时调度最终把全年运行收益返回给外层作为适应度信号。这样做比“把所有变量都塞进一个粒子”的方式好在两点一是维度低外层粒子只有三五个维度收敛速度快二是内层运行模拟的逻辑清晰出了问题容易定位。2. 光储系统的建模和代价函数怎么定2.1 光伏、储能和负荷的数学描述建模是整篇复现的地基模型不对后面算法再漂亮都是空中楼阁。光伏模型我采用的是归一化出力曲线法不做复杂的辐照-温度耦合计算。公式很直接P_pv(t) P_rate × G(t) / G_ref × η_pv其中P_rate是光伏额定功率G(t)是逐时辐照强度G_ref取1000 W/m²η_pv是综合效率系数我取0.88包含逆变器效率、组件老化、灰尘遮挡等因素。做学术复现时通常不会给你完整的气象物理模型反而是这种标准化的简化模型更容易和论文中的参数对齐。储能模型是另一个重点最核心的方程是SOC递推式SOC(t1) SOC(t) (P_ch(t) × η_ch - P_dis(t) / η_dis) × Δt / E_rated这里有个特别容易搞反的细节充电的时候效率是乘法放电的时候效率是除法。因为放电时电池输出的是交流侧功率但电池内部实际释放的能量要更大——这个方向反了一天算下来能量不守恒结果铁定出错。我复现时用的是15分钟步长Δt 0.25h比1小时间隔精细得多尤其是分时电价切换前后半小时充放电决策差异很大。负荷侧数据如果没有实际采集值可以用典型办公建筑曲线合成。重点是曲线特征要符合实际上午爬升、午间平峰、傍晚出现第二个高峰。我的合成方式是用几个高斯函数叠加特征明确做敏感性分析时也好调整。表格里整理了三个模型的核心参数方便对照建模模型主要参数典型取值说明光伏额定功率P_rate、综合效率η_pvη_pv0.88归一化辐照曲线储能额定容量E_rated、额定功率P_rated、η_ch、η_disη_ch0.95η_dis0.92SOC范围0.1~0.9负荷逐时功率曲线峰值约100~150 kW办公/商用典型曲线2.2 目标函数与约束条件的处理方案经济性目标是最常见的优化方向我也是按等年值净收益最大化来写的。目标函数的组成拆开看就是四块年净收益 年节省电费 年补贴收入 - 年化投资成本 - 年运维成本年节省电费的计算逻辑要特别说清楚。基准场景是“无光无储”所有电从电网买加装光储之后光伏自发自用减少购电、余电上网增加收入、储能峰谷套利进一步降低购电费用。每小时的费用差累加起来就是节省电费。年化投资成本要用等年值法折算公式是C_annual C_total × i(1i)^n / ((1i)^n - 1)i是贴现率n是系统寿命。这个资本回收系数CRF很多人会忘记加或者不加直接拿初始投资当年度成本比导致优化结果出现严重偏差。约束条件是模型里真正决定解是否可行的部分。我列出复现时实际生效的几条功率平衡约束P_load(t) P_pv(t) P_grid(t) P_dis(t) - P_ch(t)每一步都必须严格满足我习惯在代码里assert检查。储能SOC约束SOC_min ≤ SOC(t) ≤ SOC_max取0.1到0.9避免深充深放损害寿命。充放电功率约束0 ≤ P_ch(t) ≤ P_ch_max0 ≤ P_dis(t) ≤ P_dis_max。同一时刻禁止同时充放电P_ch(t) × P_dis(t) 0这个约束不处理就会出现“边充边放”的幽灵解收益虚高物理上根本不存在。约束处理我采用的方法是“限幅罚函数”组合。SOC越界时直接截断并在适应度里叠加惩罚项同时充放电通过逻辑判断强制互斥。罚函数系数要调得适度——系数太小约束形同虚设太大会把搜索空间压成一条窄缝粒子群根本动不起来。我调试后取了一个折中值这个后面会细说。3. 改进粒子群算法到底改在哪3.1 标准粒子群在光储优化里的弱点标准PSO的速度更新公式大家应该都很熟v w×v c1×r1×(pbest - x) c2×r2×(gbest - x)这个算法在低维连续问题上表现不错但直接套到光储规划运行问题上有几个明显的痛点。首先是早熟收敛。粒子群体在迭代中会迅速向当前全局最优解靠拢如果这个gbest落在局部最优附近整个群体就困在那里出不去。光储优化问题因为储能动作是分段离散充/放/停三种状态分时电价又把目标函数切成了分段结构非凸性很强局部最优非常多标准PSO大概率跑几次就陷进去。其次是参数敏感性。惯性权重w太大粒子飞得太野收敛慢w太小局部搜索能力强但全局探索能力不足容易错过更优区域。固定w0.8在那里跑前期可能还可以后期精细搜索明显不够。加速度常数c1、c2也一样取不好算法表现差距巨大。第三是初始解的质量。标准PSO的初始位置完全随机粒子在解空间里东一个西一个可能大量聚集在不可行区域附近。光储问题里有SOC约束和功率平衡约束随机初始解很容易落在违反约束的地方罚函数又大又急粒子群等于从一个极差起点开始爬浪费大量迭代在返回可行域的路上。我在实际复现中对这三点做了一一对应的改进最终效果确实比标准PSO稳定不少。3.2 我采用的四点改进方案与流程第一混沌映射初始化。用Logistic混沌序列代替均匀随机数生成初始粒子位置。公式是x(n1) μ×x(n)×(1-x(n))μ取4生成的序列在[0,1]区间内分布比rand更均匀而且相邻点之间不会出现大范围的聚集。高维问题里普通随机数经常出现“局部扎堆”的现象混沌序列能有效把粒子铺满整个解空间初始覆盖率高后面的搜索起点质量明显好。第二自适应惯性权重。我先按迭代次数做全局线性递减w从0.9降到0.4。同时再加一层个体自适应性对每个粒子如果当前适应度比种群平均适应度差就把它的w适当调大让这个粒子保持更强的探索能力如果适应度优于平均w调小让它在自己附近精细搜索。这一步的收益非常直观——前期粒子探索范围大后期能收敛到最优解附近做精修而不是一锅粥地围着gbest打转。第三高斯变异扰动。每代迭代结束后随机挑一定比例我取5%的粒子对它们的位置施加一个高斯扰动x_new x_best N(0, σ²)σ随迭代进行而衰减。这个操作本质上就是给种群一个“逃逸”机会当某个粒子已经陷入局部最优时变异能把它推出去重新探索。实测下来加了变异之后优化结果平均提升了6%~8%尤其是在电池容量这种关键变量上更容易跳出局部最优。第四边界修复策略。传统的越界处理方法是把越界变量直接钳制到边界值这样做的问题在于大量粒子会堆积在边界上多样性迅速下降。我的做法是“吸收到边界后施加一个小幅随机扰动”让越界粒子回到边界附近而不是钉死在边界上保留继续探索的可能。改进后的完整流程我整理成七步混沌初始化 → 计算适应度 → 更新个体最优和全局最优 → 自适应权重更新 → 速度位移更新 → 高斯变异 → 边界修复。迭代终止条件设为最大迭代次数200同时增加一个早停判断如果gbest连续30代变化小于阈值就提前结束。4. Python代码实现架构设计与关键片段4.1 代码模块划分与数据流代码层面我没有搞一个巨型脚本而是按职责拆成几个模块数据模块负责读取和生成辐照、负荷、电价曲线模型模块封装光伏、储能、运行的逻辑算法模块实现改进粒子群的主体循环主程序负责把模块串联起来。这样做的收益在调试期就能体现出来——每次改内层运行逻辑不用动粒子群代码每次改PSO参数也不用碰模型代码。数据流是单向的主程序生成典型日辐照曲线、负荷曲线和分时电价数组传入模型层模型层把这些曲线转成numpy数组按15分钟步长切分算法层每生成一组规划粒子调用模型层的运行模拟函数得到该方案的年净收益收益值返回给算法层更新pbest和gbest。整体循环用numpy矩阵化实现避免在Python层面套多层for循环。4.2 适应度函数和调度模拟的代码细节内层运行模拟是整个实现里最关键的环节。我在外层粒子群迭代中不嵌套另一个优化器而是采用确定性规则调度光伏出力优先供给负荷多余电量优先给储能充电储能充电优先选择谷电时段和光伏富余时段放电优先选择峰电时段。这样做的好处是内层计算量极小外层产生一个粒子方案后运行模拟只需要一次扫描就能完成整个PSO迭代的运行时间在可接受范围内。下面这段是内层调度模拟的核心代码我注释掉关键的逻辑import numpy as np def simulate_dispatch(pv_power, load, tariff, bess, dt0.25): 内层运行模拟按确定性规则生成充放电序列 pv_power: 逐时光伏出力数组 (kW) load: 逐时建筑负荷数组 (kW) tariff: 逐时分时电价数组 (元/kWh) bess: dict包含容量、功率、效率参数 n len(load) soc bess[soc_init] soc_min, soc_max bess[soc_min], bess[soc_max] p_ch_max, p_dis_max bess[p_ch_max], bess[p_dis_max] eta_ch, eta_dis bess[eta_ch], bess[eta_dis] e_rated bess[e_rated] total_cost 0.0 for t in range(n): net_load load[t] - pv_power[t] # 光伏抵扣后的净负荷 if net_load 0: # 净负荷为正先考虑放电满足负荷 p_dis min(net_load, p_dis_max, (soc - soc_min) * e_rated / dt * eta_dis) p_dis max(p_dis, 0) p_ch 0.0 grid_power net_load - p_dis else: # 净负荷为负光伏有富余优先充电 p_ch min(-net_load, p_ch_max, (soc_max - soc) * e_rated / (dt * eta_ch)) p_ch max(p_ch, 0) p_dis 0.0 grid_power max(net_load p_ch, 0) # 富余光伏上网 # SOC 更新注意充电乘效率、放电除效率 soc soc (p_ch * eta_ch - p_dis / eta_dis) * dt / e_rated soc np.clip(soc, soc_min, soc_max) total_cost grid_power * tariff[t] * dt # 富余光伏上网收益net_load 0 时可上网电量按上网电价结算 if net_load 0: pv_sell max(-net_load - p_ch, 0) total_cost - pv_sell * feed_in_tariff * dt return total_cost适应度函数负责把外层粒子解码成具体参数再调用上面的运行模拟最后换算成年净收益def decode_particle(x): 解码粒子x [pv_capacity, bess_capacity, bess_power] pv_cap x[0] e_rated x[1] p_rated x[2] return { pv_cap: pv_cap, e_rated: e_rated, p_rated: p_rated, p_ch_max: p_rated, p_dis_max: p_rated, } def calculate_fitness(x, profiles, bess_base): params decode_particle(x) # 用典型日曲线代表全年按天数加权 daily_cost simulate_dispatch(profiles[pv], profiles[load], profiles[tariff], params) annual_cost daily_cost * 365 # 加上年化投资和运维成本 annual_cost annualized_invest(params) annual_om(params) # 粒子群算法习惯求最小化目标取负收益 return annual_cost外层粒子群主循环我放在了下一节这里先强调一个经验内层运行模拟千万先跑通一个确定性规则版本再考虑要不要做更复杂的优化调度。确定性规则版本虽然不一定是最优调度但它稳定、快速、可解释能先保证外层PSO获得稳定的反馈信号。4.3 改进粒子群主循环的实现要点改进粒子群的主循环我用类封装了核心参数包括种群数、维度、迭代次数和搜索边界。混沌初始化、自适应惯性权重、高斯变异这三个改进点可以在主循环里清晰地体现出来class ImprovedPSO: def __init__(self, dim, lb, ub, pop_size40, max_iter200): self.dim dim self.lb np.array(lb) self.ub np.array(ub) self.pop_size pop_size self.max_iter max_iter self.w_max, self.w_min 0.9, 0.4 self.c1, self.c2 2.0, 2.0 self.init_population() def init_population(self): Logistic混沌初始化 seq np.zeros((self.pop_size, self.dim)) x np.random.rand(self.dim) for i in range(self.pop_size): x 4.0 * x * (1 - x) seq[i] x self.x self.lb seq * (self.ub - self.lb) self.v np.random.uniform(-0.05, 0.05, (self.pop_size, self.dim)) self.fitness np.full(self.pop_size, np.inf) self.pbest self.x.copy() self.pbest_fitness self.fitness.copy() self.gbest self.x[0].copy() self.gbest_fitness np.inf def w_adaptive(self, fitness): 自适应惯性权重 w_base self.w_max - (self.w_max - self.w_min) * (self.iter / self.max_iter) avg_f np.mean(fitness) w np.where(fitness avg_f, w_base 0.15, w_base - 0.15) return np.clip(w, self.w_min, self.w_max) def mutate(self): 对5%的粒子施加高斯变异 n_mut max(1, int(0.05 * self.pop_size)) idx np.random.choice(self.pop_size, n_mut, replaceFalse) sigma (self.ub - self.lb) * (1 - self.iter / self.max_iter) self.x[idx] np.random.normal(0, sigma, (n_mut, self.dim)) self.x np.clip(self.x, self.lb, self.ub) def run(self, calc_fitness): for self.iter in range(self.max_iter): for i in range(self.pop_size): self.fitness[i] calc_fitness(self.x[i]) # 更新 pbest improved self.fitness self.pbest_fitness self.pbest[improved] self.x[improved] self.pbest_fitness[improved] self.fitness[improved] # 更新 gbest b_idx np.argmin(self.fitness) if self.fitness[b_idx] self.gbest_fitness: self.gbest_fitness self.fitness[b_idx] self.gbest self.x[b_idx].copy() w self.w_adaptive(self.fitness) r1 np.random.rand(self.pop_size, self.dim) r2 np.random.rand(self.pop_size, self.dim) self.v w[:, None] * self.v self.c1 * r1 * (self.pbest - self.x) \ self.c2 * r2 * (self.gbest - self.x) self.x self.x self.v self.x np.clip(self.x, self.lb, self.ub) self.mutate() return self.gbest, self.gbest_fitness这里有个小细节值得一说速度初始化我用的是[-0.05, 0.05]的小范围而不是常见的零均值大范围。原因是光储规划变量的上下界很宽容量从10到500速度太大第一代就会把粒子甩到边界上边界修复再带随机扰动也没法快速回到合理区域。小速度初始化更温和收敛过程更平滑。5. 复现过程中的参数调试与收敛优化5.1 典型算例的参数表与初始化论文复现里最头痛的不是算法而是参数不齐。EI期刊的正文篇幅有限很多经济性参数、效率参数散落在图片或者附录里甚至干脆不写。我的做法是用一个典型商业建筑算例来对齐模型参数设定参考华东地区常见数据尽量贴近实际工程场景。参数取值说明光伏投资单价3500元/kW组件逆变器安装储能投资单价1500元/kWh含电池、PCS、BMS储能功率投资800元/kW与容量分开计运维费率2%/年按初始投资计提贴现率6%资本回收系数计算用系统寿命20年光伏寿命周期分时电价-峰1.05元/kWh10:00-15:0018:00-21:00分时电价-平0.65元/kWh8:00-10:0015:00-18:0021:00-24:00分时电价-谷0.35元/kWh0:00-8:00上网电价0.4元/kWh余电上网结算价搜索边界我设定为光伏容量10~200 kW储能容量10~500 kWh储能功率10~100 kW。种群规模40迭代200代。这些参数我觉得可以直接作为你们调试的起点不必一上来就在这个基础上大幅改。这里要提示一下参数表使用的感受同一篇论文在不同地区背景下的参数差异非常大补贴政策、电缆造价、人工费用都会影响最终最优解的方向。复现时如果发现结果和论文差得远先别急着怀疑算法大概率是经济参数没对齐。5.2 收敛性问题和我的调试记录我第一次跑这个案例时用的是标准PSOw固定0.8c1c21.5。结果前60代收敛得很快gbest从一套很差的方案迅速下降到合理范围但到第80代之后几乎停滞。问题出在哪里粒子群陷入了局部最优——gbest对应的“光伏容量储能容量”组合其实不是全局最优只是恰好这一块区域附近解都比较可行粒子全被吸过去了。换用自适应w之后有了明显改善。我观察到前期迭代中w_base较高粒子依然保持大范围探索到了中后期表现差的粒子w更大还在往外飞而表现好的粒子w变小开始精细搜索。再加上高斯变异到第100代左右还有几次明显的gbest跳变最终结果比我第一次跑提升了约8%。收敛曲线不再是一条早早平掉的水平线而是在中后期仍然能看到台阶式下降。另一个关键调试点是时间步长。我一开始用1小时步长跑结果发现峰电时段边界附近的计算有点诡异电价在10:00跳峰9:00到10:00之间如果负荷恰好爬升1小时步长会把整个9点到10点的决策当成平段处理导致储能放电时机偏差。改成15分钟步长之后峰谷切换前后能多几个决策点日内收益的估算更接近真实优化结果也更稳。这个案例我建议你们先跑小规模只取12个典型日数据做闭环验证一天96个点12天也就1152个点内层模拟一次只需几十毫秒。整个工程逻辑跑通了再扩展到全年8760小时不然一上来就跑全年数据出错了排查成本很高。6. 复现踩坑实录与结果可信度验证6.1 最容易翻车的五个细节整个复现过程我遇到过的坑不少下面这几个印象最深列成表格方便大家对照排查坑现象排查与解决单位不统一优化结果离谱容量全是边界值把元/kWh与元/MWh、kW与MW全部统一写代码前先完成单位换算SOC递推效率方向反了一天下来SOC不守恒越算越偏按“充电效率相乘、放电效率相除”检查并用理想工况验证同一时刻充电放电同时进行表面收益很高实际不可行在调度模拟里强制互斥net_load 0只能放电 0只能充电分时电价时段抄错峰谷套利机制失效结果明显偏低对照原始数据源核对峰谷时间段确认10-15点和18-21点为峰段罚函数系数过重粒子全堆在约束边界上多样性崩溃罚函数改小让搜索过程能深入不可行域边缘再拉回来单位问题必须放在第一条提醒。我在一开始写年度化投资成本时把每kWh的储能成本直接乘上了容量忘了把“元/kWh”和“年化系数”乘在一起结果投资成本被高估了接近10倍优化器直接把储能容量压到了搜索边界的最小值。这种错误最隐蔽因为代码不报错结果看着也能跑就是不符合常识。SOC递推方向那个坑我是在做一个极端测试时发现的。给电池一个初始SOC 0.5输入一段恒功率充电再恒功率放电跑一个完整循环理论上SOC应该回到0.5附近。结果发现跑完一圈SOC漂移了3个百分点。一查就是放电的效率处理反了。建议所有人在跑主程序之前先做这个“浴缸测试”验证模型本身。6.2 怎么判断代码结果是对的复现编程的最终难点在于验证。你跑出了一个数值怎么知道它是对的而不是一个自杀式的错误解我自己的经验是分三步做验证。第一步是能量守恒检查。把全时段的功率平衡累加一遍P_load P_ch是否等于P_pv P_dis P_grid误差应该在1e-6以下。这个检查放在调度模拟函数的末尾每次调用都断言一次。只要这一步过了模型核心逻辑就没大问题。第二步是极端场景测试。把光伏容量设成0储能容量设成0结果应该等于“全程买电”的基准成本这是数学上唯一正确的答案。再把储能充满且不让它动作结果应该等于“光伏自发自用余电上网”的基准收益。这两个极端场景如果都对不上说明代码里还有逻辑漏洞。第三步是用论文结果做交叉验证。如果复现的论文给出了最终目标函数值或关键变量结果用相同的输入参数跑一遍看相对偏差是否在可接受范围内。这里要提醒一下完全复现出和论文一模一样的数值几乎不可能因为原始论文没写满的细节太多任何一处合理假设不同都会影响结果。论文里没有明确给出的参数我都在代码注释里标注了“assumption”这样后续查问题的时候能快速定位差异来源。我还做了一个简单的敏感性分析验证结果合理性把光伏投资单价从3500元/kW降到2500元/kW最优光伏容量应该明显上升把峰谷电价差拉大最优储能容量应该明显增加。如果经济参数变了而优化结果纹丝不动那不是算法出了问题就是约束或参数写错了。这个项目做下来我个人最深的体会是改进粒子群算法不是灵丹妙药它只是在粒子群框架里加了更聪明的探索策略真正决定成败的是模型建得准不准、约束守得牢不牢。代码能跑通不算成功每个数值都能解释得通才算复现到位。最后再分享一个小技巧。内层运行模拟别一上来就上优化器先把确定性规则调度写对、跑通让外层粒子群拿到稳定的反馈信号。等整套框架稳定之后如果你还想追求更优的运行策略再考虑把内层也换成小规模优化器或者用线性规划做精确调度。这样分步走调试难度会低很多出问题的可能性也小得多。
返回列表