资讯动态

多无人机MEC联合优化:轨迹、功率与用户关联的MATLAB仿真实现

发布时间:2026/10/16 16:32:19 来源:尧图企业网站定制
坐标在通信仿真圈子摸爬滚打这几年无人机加移动边缘计算的联合优化题应该算得上是一块标志性的硬骨头了。轨迹、传输功率、用户关联三个变量一旦叠在一起数学上就是一个典型的混合整数非凸规划不少做相关仿真的同学在这里卡过个把月时间。最近正好完整跑通了一个多无人机多地面用户的MEC联合优化方案配套MATLAB代码的架构和调试心得都理清了这篇就把整个设计和排坑过程完整写出来给做无人机通信、边缘计算卸载方向的同行一个掏心窝的参考。先说清楚这内容解决什么问题。在一个典型的多无人机辅助移动边缘计算场景里地面用户设备有计算任务需要处理如果全在本地算延迟大不说电池消耗也扛不住如果把任务卸载给覆盖范围内的无人机无人机不仅要决定飞到哪里、用多大功率发射信号还得决定到底接收哪个用户的任务——这三个决定一旦分开做性能会明显下降。这套仿真做的事就是把轨迹、功率、关联放在同一个循环里联合迭代优化在满足任务时延和无人机能耗约束的前提下最大化系统的整体计算速率或最小化总任务处理时延。对于正在做边缘计算与无人机通信交叉课题的研究生、刚接手相关项目的算法工程师来说这套思路和代码框架都能直接拿来当原始底稿。1. 联合优化问题的构成与拆解思路1.1 场景设定多无人机、多地面用户与边缘服务器先把场景说清楚。假设一个区域里分布着K个地面用户设备这些设备有传感器数据、图像识别任务或者视频分析任务需要处理。为了覆盖这些用户系统部署了N架无人机作为空中边缘计算节点每架无人机上都携带了MEC服务器能够接收地面用户卸载的计算任务完成计算后再把结果传回地面。这里有个很容易被新手忽略的点无人机和地面基站不一样地面基站的位置是固定的而无人机的轨迹是持续变化的。换句话说无人机每一时刻的位置直接决定了它和地面用户之间的信道质量——飞得近信道就好数据传输速率就高飞得远信道变差卸载效率直线下降。这也正是为什么无人机轨迹必须作为优化变量放进来不是随便选几个悬停点就能完事的。在实际仿真中我建议把时间轴离散化。比如把无人机的飞行周期T等分成M个时隙每个时隙内认为无人机的位置、信道状态、发射功率近似不变。时隙数量如果太少轨迹优化的精细度就不够如果设得太多仿真复杂度会指数级上升跑一轮迭代的时间让人很难接受。我实测下来一个飞行周期分成20到40个时隙是性价比比较高的区间具体情况还可以根据任务时延的精度要求来调整。地面用户的卸载决策也要说清楚。每个用户在每个时隙只能选择把任务卸载给一架无人机这就是“多无人机多地面用户关联”的含义。这个关联变量有很强的耦合性用户选哪架无人机卸载取决于那架无人机当前的位置、信道条件、计算负载以及剩余能量。同样地无人机飞到哪里、用多大功率发射又取决于它会接收到哪些用户的任务。这三个变量就像齿轮一样咬合在一起分开优化任何一个都得不到全局最优解。1.2 耦合变量为什么轨迹、功率和关联不能单独处理如果把这三个变量拆开单独优化会发生什么我实际试过这个“偷懒”方案先固定无人机位置只优化功率和关联。结果初期性能看着还可以但很快发现瓶颈——无人机的位置如果不移动远处用户即使把发射功率拉到最大信道条件太差导致卸载速率依然上不去任务只能积压在本地整体时延居高不下。反过来如果只优化轨迹而不考虑用户的卸载选择会出现另一个问题无人机拼命往某些用户附近飞结果那部分用户的任务量根本不大反倒是远处用户因为信道太差而被完全忽略。整条无人机飞行轨迹看起来是在“优化”实际上只服务了一小撮用户公平性和整体性能都谈不上。那干脆先固定关联优化轨迹和功率也不行。用户和无人机之间的关联关系如果固定死了一旦某个无人机因为轨迹调整飞远了它负责的用户就无从卸载系统没有灵活性可言。这就是联合优化存在的根本原因。轨迹、功率、关联三者之间存在强耦合关系必须放到同一个优化问题里统一求解。虽然在求解时会用到变量分解和块坐标下降法但这属于算法层面的解耦和问题本身的联合建模定义是两码事。这点理解到位了后面看代码和算法流程才不会糊涂。1.3 考虑MEC任务卸载的计算模型设计联合优化里还有一层绕不开的模型就是计算卸载和边缘计算的时延与能耗建模。每个地面用户的任务都有一个数据量大小比如10KB到100KB不等用户设备本身也有一定的本地计算能力。这里就产生了一个经典的选择任务在本地CPU上算还是卸载给无人机算。本地计算模型相对简单时延由任务数据量和本地CPU周期频率决定。能耗也基本和任务量成线性关系。但放在联合优化的框架下看本地计算有一个隐含作用——如果卸载给无人机的信道条件很差那留着本地计算反而能保证最低限度的任务完成率。所以我在目标函数设计时往往会加入一个卸载收益系数用来刻画“卸载比本地计算省了多少能耗、省了多少时延”目的就是让优化过程自动判断信道好就卸载信道差就留在本地提高整体资源利用率。无人机的MEC服务器计算模型也不复杂。每架无人机有计算能力约束比如每秒处理多少CPU周期。所有关联到该无人机的用户任务会排队等待处理这里要考虑一个排队时延或者处理时延的计算。很多初学者容易犯一个错误把无人机的计算时延简单粗暴地当成任务数据量除以传输速率这完全不对。正确的理解是卸载过程分为上行传输和边缘计算两个阶段两个阶段累加起来才是完整的一跳处理时延这还没算结果回传的下行时延——不过多数场景中下行结果数据量远小于上行任务量实践中会做简化只算上行和计算两段。2. 问题建模的目标函数与约束条件取舍2.1 通信模型LoS概率、信道增益与传输速率通信模型是这套仿真最底层的地基。无人机和地面用户之间的信道一般考虑视距和非视距两种传播状态概率和无人机与用户之间的仰角、距离都有关系。仰角越大LoS概率越高信道就越好。这个LoS概率公式网上能找到很多变体实际使用中要特别注意系数取值不同文献里的结果差异不小需要根据自己的场景做微调。信道增益模型我采用的是比较常见的大尺度衰落加小尺度衰落的组合。大尺度部分主要体现路径损耗小尺度部分则是随机多径效应。不过在多无人机场景中小尺度衰落往往会被做期望处理因为无人机高度较高散射环境相对简单信道更倾向于以LoS主导。这个假设在开阔场景下是比较合理的但如果你仿真的场景是密集城区最好把NLoS概率调高否则仿真结果会偏乐观。传输速率直接由香农公式给出带宽乘以以2为底的对数括号里面是1加上信噪比。信噪比的计算涉及无人机的发射功率、信道增益、干扰以及噪声功率。这里有一个关键点多无人机同时发射信号时用户接收到的不仅是目标无人机的信号还有来自其他无人机的干扰。所以SINR表达式的分母应该是干扰加噪声而不能只写噪声项。这个干扰项的建模直接影响系统性能的真实性我做仿真时会把它完整保留不做近似省略。2.2 目标函数与约束条件的取舍关于目标函数业界比较主流的设定有两种一种是最大化所有用户的最小卸载速率也就是做公平性优化另一种是最小化所有用户的总任务处理时延也就是做效率优化。前者思路更接近“水桶原理”优化过程中会特意照顾信道条件差的用户后者则更偏向“最大化整体吞吐量”计算结果往往会有部分用户被放弃掉。我在这套方案里选的是综合目标最大化系统总卸载吞吐量同时对每个用户的最低卸载速率加了约束确保没有用户完全被饿死。这个设计是仿真场景中比较稳妥的思路既保证了整体性能又兼顾了一定程度的公平性。如果你在做的场景对公平性要求更高比如公共应急通信那就直接换目标函数形式把最大化最差用户速率作为目标就好求解器改变不大主要变化在约束条件上。约束条件整理下来主要有这样几类第一是无人机的飞行速度约束相邻时隙的位置差不能超过无人机最大速度乘以时隙长度第二是发射功率约束遍历所有时隙所有无人机不能超过机载功率上限第三是用户关联约束每个用户同一时隙只能关联一台无人机第四是无人机MEC服务器的计算能力约束关联到同一无人机的任务总量不能超过它的处理能力上限第五是时延约束每个任务的端到端时延不能超过规定的阈值。这些约束必须全部保留任何一个砍掉都会让结果失去工程意义。只有关联约束比较特殊二进制变量在CVX里直接处理容易出问题我在代码里用的是连续化加惩罚项的方案这部分放到算法部分详说。3. 算法设计把非凸问题一步步拆到可解3.1 块坐标下降法BCD与变量解耦联合优化问题的非凸性主要来自三个方面轨迹变量和信道增益之间的耦合、功率变量在香农公式里的非凸性、关联变量是二进制整数。这三个问题不解决原问题根本没办法直接扔给CVX求解必须做算法层面的拆解。我采用的是块坐标下降法。这是一种非常经典的迭代思路把原问题拆成几个子问题每次先固定其他变量只优化其中一个变量块然后换下一个变量块继续优化最后循环迭代直到收敛。因为每个子问题都比原问题简单很多甚至可以直接用CVX求解所以整体实现难度大大降低。具体到这套场景变量拆成三个块轨迹块、功率块和关联块。迭代流程是这样的先给定无人机的初始轨迹和发射功率那么关联子问题就变成了一个在已知信道条件下分配用户到无人机的问题这可以用CVX配合整数松弛来求解也可以用匈牙利算法直接做匹配然后固定关联关系和发射功率轨迹优化就被简化成了一个纯几何规划问题尽管仍然非凸但可以通过逐次凸逼近处理最后固定轨迹和关联功率子问题会用SCA配合凸逼近来求解。三轮迭代后再回到关联优化循环往复。3.2 逐次凸逼近SCA与松弛策略逐次凸逼近思路在轨迹优化里非常关键。轨迹变量之所以让优化困难是因为它的目标函数里含有与位置相关的信道增益这个关系不是凸函数。SCA的核心操作就是在每一次迭代中把信道增益或者速率表达式在某个局部点做一阶泰勒展开用这个近似式代替原函数从而让整个子问题变成凸问题。随着迭代推进逼近点不断更新近似结果会逐步逼近原问题的最优解。我实测下来SCA的收敛效果很大程度上取决于初始点选得好不好。如果初始轨迹完全随机给一个第一轮迭代的信道增益逼近误差会很大后面要很多轮才能拉回来。所以我在代码里给了一个比较实用的初始化策略首先根据用户的地理分布做一次重心聚类把用户聚成N个簇每架无人机的初始悬停点设在自己的用户簇重心上。这个“基于任务分布聚类”的初始化方式后面优化起点高了一个台阶收敛速度明显加快最终结果也更好。关联变量的二进制约束也是难点。我的处理方式是在CVX里先把二进制变量松弛成0到1之间的连续变量优化结束后再根据阈值做还原具体操作是大于0.5的取1小于等于0.5的取0。单纯松弛有一个问题求解结果往往是中间值比如0.6、0.4这在物理上无法解释。所以我在目标函数里加了一个惩罚项对关联变量靠近0或1的比例做奖励这样既能推动变量向端点收敛又不会破坏整个问题的凸性。这个方法在小规模场景中表现很好基本不会出现离谱的中间值。3.3 求解器与工具的选型解析MATLAB里解凸优化子问题CVX工具箱是最常用的选择。CVX底层其实默认自带SDPT3和SeDuMi两个求解器但如果你把CVX当作了一个对“求解器无关”的黑盒子往往会在真正的大型场景里踩坑。以我实际体验来说这类包含SCA迭代求解的算法因为每次迭代的模型结构极为相似SDPT3的表现反而比SeDuMi稳定尤其是在做连续松弛的多次迭代时不容易出现数值异常。MOSEK作为商业求解器精度最高但需要注意两点一是它不是CVX默认内置需要单独配置二是某些版本的CVX和MOSEK之间存在接口冲突特别是在处理平方根约束时容易直接报错。我来来回回试过几次之后默认配置其实是最稳的选择只有当系统规模特别大时才会考虑换MOSEK来提速。4. MATLAB代码架构与关键实现细节4.1 代码整体结构与初始化这套代码的整体结构我分成了三个相互独立的模块参数初始化脚本、核心迭代优化函数、结果绘图与数据保存模块。这样做的好处很直接——参数调优完全在单独文件里改核心算法只负责处理变量优化结果分析也不受仿真流程影响三个模块间通过结构体传参互不干扰。参数初始化模块里要设置的内容包括用户坐标的分布范围、无人机数量、每个时隙的时长、总时隙数、信道带宽、无人机最大发射功率、接收端的噪声功率、无人机最大飞行速度、地面用户的本地计算能力、无人机MEC服务器的CPU频率、任务数据量的大小等。这些参数看似简单但不同取值组合会直接决定优化效果不建议随便拍脑袋定。我的经验是先参照相近研究领域已有文献的相关设置再根据自己仿真需求微调这样可以保证结果具备可比性。核心迭代优化函数实现了BCD和SCA的完整流程。这个函数内部就会运行一个大的while循环设定最大迭代次数和收敛阈值。每次循环内部依次调用三个子函数优化关联的子函数、优化轨迹的子函数、优化功率的子函数。每个子函数内部都是用CVX构建对应子问题的凸近似版本并求解然后把求解结果写回到全局变量中供下一次迭代使用。循环终止条件是迭代达到最大次数或者两次迭代间目标函数变化量的绝对值小于预设阈值例如1e-4。结果绘图模块我做得比较细致主要包括无人机最终飞行轨迹的二维平面图、每时隙不同用户的关联分配热力图、目标函数随迭代次数变化的收敛曲线、功耗时变曲线等。这些图对于学术论文和项目汇报来说基本是标配直接可以用不需要重新写绘图脚本。4.2 CVX建模与关联子问题的实现关联子问题的建模代码是整套代码里最直观的部分。我来写一段核心的代码框架里面配了必要的注释实践时可以直接嵌入自己的工程模板。CVX建模最核心的一点就是先把变量声明清楚再明确目标函数和约束条件。cvx_begin quiet variable a(N, K) % 关联矩阵N架无人机、K个地面用户 maximize( sum(sum(rate_matrix .* a)) - lambda * sum(sum((a - 0.5).^2)) ) % rate_matrix 是给定轨迹、功率情况下每个用户到每架无人机当前时隙的卸载速率 % 后半部分为二进制松弛惩罚项促使 a 的值更接近 0 或 1 subject to sum(a, 1) 1; % 每个用户只能关联到一架无人机 a 0; a 1; % 还可以加计算负载约束 % sum(a, 2) * task_size compute_capacity(N) cvx_end可以明显看到这个子问题的线性形式和简单约束让CVX求解极快几毫秒就能返回结果。但要提醒一句rate_matrix的计算必须要和当前迭代的轨迹、功率匹配一定不能使用初始的旧矩阵否则迭代过程会错乱。4.3 轨迹子问题的神经网络逼近实现轨迹子问题的求解难度比关联子问题高不少。信道增益里含有无人机位置变量而且位置变量的改变会让对数部分的速率发生变化目标函数对位置变量极其敏感。因此这个子问题的求解策略是SCA先对部分非线性项做泰勒展开再调用CVX求凸近似解。% 在SCA循环内部 for t 1:M % 遍历时隙 % 提取当前时隙无人机位置 q_t q_t q(:, t); % 计算当前点到用户k的信道增益 h_k h_k channel_gain(q_t, user_pos(:, k)); % 对速率表达式做一阶泰勒展开近似 rate_approx rate_current gradient_rate * (q - q_t); cvx_begin quiet variable q_next(3, 1) % 最大化累加的近似卸载速率 maximize( user_w * rate_approx ) subject to norm(q_next - q_t) v_max * delta_t; % 速度约束 q_next safe_height_lb; % 飞行下限安全约束 q_next safe_height_ub; cvx_end q(:, t) q_next; end这里用到了梯度信息在代码实现中我通过解析方式计算路径损耗对位置的偏导数而不是用数值差分近似。解析梯度在CVX外计算好再显式传入近似表达式里。如果偷懒用数值差分不仅每次迭代多出大量额外计算精度也会因为步长设定不合适而变得飘忽不定。4.4 功率子问题与CVX的数值稳健性功率子问题和轨迹子问题的核心差异在于功率变量直接出现在信噪比的分子上log1p展开的非线性极强。我处理这个子问题时同样使用了连续凸逼近将速率表达式在上一轮迭代的功率值处做一阶泰勒展开目标是得到一个凹的近似函数最大化它就等于最大化原速率的上界近似。功率子问题还有一个实际难点就是数值问题。我在这块踩过坑初始几轮迭代时如果功率值太小信噪比项会出现处理结果为NaN的情况直接让CVX报错并中断运行。后面我加了两层防护一是给信噪比表达式的分母加上一个极小常数例如1e-6避免除零二是限定功率初值不能低于一个低限比如 -10dBm防止迭代震荡时功率直接掉到物理不可达的区间。下面这段是功率子问题的代码结构上可以作为参考cvx_begin quiet variable p(N, 1) inter_model power_tx * channel_gain_to_user; sinr_val inter_model ./ (noise interference_other_uav 1e-6); rate_val B * log(1 sinr_val); maximize( sum(rate_val) ) subject to 0 p pmax; cvx_end功率优化的时候还要注意多架无人机之间干扰项的更新时机。我采用的是类似高斯-赛德尔的思想就是在优化某架无人机功率时其他无人机的功率值保持为上一轮迭代的结果。这样做的好处是让子问题规模大幅缩小同时保证目标函数是凹函数。过渡到完全并行的高斯-牛顿式优化方式虽然理论上收敛更慢但实际仿真中发现差别并不大。5. 仿真结果分析与性能对比5.1 联合优化与单独优化的性能差距为了验证联合优化的必要性我在同一组仿真参数下跑了多组对比实验第一种是完整方案轨迹、功率、关联全部联合迭代优化第二种是固定轨迹只优化功率和关联第三种是轨迹和关联固定只优化功率第四种是完全随机三个变量全部用固定值。结果很明显。完整方案的系统总吞吐量相比固定轨迹方案大概提升了22%相比全随机方案提升了约50%。这个差距主要来自轨迹优化带来的信道质量改善——无人机移动到用户附近后同一份功率预算能换回来的卸载速率高了一个档次。另外从收敛曲线上看完整方案大约经过30到40次BCD大迭代就能稳定收敛耗时在可接受范围内。固定轨迹的方案虽然收敛更快但稳定点对应的目标函数值明显更低说明它陷在了一个局部较差的解上。5.2 不同系统规模下的表现为了测试代码的可扩展性我分别设置了2、4、6、8架无人机配合10、20、30个地面用户的组合。小规模场景下比如2架无人机10个用户联合优化能在5轮之内快速收敛整体求解时间不超过10秒。如果一次仿真要重复跑上百组随机信道样本这个体量的效率是能接受的。到了8架无人机30个用户的规模问题复杂度显著上升一轮BCD迭代里轨迹子问题要处理8个时隙的位置变量CVX求解时间明显拉长。整个仿真单次运算耗时能达到分钟级但收敛轨迹依然稳定。如果用户规模更大几十上百的量级这套基础框架就需要做进一步改进比如引入深度学习代理模型代替重复的CVX求解或者把问题拆成多时隙并行处理。这些属于后续扩展方向在基础代码跑通之后有需要再升级。5.3 收敛性与稳定性分析收敛性分析对算法落地至关重要。我记录了一次完整仿真的目标函数值变化过程前10轮迭代目标值迅速增长曲线几乎是直线拉升10轮到20轮之间增速放缓进入明显的“精修阶段”开始调整一些边缘关联和轨迹细节20轮之后曲线基本趋于平稳仅有微小波动。最终在40轮时满足收敛条件输入输出结果。从稳定性角度来评估多组随机初始参数下的重复实验最终目标值标准差控制在3%以内说明算法对初始值的依赖已经控制到了一个合理水平。这个稳定性主要得益于初始化时基于用户分布聚类给出的初始轨迹。如果随机撒点作为初始轨迹目标值的波动可能翻倍收敛所需的迭代次数也会显著增加建议任何想修改初始化逻辑的朋友慎重对待这一步。6. 常见问题、报错排查与避坑建议6.1 CVX求解器报错与收敛性问题的处理我在多次跑仿真的过程中遇到过不少问题这里把最高频的几个问题列成速查表方便其他人直接对照排查。问题现象可能原因解决方案CVX报“Disciplined convex programming error”目标函数或约束写成了非凸形式检查是否漏了SCA泰勒展开或者将log函数直接用在了变量上迭代不收敛目标值震荡关联变量惩罚项系数过大致使子问题偏差过大调小惩罚系数或者采用逐步增大惩罚策略无人机轨迹飞出安全区域位置更新时未限制最大速度和高度检查位置更新公式中是否使用上一时隙作为基准以及时隙长度设定是否合理目标函数出现NaN信噪比计算时分母接近0或数据溢出给分母添加一个极小常数同时限制发射功率下界结果关联关系过于模糊二进制松弛惩罚力度不够增加惩罚项系数或增加迭代次数也可以在最后用二分匹配修正我在实践中发现对收敛性影响最大的两个因素分别是初始轨迹位置和惩罚项系数大小。初始轨迹建议按照第3.1节说的聚类思路来产生避免随机撒点引起的大幅波动。惩罚项系数不建议固定成一个常量更稳的做法是先从一个较小值开始例如0.1每迭代若干轮后按倍数递增到预设上限。这种逐步增大的机制既能保证前期搜索的自由度又能在后期促使关联变量快速向整数解靠拢。6.2 实测操作中的几条经验心得第一从单无人机场景起步。我最初直接把代码写成多无人机版本调参时问题非常隐蔽收敛失败也分不清是轨迹问题、功率问题还是用户间干扰问题。后面改成先跑单无人机单用户再把用户数量逐步扩到多个最后才扩展到多无人机整个调试过程顺畅了不止一点。建议任何基于这套框架做二次开发的朋友都按这个顺序来。第二注意时隙划分和数据量纲。同样一组参数如果时隙长度取得太小无人机轨迹更新间隔太短速度约束会变得非常严格无人机几乎没有移动的自由度轨迹优化基本失效。反过来时隙设得太大无人机过度机动信道状态变化被平滑掉了同样得不到合理的轨迹。合适的时隙长度应该和无人机的机动尺度以及任务时延要求匹配起来。第三仿真结果一定要多做几次独立重复实验再去下结论。由于信道小尺度衰落带随机性单次仿真结果可能正好落在好或者不好的样本上。我在每次参数调整后都会跑20到50组独立实验全部结果取平均再对比这样出来的性能曲线才具备说服力。做学术实验、写论文或者做项目汇报这个习惯都太重要了。第四不要迷信某一个优化策略不放。比如固定使用某种凸松弛方式偶尔在极端参数下会出现松弛解和整数解差距过大的情况。我在代码里留了一个开关可以切换成基于匈牙利算法的关联方案一旦发现CVX松弛结果不理想就用这个备用方案兜底。两个方案输出的目标值略有差异但都能正常完成本轮迭代保证项目整体进度不被单点问题阻塞。6.3 结果可视化与论文出图建议仿真做完了出图也是至关重要的一环。我建议至少准备四类图无人机飞行轨迹与用户分布的平面图、每时隙用户关联分配的结果图、目标函数值随迭代次数变化的收敛曲线、以及卸载速率/能耗在不同方案下的对比柱状图。四类图分别对应模型有效性、优化过程、收敛特性和性能增益基本覆盖了论文里“仿真结果与性能分析”章节的全部核心图示。画图时注意几个细节轨迹图用不同颜色区分不同无人机同时在飞行路径上标出时隙序号或箭头表示飞行方向关联分配图可以把每架无人机负责的用户用同色标注这样能直观看出每架无人机的工作载荷是否均衡收敛曲线要用对数横坐标还是线性横坐标取决于你迭代次数的分布我自己更习惯用线性横坐标将前20轮的快速上升表现得更加清晰对比柱状图务必加上误差棒否则审稿人或者答辩组大概率会质疑你的结果稳定性。这套代码框架后续扩展空间也很大。比如把单目标优化改成多目标帕累托优化同时优化时延和能耗再比如把静态任务模型改成动态随机到达模型这种做法更贴近真实业务场景或者进一步引入强化学习让无人机轨迹能够对实时变化的用户需求和信道状态做出在线决策。基础框架梳理清楚后这些方向的改造都建立在现有代码的基础上不用推倒重来。跟这个联合优化课题纠缠了这么久我最大的感受就是别指望一上来就能写出一个一气呵成的完美求解器。把耦合问题拆成独立的子问题一个一个突破再把它们组装起来做联合迭代这条路看起来朴素却是解决复杂优化问题最经得起考验的方法。目前这套代码和思路在我手头的多个仿真场景里都验证过了效果稳定可靠希望这篇详细的拆解过程能帮到正在这条路上摸索的朋友。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑