拓冰建站拓冰建站
首页 / 资讯中心 / 正文

配电网韧性提升:应急移动电源动态调度建模与Matlab复现

配电网韧性这个方向火了挺多年写论文的人多能把复现过程讲明白的人不多。最近我把一篇SCI一区论文的下半部分完整跑通了就是标题里这个“基于配电网韧性提升的应急移动电源预配置和动态调度”。上篇的预配置解决的是“灾前把移动电源摆在哪里”的问题下篇才是真正见真章的部分故障已经发生网络里哪条线路断了、哪些关键负荷还活着该怎么指挥应急移动电源MPS在时间轴上一路转场什么时段在哪个节点供电每个小时输出多少功率中间是否要给自身补电这些决策全部交给一个动态调度模型来完成。这篇博文就围绕MPS动态调度这个主题把数学建模、Matlab代码实现、求解配置和复现途中遇到的坑一一交代清楚。适合谁来读正在做配电网韧性、孤岛恢复、应急供电方向的研究生或者需要把这类优化模型用Matlab落地实现的研究者。如果你对YALMIP和混合整数线性规划还不算熟本文也会尽量把模型和代码的对应关系讲透。1. 先理清楚MPS动态调度在配电网韧性里的定位1.1 预配置和动态调度是什么关系两阶段模型的逻辑很简单灾害来临前信息不完全只能根据预报信息决定移动电源的预置位置这是“预配置”阶段优化的结果是一组初始布点灾害发生之后故障信息明朗了调度员需要在这条时间轴上不断决策移动电源下一步去哪儿这就是“动态调度”阶段。两个阶段通过“初始位置”和“初始电量”衔接起来——动态调度不是从零开始而是从预配置给出的初始条件出发。我在复现时一开始犯过一个理解错误以为动态调度就是简单重跑一遍带位置的优化。实际上预配置和动态调度的信息结构和决策变量都不一样。预配置更接近“带随机灾前信息的位置规划”动态调度则是一个时间耦合更强、带移动过程约束的调度问题。两者共用一套配电网潮流参数但动态调度多了MPS的移动路径、停驻时间段、SOC递推这些硬约束。这也是为什么很多论文把这两部分分开建模分别写两套程序。我在代码里也用两个主文件来组织共用的网络参数单独放一个配置文件避免互相污染。如果只说建模逻辑动态调度其实可以理解成给定MPS车队、给定网络故障状态让它们在一段时间内轮流服务多个孤岛负荷。MPS不是固定储能它最大的价值就是“能跑”。但这个能力也是麻烦的源头——一旦允许移动时间维度和空间维度就绑在一起了MPS在t时刻必须位于某个节点从A节点换到B节点需要消耗移动时间移动期间它没法对外供电这些都会变成数学约束。1.2 动态调度模型的输入输出拿到一篇论文先别急着看公式先从“输入输出”上想清楚问题是什么。这个动态调度模型输入是这样几块配电网静态数据节点号、支路参数、负荷额定值或时序曲线故障或重构后的网络拓扑状态比如哪些线路处于断开状态、哪些节点已经失电MPS初始状态数量、容量、最大输出功率、初始SOC、初始所在节点MPS移动信息节点之间的移动时间矩阵由路网距离和平均车速换算时段划分通常以1小时为一个时段共24或48个小时负荷优先级权重关键负荷权重高普通负荷权重低。输出则是每个MPS在每个时段的离散动作和连续功率位置变量在哪一个节点、状态变量供电/移动/待机/充电、各时段的放电功率、SOC演进曲线。本质上这是一个多时段混合整数线性规划MILP离散变量来自位置和状态连续变量来自功率和SOC目标函数则是切负荷损失最小化或者恢复负荷电量最大化。我建议复现的时候先画一张数据流图把所有输入和输出列清楚再去看论文里的公式。这一步做扎实了后面写代码会轻松很多。1.3 为什么用MILP而不是一套规则有人会问动态调度能不能用启发式规则比如哪儿负荷重要就先去哪儿供完再跑下一个点。可以但在故障场景复杂、负荷优先级重叠、多个MPS协同的时候手写规则很难兼顾全局。MILP的好处是能把所有时间、空间、电量耦合关系一次性丢给求解器得到一个全局最优解而且给出来的结果可复现、可验证。代价就是模型规模大了之后求解会比较吃力这一点后面专门说。用MILP还有一个原因配电网的辐射状拓扑、开关状态、孤岛划分这些离散决策天然就适合用0-1变量表达。MPS在哪个节点供电也是一个离散选择。把这些统一建模成一个MILP调度员得到的方案不只是一串指令还可以给出目标值的下限方便评估方案质量。2. 动态调度模型的数学骨架拆解2.1 目标函数切负荷损失最小化大多数韧性恢复类论文的目标函数是在故障处置周期内让切负荷损失最小。常见写法是[ \min \sum_{t1}^{T}\sum_{i\in N} w_i \cdot P_{i,t}^{shed} \cdot \Delta t ]其中 (w_i) 是节点i的负荷权重(P_{i,t}^{shed}) 是节点i在t时段被切除的有功功率(\Delta t) 是时段步长。权重不是随便加的它体现了关键负荷优先级医院、通信基站、供水系统这些会设置高权重普通居民负荷权重低。这样求解器在无法满足所有负荷时会优先保住关键负荷。还有一个细节如果节点已经被切除(P_{i,t}^{shed}) 就等于该节点的原始负荷需求如果MPS或上级主网恢复了该节点的一部分负荷(P_{i,t}^{shed}) 就相应减少。这里我踩过一个小坑一开始把目标函数写成所有节点的切负荷功率之和没有乘负荷权重结果求解器给出的方案是把功率匀给权重最低的区域关键负荷反而没保障。后来把权重加回去方案才符合直觉。所以复现时先确认论文里目标函数到底有没有权重以及权重是常量还是随机量。2.2 状态变量位置、供电、移动、充电MPS动态调度的难点其实集中在状态刻画上。需要定义的变量包括位置变量 (x_{m,i,t} \in {0,1})MPS m 在 t 时段是否位于节点 i供电状态 (u_{m,t} \in {0,1})MPS m 在 t 时段是否向网络放电移动状态 (v_{m,t} \in {0,1})MPS m 在 t 时段是否处于移动中充电状态 (c_{m,t} \in {0,1})MPS m 在 t 时段是否在充电如果模型允许给MPS自身补电。位置唯一性约束是最基本的同一台MPS不可能同时出现在两个节点所以每个时段对每台MPS要加[ \sum_i x_{m,i,t} 1 ]状态互斥约束也很关键同一台MPS在同一时段不能既供电又移动也不能同时充电和移动。写成约束就是[ u_{m,t} v_{m,t} c_{m,t} \le 1 ]严格的物理含义是什么移动中的MPS没有接入配电线路无法对外供电充电则依赖于停靠在具备充电条件的节点大多数场景下也只能在停驻时进行。所以这三个状态是互斥的。当然也存在一些论文假设MPS在移动过程中可以给自身补电但更常见的是停驻充电。为了简化实现很多复现者会把“待机”状态和“供电”状态合并成一个“停驻但不供电”的状态也没问题关键是保证移动电源要么在接线要么在转场不能同时干两件事。2.3 移动逻辑的时间约束这是整个模型里最容易写错也是求解时间最容易被拉爆的部分。MPS从节点 i 转移到节点 j 需要时间 (\tau_{ij})这个时间由路网距离和平均车速得到。如果 (\tau_{ij}1) 个时段那么位置变量的递推可以写成[ x_{m,j,t1} \ge x_{m,i,t} y_{m,i,j,t} - 1 ]但如果 (\tau_{ij}1)问题就复杂了。我见过不少复现者在博客里说“移动约束写错导致求解器卡死”原因就在这里。常见做法是引入移动出发变量 (y_{m,i,j,t})表示MPS在时段t开始从节点 i 向 j 移动。那么可以写出出发之后必须移动 (\tau_{ij}) 个时段中途不能停在其他节点在到达节点 j 前MPS位置变量对应的节点不能变化到达后在 (t\tau_{ij}) 时段位置必须为 j。这中间会衍生出一大堆时间窗口约束如果直接展开写成 (\sum_{\tau} x_{m,\cdot,t\tau}...) 这种形式模型会变得非常大。我个人在实际复现中采用了一种简化先把所有节点对之间的最短移动时间计算出来然后只对 (\tau_{ij}) 小于调度周期且有实际移动价值的节点对建立移动变量把那些距离太远、根本不可能在调度窗口内完成转场的节点对直接排除掉。这能把移动变量的数量压缩一个量级同时不影响解的精度。做法很简单网络节点几十个但实际可达且需要去服务的节点就是其中一部分用“预筛选可达性矩阵”去限制变量空间。更细一点移动变量在目标函数里最好不要加成本因为大多数论文的目标函数只考虑切负荷加一个移动成本后权重是拍脑袋定的很容易破坏主目标可能出现“为了省钱而不移动”的次优方案。如果确实要加移动成本也要注意单位统一否则结果很难解释。2.4 SOC递推与电量约束MPS内部有一个电池系统SOC的递推是模型里时间耦合最强的部分。常见公式[ SOC_{m,t} SOC_{m,t-1} - \frac{P_{m,t}^{out}\cdot \Delta t}{\eta_d} \eta_c \cdot P_{m,t}^{ch}\cdot \Delta t ]其中 (P_{m,t}^{out}) 是放电功率(\eta_d) 是放电效率(P_{m,t}^{ch}) 是充电功率(\eta_c) 是充电效率。此外还需要满足(SOC_{m,\min} \le SOC_{m,t} \le SOC_{m,\max})防止深度放电损坏电池(0 \le P_{m,t}^{out} \le P_{m,\max}^{out}\cdot u_{m,t})供电功率只有MPS处于供电状态时才允许大于0如果允许充电充电功率上限同理乘上充电状态 (c_{m,t})初始SOC由预配置阶段给出可设为MPS出站时的满电状态仿真周期结束时的SOC通常要大于某个下限比如0.2这是为了保证MPS在任务结束后还有电量应对突发情况。很多复现者会在SOC上踩坑用了MILP以后SOC是连续变量但功率和状态之间必须用大M法强耦合。如果大M取值太大数值病态就会出现SOC曲线出现锯齿甚至不合理抖动。建议把功率、电量的单位统一大M取功率上限的1.1到1.2倍就够了不要图省事取1e6。2.5 配电网潮流与辐射状拓扑约束这个部分稍微重一点因为MPS不是凭空给负荷供电它需要接入配电网节点电流要沿线路流到负荷。模型里一般用DistFlow线性化潮流[ \sum_{i\in \delta(j)} P_{ij,t} - \sum_{k\in \pi(j)} P_{jk,t} P_{j,t}^{mps} - P_{j,t}^{load,used} 0 ]其中第一项是流入节点j的功率第二项是流出(P_{j,t}^{mps}) 是MPS在节点j注入的功率(P_{j,t}^{load,used}) 是实际供给负荷的功率。电压约束用简化的Delta-V形式[ V_{j,t} \approx V_{i,t} - \frac{r_{ij}P_{ij,t}x_{ij}Q_{ij,t}}{V_0} ]并给出 (V_{\min} \le V_{i,t} \le V_{\max})。如果复现时只关心MPS调度很多论文还会进一步把潮流简化成有功功率平衡忽略无功。但如果在IEEE标准算例上验证我建议至少保留有功潮流的线性DistFlow并在代码里加入线路容量约束避免出现某条线路功率越限的荒唐结果。辐射状拓扑约束通常伴随着孤岛划分决策。如果动态调度允许MPS接入后形成孤岛那还需要用单商品流或MST约束保证每个孤岛都是树状结构。这个约束在IEEE 33静态网络上不会太复杂但在多时段联合调度里每时段都要保证树形约束数量会上升。复现时建议先用固定拓扑跑通MPS调度再逐步放开开关变量一步一步来。3. Matlab YALMIP 实现MPS动态调度的代码要点3.1 数据结构与参数准备写这种多时段优化程序的第一个建议把所有常数集中到一个配置脚本里用struct保存不要散落到主程序各处。我习惯这样组织文件config_network.m录入节点、支路、负荷数据config_mps.m录入MPS容量、功率、数量、初始位置、初始SOCtravel_time.m计算节点间移动时间矩阵build_optimization.m构建YALMIP变量和约束run_main.m主入口读取配置求解并保存结果。移动时间矩阵的生成值得多说一句。MPS在路网上移动不是电网节点之间直接直线连通的所以需要先建立路网拓扑。如果没有实际路网数据可以假设路网距离等于电网支路电气距离的1.2倍并取平均车速为30到50km/h再把小时折算成时段。比如两个节点电气距离2km路网距离2.4km车速40km/h那么移动时间就是0.06h按1h时段取整就是1个时段。取整的时候要注意实际移动只需0.06h但一旦进入移动状态就占用整个时段这种保守假设在小时级调度里完全可以接受。3.2 定义YALMIP变量时的经验在Matlab里用YALMIP定义变量要特别注意维度设计。我建议统一采用三维变量维度顺序为MPS数量, 节点数量, 时段总数。这样做的好处是后续用矩阵切片写约束非常顺手。下面是一段典型的变量定义Nn size(bus, 1); % 节点数 Nm 3; % MPS数量 T 24; % 时段数 x_pos binvar(Nm, Nn, T, full); % 位置变量 0/1 u_sup binvar(Nm, T, full); % 供电状态 0/1 v_mov binvar(Nm, T, full); % 移动状态 0/1 c_chg binvar(Nm, T, full); % 充电状态 0/1 soc sdpvar(Nm, T, full); % SOC 连续变量 p_out sdpvar(Nm, T, full); % 放电功率 p_chg sdpvar(Nm, T, full); % 充电功率 p_shed sdpvar(Nn, T, full); % 切负荷功率有人会把位置变量定义成二维节点, 时段MPS数量通过循环来处理这样写比较简单但约束循环次数多代码冗长。三维变量虽然初始化时占内存多一点但配合Matlab的矩阵运算可以大幅减少for循环。我自己更推荐三维方案尤其是当节点数到69、时段到48以后这种写法在代码可读性和执行效率上都是更好的。3.3 核心约束的代码写法目标函数可以直接写成矩阵乘法Objective sum(sum(weight * p_shed)) * dt;位置唯一约束Constraints []; for m 1:Nm for t 1:T Constraints [Constraints, sum(x_pos(m, :, t)) 1]; end end状态互斥约束Constraints [Constraints, u_sup v_mov c_chg 1];SOC递推约束Constraints [Constraints, soc(:, 2:end) soc(:, 1:end-1) ... - p_out(:, 2:end).*dt/eta_d p_chg(:, 2:end).*eta_c*dt];功率上限约束Constraints [Constraints, p_out P_max * u_sup]; Constraints [Constraints, p_out 0]; Constraints [Constraints, p_chg P_chg_max * c_chg];切负荷与负荷需求关系Constraints [Constraints, p_shed P_load - p_net_local]; Constraints [Constraints, p_shed 0];注意这里没有写全网络潮流约束真实程序里还要在节点平衡方程中把MPS注入功率、上级主网购电功率和负荷实际供电功率关联起来。节点平衡用矩阵形式写会比较方便但要小心索引错位。% 节点注入功率平衡简化形式只考虑有功 for t 1:T P_inj(:, t) P_sub(:, t) reshape(sum(p_mps_node(:, :, t), 1), Nn, 1) - P_load_used(:, t); Constraints [Constraints, B_bus * theta(:, t) P_inj(:, t)]; % 若使用直流潮流 end这里我故意写了一个直流潮流的示意因为很多复现版本为了简化会退化成“有电无潮流”的功率平衡。我的建议是至少把DistFlow的线性化版本写进去否则求解结果在电气上不可行。当然这要看原论文到底有没有考虑网络安全约束如果论文只做MPS调度的“电源-负荷”匹配那也可以先不加入潮流。复现者要做的第一件事是确认原论文的约束清单。3.4 求解器配置在YALMIP里调用商业求解器只需要设置sdpsettingsops sdpsettings(solver, cplex, verbose, 2, showprogress, 1, ... cplex.mip.tolerances.mipgap, 0.001); result optimize(Constraints, Objective, ops);如果没有Cplex或Gurobi也可以用SCIP、GLPK等开源求解器但要做好心理准备带移动约束的MILP在开源求解器手里求解时间会成倍增加。我实际测试过IEEE 33节点、3台MPS、24时段、固定拓扑的情况Cplex大约几十秒能到1%的gap同样的模型用SCIP可能要几分钟甚至更久。所以如果需要反复调试建议用小算例比如9节点、2台MPS、6时段先在开源求解器上把逻辑调通最后再换商业求解器跑全模型。还有一个小技巧把预配置阶段得到的MPS位置作为初始可行解喂给求解器。YALMIP里可以用assign给变量赋初值然后用sdpsettings里的usex0开启。这样在某些困难算例里能明显加快收敛。4. 算例复现与结果验证4.1 测试系统与参数建议我复现时用的是IEEE 33节点系统这是配电网韧性研究里最常见的算例。参数设置可以参考这样调度周期24小时步长1小时MPS数量3台MPS额定容量800 kWh最大放电功率250 kW初始SOC0.9移动速度35 km/h负荷节点选择失电区域内的关键节点如节点12、18、25负荷权重一二级负荷权重5普通负荷权重1。这些参数不是唯一的关键是和原论文尽量保持一致。如果原论文没有公开参数建议至少做两组不同参数下的敏感性分析验证模型的行为符合物理直觉——比如MPS容量越大切负荷量越小可移动时段越长恢复效果越好。4.2 怎么检验解是否是“合理可复现”跑出结果以后先别急着写进论文做几个合理性检验检查每个MPS每个时段的位置唯一如果某台MPS在两个相邻时段出现在电气上不可达的节点说明移动约束缺了检查SOC曲线SOC是否越界SOC是否在放电功率不为0的时段出现跳变检查状态互斥同一时段供电、移动、充电状态不能同时为1检查负荷平衡所有节点的供电功率加切负荷功率应该等于该时段需求检查MPS移动时间从A节点到B节点移动耗时是否与预设矩阵一致。这五条相当于模型验证的自测清单。我在复现时专门写了一段后处理脚本把结果解析成几个可视化图包括MPS位置时序图甘特图、SOC曲线、各节点切负荷功率热图。位置时序图非常关键能一眼看出MPS有没有“瞬移”。画法很简单用imagesc或者patch把每个时段的所在节点标成色块横轴是时段纵轴是MPS编号。4.3 与论文图表对照复现的最终目的是和原论文的结果形成对照。因为很多论文不公开原始数据直接对照数值很难一般是对照趋势和量级。比如原论文表格展示某场景下切负荷积分值是多少MWh我们跑出来如果是同一个数量级且最优调度行为相似就可以认定模型复现成功。如果差了一个数量级先检查负荷数据的标幺值是否统一再检查MPS容量和功率是否按论文设置最后检查目标函数里是否遗漏了权重。这里必须提醒一句不要为了对上图就把参数硬调成“看起来一致”的值。复现的意义在于验证论文方法的可复现性而不是做一个拟合曲线。调参到完全一样没有实际价值反而会在后续二次开发时埋雷。5. 复现过程中遇到的坑以及排查方法5.1 变量规模爆炸求解器卡死怎么处理多时段MILP的常见死法就是变量太多。拿IEEE 33节点、3台MPS、24时段来说如果位置变量定义为(N_m \times N_n \times T)就已经有3乘33乘24等于2376个二进制变量。再加上移动出发变量、供电状态、充电状态二进制变量很容易过万。Cplex对这种规模通常还能对付但如果把时段改成48变量直接翻倍求解时间可能不是翻倍而是指数增长。我实际用下来有效的降维手段按收益排序预筛选MPS可达节点集合那些距离远到在调度窗口内跑不到的节点直接把位置变量抹掉减少移动出发变量的组合只保留原论文里MPS可能服务的关键节点之间的移动弧将负荷曲线按需求大小聚类对权重极低且负荷很小的节点不单独建立切负荷变量合理设置MIP Gap比如1%以内不要一上来就0%一时求不出可行解时先给MPS赋固定位置生成一个初始可行解。我经常遇到的情况是模型构建只要2秒求解3小时后还停在5%的gap。这时候先用预筛把变量压到原来的三分之一再配合初始解通常几分钟就能落到1%以内。5.2 大M取值导致数值病态大M法在MILP里太常见了但也最容易翻车。比如供电功率上限约束写成[ p_{out} \le P_{max} \cdot u_{sup} ]还好(P_{max}) 本身就是物理上界不存在大M问题。但网络潮流里的电压约束、线路投运逻辑经常要用形如[ P_{ij} \le M \cdot z_{ij} ]这样的约束。如果M取1e6而实际功率数量级只有1e-2标幺值那么求解器的容差会被M的数值依赖破坏结果出现匪夷所思的抖动。我的做法是所有M都取紧上界。比如线路容量已知上限是5MW那就把M设为5.5电压偏差上界是0.05p.u.那就M设0.06。M本身就是约束里的物理上界没必要放宽到十倍百倍。同时把功率、电压统一成标幺值能显著提升数值稳定性。5.3 YALMIP报错和调试的通用方法YALMIP的报错常见于维度不匹配。尤其是把三维变量切片以后行数、列数对不上。我的调试方式是分块检查每加一类约束先求解一个极小算例看约束表达式尺寸是否合理。具体做法% 在构建完整模型前先检查约束尺寸 size(Constraints)如果约束数量异常大多半是循环里把同一组约束重复添加了很多次。另外遇到不可行时先减少约束——把移动约束、状态互斥逐一注释掉看哪一步导致无解。这比对着满屏的约束干瞪眼快得多。YALMIP还提供了一些诊断工具比如yalmiptest、diagnostic结果里的infeasible constraint list虽然输出有点晦涩但配合“注释法”一起用能定位到具体是哪一行约束出了问题。5.4 移动逻辑明明写了还是会出现瞬移这个坑我印象最深。有一版程序跑出来MPS在第3时段还在节点5第4时段突然出现在节点15而这两个节点之间移动时间要3个时段。查了半天发现问题是位置变量唯一约束写成了[ \sum_i x_{pos}(m,i,t) 1 ]但移动出发变量和位置变量之间没有耦合MPS移动了位置变量却没跟着变。正确的做法要在每个时段都建立“位置变化必须匹配移动变量”的耦合约束。简化版本如果t时段在i、t1时段在j、且i和j不同那么MPS必须处于从i到j的移动状态且移动耗时满足要求。更工程化的写法是引入“到达/出发”时间变量来替代直接的位置转移。建议复现者在代码里专门加一条注释把耦合约束写成% 相邻时段位置变化 必须有对应的移动弧 for m 1:Nm for t 1:T-1 for i 1:Nn for j 1:Nn if i ~ j travel_time(i,j) T Constraints [Constraints, ... x_pos(m,i,t) x_pos(m,j,t1) - 1 y_move(m,i,j,t)]; end end end end end这一段的循环量不小实际程序里会用预筛选后的可达节点集来缩小范围并且只有当travel_time等于1时才这么写。如果移动耗时大于1个时段还需要额外的窗口约束这部分的逻辑比较繁琐强烈建议先单独写一个“只有MPS移动约束”的小模型去测试。我专门写过这种测试脚本固定MPS初始位置给定一个强制目标节点看求解器能不能在满足最短移动时间的前提下到达目标能通过这个小算例移动逻辑基本就稳了。5.5 切负荷变量与潮流约束之间的口径问题还有一个容易忽略的坑切负荷变量 (p_{shed}) 和负荷实际使用功率 (p_{load,used}) 的口径必须一致。有些复现里目标函数用的是 (p_{shed})节点平衡方程里用的是 (p_{load,used})但忘记写两者的关系结果目标函数优化了一堆切负荷节点平衡里却依然按全负荷供电来算误导性很强。正确的关系是[ p_{load,used} p_{load,base} - p_{shed} ]如果漏掉这条桥接约束求解器会“作弊”一边在目标函数里把切负荷降到0一边在潮流约束里又要求节点供给全部负荷。这个约束虽然简单但在大模型里很容易被淹没。建议在构建约束时把这类“定义型约束”集中放在一起并加注释标明它所对应的物理含义。6. 最后分享几点个人操作心得跑完这个复现项目我的总体感觉是MPS动态调度的难点不在公式本身而在把物理过程变成约束的细节。移动、停驻、放电、补电这几件事在生活中很容易理解但要用0-1变量和连续变量把它们严格区分开细节非常多。代码里任何一个状态变量漏了互斥约束结果就会在某个时段出现MPS边充电边供电的神奇操作。对于想上手复现这篇论文的人我给出一个最实际的建议先跑小算例从9节点、2台MPS、6时段开始把移动约束、SOC递推、节点平衡三条主线逻辑全部调通再逐步放大到33节点24时段。不然一上来就面对几千个二进制变量报错都不知道从哪儿查起。小算例通过后再对照原论文的图表复现大算例此时大部分时间会花在调求解器和检查合理性上。这个阶段的耐心很重要但也是收获最大的阶段。最后说一个我后续准备做的小扩展把动态调度的结果反馈给预配置阶段形成两阶段迭代闭环这样预配置时就能考虑灾中MPS的实际可达性而不是只用静态距离。这个想法还在验证中等有结果了再单独写一篇。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门