尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
电动汽车集群并网调度的分布式鲁棒优化模型及Matlab实现
接手过电动汽车有序充电项目的朋友应该都有这种体会真到排第二天的充放电计划时最让人头疼的往往不是求解器不够快而是你根本说不清楚明天早上 8 点到底有多少辆车插着充电枪、每辆车还剩多少电、有多少车主愿意响应调度。电动汽车集群并网调度本质上就是一个在多重不确定性里做决策的问题。分布式鲁棒优化调度模型Matlab 代码实现最近在论文和工程里都特别多核心思路是在不依赖精确概率分布的前提下把集群规模、出行行为等因素带来的不确定性直接放进优化模型最终输出一套既保经济性、又能扛住最恶劣情况的调度方案。这篇文章不绕概念我直接讲清楚模型来龙去脉以及用 Matlab 落地时的建模、求解和踩坑过程。适合正在复现论文、做毕设或者想把集群调度从确定性模型改成鲁棒模型的工程师参考。1. 电动汽车集群并网的不确定到底难在哪1.1 调度决策面前摆着哪几类不确定性先说结论电动汽车集群并网调度的不确定性不是单一来源而是好几类不确定性叠在一起。第一类是车辆行为不确定性。每辆车什么时候接入、什么时候离开、接入时电池剩多少电都是随机的。现实中早高峰和晚高峰的接入曲线差异很大节假日和普通工作日也不一样。你如果用历史均值去做计划大概率出现某个时段实际可参与调度的车辆只有预测值的六成。第二类是充电需求不确定性。即使车辆数和接入时间都确定每辆车的目标 SOC、电池容量、充电功率等级也不一致。当前很多充电桩支持快充和慢充切换车辆实际功率需求会在很大范围内波动。对集群整体来说这就导致可充入电量上界和必须满足的充电需求下界都在变。第三类是响应意愿不确定性。V2G 放电不是强制性的车主可能同意放电也可能临时拒绝。工程上经常用可调度系数来刻画但这个系数在实际运行中并不稳定。价格激励、电池健康状态、甚至天气都会影响车主响应比例。第四类是源侧不确定性。如果配电网里还接了风电、光伏那么集群并网调度还需面对可再生能源出力的波动。这一类不确定性在文献里研究很多但它会跟 EV 负荷叠加使得净负荷的不确定性范围更宽。很多复现论文的人一开始只关注优化算法本身忽略了不确定性建模才是结果是否可信的关键。我的建议是动手写代码之前先把四类不确定性列一张表标明哪些参数会在模型里用随机变量 (\xi) 表示哪些用场景集合表示。这一步做好了后面模型推导会顺畅很多。1.2 为什么随机规划和经典鲁棒都不够用传统做法里随机规划是最自然的思路假设不确定参数服从某个概率分布或者用蒙特卡洛生成大量场景然后优化期望成本。理论上很漂亮但实际工程中有一个致命前提——你得真的知道那个分布。对于私人电动汽车出行习惯、充电行为受太多因素影响很难用一个标准分布概括。哪怕你有历史数据样本量不足时拟合出来的分布在尾部往往偏差很大而调度问题恰恰关心尾部最恶劣场景。如果你强行用正态分布拟合充电功率大概率会低估几百辆车同时插枪这类极端事件。一旦真实场景落在分布的厚尾区域原计划就会失效需要大量实时调整。经典鲁棒优化走的是另一个极端只要求不确定参数落在某个有界集合里比如上下界区间然后优化最坏情况下的总成本。它不需要分布信息这是优势。但问题也很明显——太保守。它隐含地假设所有不确定参数会同时取到最坏值这在电动汽车集群场景中几乎不可能发生。因为你很难想象几千辆车在同一个时刻全部以最大功率充电同时风光出力全部为零。用经典鲁棒做出来的调度方案V2G 放电可能被压缩到很小储能和备用机组白白建了一大堆经济性很难接受。所以分布式鲁棒优化的定位就很清楚了它和经典鲁棒一样不依赖精确分布但它的最坏情况是在分布空间里找而不是在参数取值空间里找。这样既保留了鲁棒性又避免了所有参数同时取极端值带来的过度保守。对电动汽车集群这种有历史数据但数据不充分的场景它是最自然的选择。1.3 分布式鲁棒最核心的思想分布距离球理解分布式鲁棒可以先记住一个图像你有一个参考分布这个分布通常是从历史样本构造的经验分布然后你在这个参考分布外面画一个球球里装着的都是偏离参考分布不太远的候选分布。真实分布不确定是哪个但你有把握它在这个球里。于是优化目标就从最小化某个已知分布下的期望成本变成最小化球内最坏分布的期望成本。数学上通常写为[ \min_{x \in X} ; \sup_{Q \in \mathcal{B}_\varepsilon(\hat{P}N)} \mathbb{E}{Q}\left[ g(x, \xi) \right] ]其中 (\hat{P}N) 是由 N 个历史样本构造的经验分布(\mathcal{B}\varepsilon) 是以 (\hat{P}_N) 为中心、半径为 (\varepsilon) 的分布球。这个球用什么度量来定义会直接决定求解难度。目前最火的是 Wasserstein 距离它直观上可以理解为把一个分布移动到另一个分布所需的最小平均移动成本。你可能会问在分布空间上做优化Matlab 能处理吗好消息是不需要直接在分布空间上搜索。Wasserstein 球有一个非常漂亮的对偶性质可以把内层 (\sup) 问题转化为关于对偶变量 (\lambda) 和样本点场景的有限维优化问题。落到代码层面最终是一个混合整数线性规划或者二阶锥规划Gurobi、Cplex 这类主流求解器都能直接解。我在实际项目中很少手写对偶推导的完整过程更常用的做法是把对偶后的 LP/SOCP 约束用 Yalmip 建模交给求解器。但注意理解这个对偶关系仍然很重要因为 CCG 算法中主问题和子问题的交替迭代本质上就是在这个对偶结构上做文章。2. 分布式鲁棒模型的设计思路两阶段结构是关键2.1 两阶段决策先定计划再应对最坏分布工程上把调度模型写成两阶段完全是顺着实际流程来的第一阶段是日前计划阶段网格调度员在未知明天实际情况时就得确定机组的启停状态、机组出力基点、各充电集群的名义充放电曲线。这些变量一旦确定短时间内改不了所以叫 here-and-now 决策。第二阶段是实时调整阶段当实际接入车辆数、初始 SOC、风光出力逐渐清晰之后调度员可以在一定范围内调整机组出力、弃用可再生能源、切负荷。这些调整动作要付出额外成本所以模型的目标函数里要有惩罚项。两阶段模型的好处是贴合调度规程也方便用分解算法求解。第一阶段不给第二阶段留调整余地的模型在实际中几乎做不出来因为充电负荷波动太大完全靠日前固定曲线支撑不是保守到离谱就是不可行。用式子表达目标函数长这样[ \min_{x} \left{ f(x) \sup_{Q \in \mathcal{B}_\varepsilon(\hat{P}_N)} \mathbb{E}_Q \left[ h(x,\xi) \right] \right} ](f(x)) 代表第一阶段成本比如常规机组燃料成本和启停成本(h(x,\xi)) 是给定第一阶段决策 (x)、遇到不确定参数 (\xi) 之后的第二阶段最小调整成本。这个 (h) 本身还要再对第二阶段变量求最小化所以整个问题是最小 - 最大 - 最小嵌套结构也就是常说的小 max-min 结构。2.2 第二阶段的最坏情况到底在算什么第一阶段决策定了以后(h(x,\xi)) 的值取决于不确定参数 (\xi) 和第二阶段变量 (y) 的可行域。第二阶段变量通常包括实时出力调整量、弃风弃光量、切负荷量、储能充放电调整量等。它的约束是功率平衡、机组爬坡限制、线路容量以及第一阶段决策强加的边界。在分布式鲁棒的框架下我们不是遍历每一个具体的 (\xi) 取值而是遍历每一个候选分布 (Q)去计算这个分布下 (h(x,\xi)) 的期望然后取最大期望。这个分布层面的最坏期望才是第二阶段的输出。我在一开始接触这个模型时也困惑过为什么不直接对每个样本场景取最大 (h)原因是样本有限单纯对离散场景取最大很容易被离群样本带偏而且优化结果对样本特别敏感。用 Wasserstein 球做约束后等于给最坏情况加了一个基于样本规模的置信度控制样本量越大球半径 (\varepsilon) 可以取得越小模型越信任经验分布样本量小就把球放大一点不让最坏情况的估计过于乐观。从这个角度理解分布式鲁棒并不比普通鲁棒更高级它只是更诚实地刻画了我们知道什么、不知道什么。知道的是历史样本和经验分布不知道的是真实分布和参考分布之间的偏差上界而这个上界可以用统计方法估计。2.3 电动汽车集群需要怎么聚合建模单体电动汽车的建模并不复杂SOC 递推、充放电功率上下限、不能同时充放电、离开时满足用户需求。麻烦的是数量。一个城市级充电集群可能有几千辆车每辆车都引入 0-1 变量模型规模立刻爆炸。所以工程上几乎都会走聚合建模路线。先看单车的核心约束[ E_i(t1) E_i(t) \eta_c p_i^c(t)\Delta t - \frac{p_i^d(t)\Delta t}{\eta_d} ][ 0 \le p_i^c(t) \le u_i(t)\bar{P}_i^c, \quad 0 \le p_i^d(t) \le (1-u_i(t))\bar{P}_i^d ][ E_i^{\min} \le E_i(t) \le E_i^{\max}, \quad E_i(t_i^{dep}) \ge E_i^{req} ]如果只是把 N 辆车的 SOC、功率变量累加不做任何松弛计算量是不可接受的。聚合建模的思路是不直接跟踪每辆车而是跟踪集群的总可充电功率上限、总可放电功率上限、总 SOC 边界。[ P_{ev}^{net}(t) \sum_i p_i^c(t) - \sum_i p_i^d(t) ][ E_{ev}(t) \sum_i E_i(t) ]关键的技巧是计算 (E_{ev}) 的上下边界时不能简单地把各车的 SOC 上下限相加。因为有些车接入时间晚、有些车接入时间早调度计划必须保证任意时刻集群都能够在剩余时间内完成用户的充电需求。这可以转换成两个必要条件集群能充入的最大电量不能小于总需求减去当前 SOC。集群在任何时刻能放出的电量必须在满足用户离开需求的前提下留有余量。这两条边界如果算得保守调度结果会牺牲经济性算得激进调度结果可能不可行。我自己的做法是先用蒙特卡洛生成一批车辆行为场景对每个场景求聚合边界再取分位数比如 5% 和 95%作为上下界。这个分位数参数正好可以跟分布式鲁棒模型里的 Wasserstein 半径配套调整等于有了一套从数据到不确定集合的完整链路。3. Matlab 实现路线Yalmip 建模 CCG 求解3.1 环境搭建Yalmip、Gurobi、Matlab 版本代码实现层面我强烈推荐 Yalmip Gurobi 的组合。Yalmip 是一个建模工具箱它把优化问题的变量、约束、目标用接近数学语言的方式写出来然后自动翻译成求解器能吃的格式。Gurobi 是目前混合整数规划和二阶锥规划求解效率最高的商业求解器之一学生和科研用户申请个人授权很方便。安装时有几个容易踩的坑Yalmip 下载解压后要把整个文件夹加入 Matlab 路径建议用addpath(genpath(...))避免子目录没被加载。调用yalmiptest可以快速检查所有求解器是否被识别。Gurobi 和 Matlab 版本有对应关系如果版本跨度太大setup函数可能识别不到 MATLAB。检查环境变量GUROBI_HOME是否设置正确并且把 Gurobi 的matlab目录放到路径最前面。求解小规模问题也可以用免费的 SCIP但大规模两阶段模型 Gurobi 优势非常明显。路径配置这类问题排查起来很费时间我的经验是不要直接在 Matlab 当前目录下放一堆脚本用一个init.m脚本统一设置路径这样换机器、换版本时只需要改一个文件。3.2 第一阶段模型怎么在 Yalmip 里写以三台常规机组 一个 EV 集群为例第一阶段变量的 Yalmip 写法如下T 24; % 时段数 nG 3; % 常规机组数 % 决策变量 Pg sdpvar(nG, T, full); % 机组出力 uOn binvar(nG, T, full); % 机组启停状态 Pev sdpvar(1, T, full); % 集群净功率正值充电、负值放电 % 约束 Cons []; Cons [Cons, Pg Pg_min .* uOn]; Cons [Cons, Pg Pg_max .* uOn]; Cons [Cons, sum(Pg,1) Pev Pwind_forecast PLoad]; % 功率平衡 Cons [Cons, -Pev_dis_max Pev Pev_ch_max];这里有两个细节容易踩坑。第一sdpvar默认创建方阵如果你写sdpvar(3,24)没问题但写sdpvar(3)再当二维用就会报维度错误。第二约束里Pg_min .* uOn是想要停机时出力为零但乘出来的表达式在 Yalmip 里是一个双线性项直接交给求解器会报非线性。正确做法是用大 M 约束Cons [Cons, Pg Pg_max .* uOn]; Cons [Cons, Pg 0];同时把Pg_min .* uOn拆成两条线性约束配合启停成本去保证停机时出力为零。如果你要严格表达机组在最小技术出力以上运行需要另加Cons [Cons, Pg Pg_min .* uOn];但这里 (Pg_{\min}\times u_{On}) 仍然是非线性因为二进制变量乘以连续变量。正确做法是引入辅助变量或把这个逻辑用implies写Yalmip 可以自动线性化Cons [Cons, implies(uOn, Pg Pg_min)];implies在处理逻辑约束时很方便但会引入额外的二进制变量数量太多时求解会变慢。能用手写大 M 的场合我一般优先手写。3.3 CCG列约束生成求解流程与伪代码完整的两阶段模型不能直接丢给求解器除非规模很小。实用做法是列约束生成算法。CCG 的通俗理解是先猜一个最坏场景在这个场景下求主问题得到一个调度计划然后固定这个计划去找一个更坏的场景找到了就把这个新场景加进主问题再重新求解。如此循环直到最坏场景带来的成本不再显著增加。伪代码结构如下tol 1e-4; LB -inf; UB inf; K 0; xi_set initialScenario(); % 初始场景集合 while UB - LB tol K K 1; % 1. 求解主问题包含 xi_set 中所有场景的二阶段约束 [x_opt, master_obj] solveMaster(xi_set); LB master_obj; % 2. 固定 x_opt求解子问题寻找最坏分布/场景 [worst_cost, xi_new] solveSubproblem(x_opt); % 3. 估算上界 UB min(UB, firstStageCost(x_opt) worst_cost); % 4. 如果还没收敛把新场景加入主问题 if UB - LB tol xi_set [xi_set, xi_new]; end end主问题的目标里会包含每个已加入场景对应的第二阶段变量和约束。所谓加一列就是说每来一个新场景就要为它引入一组新的第二阶段变量 (y^k)这些变量只属于该场景。这跟单纯加一条约束不一样很多初写代码的人会在这里犯迷糊。子问题则是固定 (x) 之后求[ \max_{Q \in \mathcal{B}_\varepsilon} \mathbb{E}_Q[h(x,\xi)] ]在 Wasserstein 球的强对偶下它等价于一个对 (\lambda) 和每个样本点子问题求最大/最小的优化问题。Yalmip 的好处是你能直接把这个对偶问题写成约束和变量然后丢给 Gurobi。但要注意子问题里的 (\sup_{\xi}) 通常是一个带范数的优化块如果你范数取 1 或无穷可以线性化如果取 2 范数就变成二阶锥约束。我第一次实现时图省事把所有样本场景直接放进子问题求最大 (h)结果迭代不收敛。后来改成 Wasserstein 球约束下的最坏期望收敛曲线才正常。这说明子问题不能随便简化它对算法性能影响巨大。4. 代码实现里最容易翻车的细节与调优思路4.1 大 M 法M 的取值不是越大越好大 M 法的翻车率非常高尤其是在充放电约束里。比如你要表达一台车不能同时充电和放电[ 0 \le P_{ch} \le M \cdot u, \quad 0 \le P_{dis} \le M \cdot (1-u) ]很多新手图方便直接写M 1e6结果 Gurobi 预求解后数值病态可能出现明明有可行解却报不可行或者结果违反物理直觉。Gurobi 对大 M 的处理能力虽然比老牌求解器强很多但 M 太大依然会降低数值稳定性。正确做法是 M 只比变量真实上界稍大一点点。比如充电功率上界是 100 kW那 M 取 120 就够了。如果一段约束里同时涉及多档上限可以用max(Pmax(:))统一取一个较小的足够值。还有一个相关问题Yalmip 里如果出现inf * 0这种表达式表面看着没问题求解器内部很容易产生 NaN。我的习惯是建模前先做一步变量尺度归一化把功率、成本、SOC 的单位统一到基准值附近不让量级差超过三个数量级。4.2 不确定性半径和预算怎么选才不瞎调分布式鲁棒模型的保守程度完全由 Wasserstein 球半径 (\varepsilon) 控制。(\varepsilon0) 时退化为样本平均模型(\varepsilon) 很大时趋近于经典鲁棒。工程上选半径可以用理论公式给定样本量 (N)、置信水平 (1-\alpha)存在一个可以保证真实分布大概率落在球内的半径。不过实际项目中我很少完全依赖理论值而是做一个灵敏度扫描先取一组很小的 (\varepsilon)比如 (10^{-4}, 10^{-3}, 10^{-2})观察成本和最坏成本变化。找出成本快速上升的拐点把工作点选在拐点附近。如果论文需要可以在拐点处反推置信水平这样比拍脑袋选半径更有说服力。经典鲁棒那套盒式集合里的预算 (\Gamma) 也类似。(\Gamma) 本身不是调得越大越好它控制最多有多少个参数偏离预测值。(\Gamma0) 等于确定性模型(\GammaN) 等于完全保守。从调试角度我建议你先写一个通用的参数扫描脚本自动跑几组半径画成曲线看趋势再决定最终参数。这比手动一个个改数高效得多。4.3 求解器参数与大规模加速技巧当 CCG 迭代到 8~10 次主问题可能已经积累了几万个约束和上百个二进制变量。这时候 Gurobi 的默认参数往往不是最优的可以根据问题特征手动调MIPGap设为 0.011% 最优性间隙而不是默认 1e-4求解时间可能大幅下降。调度问题工程上接受 1% 的间隙完全合理。TimeLimit给主问题设置时间上限防止单次求解卡死导致整个 CCG 循环停滞。Threads多核机器可以提高线程数但超线程带来的收益不一定线性通常 4~8 个线程性价比最高。Presolve默认开启即可。如果模型里大 M 值比较紧Presolve 能把很多冗余约束消掉效果明显。另一个实用技巧是热启动。CCG 迭代中的主问题和上一轮主问题共享大部分约束只有新增场景的变量和约束是全新的。如果能用上一轮主问题的解作为初始可行解传给本轮求解MILP 的求解时间会缩短不少。Yalmip 里可以在optimize时提供一个初始解结构Gurobi 也支持直接传入Start字段值得花时间加上。5. 算例设计与结果解读代码跑通之后结果真的可信吗5.1 一个能说清问题的典型算例设置我常用的算例是一个修改过的 IEEE 33 节点配电网接入三个电动汽车集群分别位于不同馈线末端总规模大概 1000 辆车。这么做的好处是能体现出集群位置对电压和网损的影响不会把问题简化成一个单纯的功率平衡问题。电动汽车的参数我是这样设置的参数取值范围 / 分布电池容量30~60 kWh三角分布到达时间集中在 18:00-20:00离开时间集中在 7:00-9:00到达 SOC截断正态均值 0.5方差 0.2充电功率上限7 kW交流慢充放电功率上限3.5 kWV2G 限值目标离开 SOC0.9不确定性集合从 200 个历史样本中构造每天样本都包含所有车辆的到达时间、离开时间、初始 SOC、响应意愿。先跑蒙特卡洛预仿真生成每个时段集群可充/可放功率的上下界再用这些边界作为不确定参数 (\xi)。这样写出来的模型和实际调度决策习惯很接近论文复现时也能把结果迁移到其他数据集。5.2 三类方案结果对比我通常会把确定性模型、经典鲁棒、分布式鲁棒三套方案放在同一批数据下跑。结果非常有代表性方案日前调度成本实际最坏调整成本V2G 放电利用量确定性模型低高高经典鲁棒高低低分布式鲁棒中较低中确定性模型看起来最便宜但遇到真实波动时调整成本很高把调整成本加进去之后总成本反而不一定最低。经典鲁棒把不确定性集合取得很宽结果调度方案非常保守V2G 放电被限制得很厉害因为模型总在最坏情况下预留大量备用容量。分布式鲁棒则处在一个合理中间点调度成本比确定性高一些但最坏调整成本显著下降而且 V2G 仍然能参与削峰填谷总成本在三种方案里最优。这个结论不是我编的多看几篇相关论文也能得到类似规律。但要注意三类方案的相对优劣高度依赖不确定集合半径和样本量。如果你把 Wasserstein 半径调到接近零分布式鲁棒结果会靠近确定性模型调到很大又会靠近经典鲁棒。所以做对比研究时必须写清楚参数取值否则审稿人一定会质疑结论的泛化性。5.3 验证方法别只看目标函数值跑出目标函数值只完成了第一步。工程上更要看的是方案在真实世界里能不能扛住。我习惯的做法是把已经算出来的日前调度计划固定住另外生成 500 个测试场景模拟每个场景下的实时调整成本统计整个成本分布的尾部特征。如果分布式鲁棒的方案在 500 个测试场景中最大调整成本明显低于确定性方案那么它的鲁棒性才算真正得到验证。如果两者差不多说明你的不确定集合半径没选好或者模型没有抓住真正的不确定来源。灵敏度分析也很重要。试着扫一下 Wasserstein 半径 (\varepsilon)观察总成本变化曲线。理论上(\varepsilon) 从零慢慢增大时成本会先上升然后趋于平缓。如果成本在很小区间内剧烈波动说明模型数值稳定性差或者样本规模不匹配。还有一个容易忽略的维度集群规模。你把车辆数从 500 调到 2000看同一半径下成本变化的斜率。这里能体现集群规模越大聚合边界越稳定的池化效应这也是电动汽车集群并网调度的天然优势之一。我在实际项目里的一个体会是分布式鲁棒模型的代码实现真正难的不是 CCG 本身而是搞清楚你的不确定集合到底在刻画什么。很多复现失败不是求解器问题是数据到不确定集合这一步就偏了。先把这一步做扎实再谈模型和算法整个流程会顺很多。最后分享一个小技巧调参时不要只在离线的 200 个样本上自嗨最好留出一部分样本做滚动验证。把训练样本构造的调度方案拿到验证样本里做闭环仿真看的是分布漂移下的表现。分布式鲁棒这套框架的优势恰恰在于它对分布漂移不那么敏感但前提是半径取得合适。这个度只能靠多次实验去摸。
RELATED

相关推荐

OpenMontage深度解析:5.4万Star的开源视频神器,是革命还是半成品?

OpenMontage深度解析:5.4万Star的开源视频神器,是革命还是半成品?

最近,一个叫 OpenMontage 的开源项目在GitHub上火了,Star数突破 5.4万,被不少人称为“视频创作者的终极福音”。 它号称是 首个开源、由AI智能体驱动的视频生产系统,能直接把你的AI编程助手(比如Claude Code、Cursor、…

📅 2026/10/13 3:17:11
机器人控制为什么会出现优先级反转?从共享锁到实时任务阻塞分析

机器人控制为什么会出现优先级反转?从共享锁到实时任务阻塞分析

在机器人实时控制系统中,有一种非常容易让开发人员困惑的现象:明明 EtherCAT 控制线程设置了更高的实时优先级,为什么它有时还是会被一个低优先级线程拖慢?例如,一台采用 ROS 2、IgH EtherCAT Master 和实时 Linux 的机…

📅 2026/10/13 3:17:11
转版QA | ISO 9001:2026核心变化要点 高频问题答疑(第一期)

转版QA | ISO 9001:2026核心变化要点 高频问题答疑(第一期)

2026年9月16日,国际标准化组织(ISO)在官网正式发布ISO 9001:2026《质量管理体系 要求》。面对本次标准换版升级,企业该如何快速把握核心变化?SGS首场ISO 9001:2026新版解读全国线上研讨会已顺利举办。针对直播过程中大…

📅 2026/10/13 3:17:11
MORE NEWS

更多资讯

📰

Windows上部署Diffy:差分测试工具实现接口回归对比

1. 项目拆解:Diffy到底解决什么问题把Diffy部署到Windows上,这件事听起来不过是一次Java进程的启动,但真正做下来,你会发现项目选型、依赖下载、启动参数和结果解读都有一堆可以聊的细节。Diffy本身是一个开源的差分测试工具&…

📰

React Native开发OpenHarmony应用:大文件上传断点续传实践

最近在搞一个基于OpenHarmony的跨平台应用,业务方要求实现大文件上传功能,而且明确点名要“断点续传”。之所以用到React Native,是因为团队里前端工程师居多,Native层只有一个人维护,如果纯用ArkTS写全套业务&#xf…

📰

Linux 下 chmsee 阅读 CHM 文档:编译依赖、中文乱码修复与替代方案

简介:chmsee 是一款面向 Linux 用户的 CHM 文档阅读工具,主要解决 Linux 系统无法直接打开微软编译的 HTML 帮助文件这一痛点,适合需要在 Linux 环境下查阅技术手册、开发文档与电子书的中文用户。资源包共收录 111 个文件,以 C 源…

📰

Unity鱼眼Shader实战:从投影原理到性能优化

1. 鱼眼Shader到底能做什么第一次接触鱼眼Shader是在做一个赛车模拟项目的时候,当时想给玩家一个“坐在驾驶舱里用广角镜头看世界”的沉浸感。普通透视相机在高速行驶时视野太窄,两侧的景物一闪而过,玩家根本来不及反应,体验很差。…

📰

OpenClaw 安装卡在 libsignal?两个模块的编译与排查指南

简介:这份资源面向在企业内网环境下部署 OpenClaw 的开发者与运维人员,聚焦企业防火墙导致 libsignal-node 从 GitHub 下载失败这一典型痛点,提供 whiskeysockets/libsignal-node 与 libsignal 两个必需模块的离线包,可直接放入 O…

📰

Alation MCP Server接入实战:让AI Agent读懂企业数据元数据

最近帮团队盘点MCP Server生态的时候,有个现象特别明显:大家抢着把数据库、代码仓库、文档库接进AI助手,但真正被低估的,反而是企业数据目录和治理平台这一类。这周我花了不少精力把Alation的MCP Server研究了一遍,也顺…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬