1. 项目概述与核心需求解析
1.1 这个项目解决的到底是什么问题
先说结论:这是一个典型的“算力离用户更近”的研究课题。5G时代网络带宽上去了,但用户终端的计算能力始终有限,AR/VR、自动驾驶、高清视频处理这些应用对时延极其敏感,把数据全部回传到云端处理,往返时延根本扛不住。移动边缘计算(MEC)的核心思路就是把计算任务下沉到网络边缘,在基站侧或者更靠近用户的地方部署算力节点。
但如果地面基站覆盖不到或者负载过高呢?无人机的机动性就派上用场了。它可以在热点区域临时悬停,充当“会飞的边缘服务器”。这个项目的核心目标,是在大规模用户场景下,解决三个紧密耦合的问题:
- 无人机部署在哪:每架无人机的位置直接决定了它能服务多少用户、信道质量如何。
- 算力怎么分配:无人机和地面基站各自能提供多少计算资源,给哪些用户用。
- 任务到底卸载到哪:用户在本地算、卸载给无人机算、还是卸载给地面基站算,每个决策都影响时延和能耗。
这三个问题不是独立存在的——部署位置变了,信道增益就变,卸载决策就得跟着调;卸载决策变了,算力分配的压力又不一样。所以项目标题里的“联合部署与任务调度优化”就是这个意思:把多个决策变量放进同一个优化框架里去求解,而不是拆开一个个单独贪心。
1.2 为什么“多无人机”比“单无人机”更有研究价值
很多人做无人机MEC会先从单无人机入手,模型简单、仿真快、论文好写。但实际场景里单无人机有个很尴尬的局限:一架无人机的覆盖半径和算力资源都非常有限。假设一架无人机能同时服务几十个用户,在大规模用户场景下,比如一场演唱会或者一次应急救灾,几百上千个用户同时请求计算卸载,单无人机的算力很快会成为瓶颈。
多无人机的难点在于它们之间不只是简单的“分工覆盖”,还存在协同和干扰的问题:
- 无人机之间不能离得太近,否则同频干扰会很严重,信道容量掉得厉害。
- 多无人机覆盖会出现重叠区域,重叠区的用户该选谁?这本质上是一个博弈问题。
- 每架无人机自身的能耗要控制,因为无人机续航就是几十分钟到一小时,如果为了算力消耗把电量耗尽,连飞行任务都完不成。
所以多无人机联合部署与任务调度优化,不只是把单机版本“乘个数量”,它涉及到用户关联(association)、干扰管理、负载均衡、能耗约束等一整套复杂机制的重新设计。这也就是为什么这类课题近年来在通信和计算机领域都很热门。
1.3 哪些人适合参考这个项目
如果你属于下面几类人,这个项目值得仔细看:
- 通信工程或计算机专业的研究生:正在找边缘计算、无人机通信方向的论文切入点,这个项目的系统模型和优化框架可以直接作为基线方案。
- 做MEC仿真的工程师:手上有NS-3、MATLAB或者Python仿真环境,缺一个完整的联合优化方案做对比实验。
- 对启发式算法感兴趣的人:看惯了纯凸优化求解,想了解遗传算法、粒子群这类元启发式算法怎么落到实际工程问题上。
下文我不会只讲理论,会把系统建模、问题求解、代码实现的关键细节和坑都写清楚,尤其是MATLAB和Python两套代码怎么配合使用,这部分网上资料少,属于实操干货。
2. 系统建模与方案选型思路
2.1 系统场景的结构化拆解
做这类研究第一步就是把场景“量化”,不然后面没法建模。我以该方向最常见的标准场景来搭建系统,项目采用的模型也基于同一个框架:
假设区域内有 U 个地面用户,部署了 N 架无人机和 M 个地面基站(或边缘服务器节点)。用户产生了计算任务,每个任务可以用三元组表示:
- 任务数据量(D_u):需要传输的比特数,包括输入数据以及必要的指令信息,单位是bit。
- 计算密度(c_u):每bit数据需要的CPU周期数,单位cycles/bit。
- 最大容忍时延(T_u^{max}):任务必须在这个时间内完成,否则就算卸载失败。
这个三元组是任务卸载建模里的经典设置。计算密度这个参数很关键,比如简单的数据压缩任务可能只需要几百cycles/bit,但一个实时视频推理任务的密度可以轻松到几千甚至上万cycles/bit。
系统里有三种计算方式可以选:
- 本地计算:用户用自己的CPU算,优点是省去传输时延,缺点是对用户设备功耗和时延压力大。
- 卸载给无人机计算:通过空对地信道传输数据,算力由无人机提供,传输距离近但空对地信道受高度和环境影响。
- 卸载给地面基站计算:通过地面蜂窝链路传输,信道相对稳定,算力通常更大但网络可能拥塞。
每个用户最终只能选择其中一种方式,这就是二元/多元决策变量的来源。整个系统优化的目标,通常是最小化所有用户的总时延和总能耗的加权和。
2.2 信道模型:空对地与地对地的差异
这里必须提一个很容易写错、但仿真结果影响巨大的点:无人机和用户之间的信道模型,不能直接套用地面通信的路径损耗公式。
空地链路的特点在于它有很强的视距(LoS)概率特性。无人机高度越高,遮挡越少,LoS概率越大。经典的建模方式是:
[ P_{LoS}(\theta) = \frac{1}{1 + a \cdot \exp(-b \cdot (\theta - a))} ]
其中 (\theta = \arcsin(H / d)) 是无人机与用户之间的仰角,(H) 是无人机高度,(d) 是两者间直线距离,(a) 是环境相关系数(比如城市、郊区、密集城区取值差异很大),(b) 是衰减系数。
而平均路径损耗则是LoS和NLoS两种情况的加权平均:
[ PL = 20 \log_{10}(d) + P_{LoS} \cdot \eta_{LoS} + (1 - P_{LoS}) \cdot \eta_{NLoS} ]
我见过不少初做这个方向的人直接沿用地面宏基站模型 (PL = 128.1 + 37.6 \log_{10}(d)),结果就是无人机部署优化完全失效——因为高度变化对信道影响被抹平了,你优化半天部署高度,发现信道增益都不变,这显然和实际不相符。如果是在城市环境,系数 (a=9.61, b=0.16) 是一组常用的参考值;郊区则更接近 (a=4.88, b=0.43)。
2.3 为什么选择“加权时延+能耗”作为优化目标
做联合优化问题,目标函数基本绕不开两个核心指标:时延和能耗。一个典型的做法是定义系统总代价:
[ C(u, n) = \alpha \cdot (T_u^{local} \cdot x_u^{local} + T_{u,n}^{offload} \cdot x_{u,n}^{offload}) + \beta \cdot (E_u^{local} + E_{u,n}^{offload}) ]
其中 (T) 是任务完成时延,(E) 是设备能耗,(\alpha) 和 (\beta) 是权重系数。为什么需要权重?因为不同场景下用户需求不一样:物联网传感器更在意能耗(续航),自动驾驶对时延敏感,视频流应用则两者都重要。用权重把两者统一成单目标,用户按场景调节 (\alpha) 和 (\beta) 比例,做出来的结果才实用。
这个项目迭代过程中,我把 (\alpha/\beta) 从3:1调到1:3分别做了一组实验,明显可以看到:当 (\alpha) 更大时,算法会把更多任务卸载出去,宁可多耗电也要保证时延;当 (\beta) 更大时,大量任务留在本地计算,时延变大但能耗降了。这就是典型的多目标权衡,理解这个,后续看算法迭代的收敛曲线才更有感觉。
2.4 求解思路:为什么不用纯凸优化
如果你把部署位置(连续变量)、任务卸载决策(0-1整数变量)、算力分配(连续变量)放在一起看,这个问题是一个**混合整数非线性规划(MINLP)**问题。这类问题的特点是:变量类型混杂,约束条件多,目标函数非凸,标准凸优化工具很难直接求解。
行业里最常用的解法是分解+交替优化:
- 第一层:固定无人机位置,把任务卸载决策和算力分配作为子问题求解。0-1整数部分可以尝试匈牙利算法、贪婪策略,或者松弛成连续变量再取整。
- 第二层:固定卸载决策和算力分配,优化无人机位置,这一步可以转化为无人机部署优化,用连续优化或者启发式算法。
- 外层循环:反复交替执行第一层和第二层,直到目标函数变化小于阈值,输出近似最优解。
项目附带的MATLAB代码和Python代码,核心实现思路就是这个分解框架。MATLAB那边用内置的优化工具箱做小规模精确求解,Python这边写了遗传算法和模拟退火来处理大规模场景,两种方法互相验证。
3. 核心算法设计与实现细节
3.1 算法框架总览
整个求解流程可以归纳为下面的步骤(我会在后续小节拆开讲每一步):
- 初始化无人机位置、用户位置、任务参数。
- 固定无人机位置,求解用户关联与卸载决策子问题。
- 固定卸载决策,求解无人机位置部署子问题。
- 更新全局系统代价,判断是否满足收敛条件。
- 若不收敛,回到步骤2;若收敛,输出最终部署方案和卸载策略。
听起来简单,实际实现时每一步都有坑:子问题求解方式选什么、初始化怎么设、约束惩罚项怎么加,都会直接影响收敛速度和解的质量。
3.2 用户关联与卸载决策:0-1变量处理技巧
卸载决策是经典的0-1变量。一个用户要么在本地算((x_u^{local}=1)),要么卸载给某一架无人机((x_{u,n}^{offload}=1)),要么卸载给某个地面基站((x_{u,m}^{offload}=1)),且满足:
[ x_u^{local} + \sum_{n=1}^{N} x_{u,n}^{offload} + \sum_{m=1}^{M} x_{u,m}^{offload} = 1, \quad \forall u ]
处理这个0-1决策子问题,我实际试下来有几种做法,效果差异很大:
- 连续松弛法:把0-1变量放宽到[0,1]区间,用凸优化求解后按阈值取整。优点是速度快,缺点是大规模场景下取整误差可能导致用户过载或信道超过最大容量,需要后处理修正。
- 匹配算法:把用户看成需要匹配的任务,把无人机看成资源,用户根据信噪比和算力容量打分,用匈牙利算法或者优先队列匹配。这个方法在小规模场景效果很好,而且天然保证每个用户只匹配一台无人机。
- 启发式规则:先把所有用户按本地计算成本排序,成本高的优先卸载,然后在候选无人机里选时延最小的。简单粗暴,但是作为后续启发式算法的初始解效果不错。
项目里的MATLAB代码采用连续松弛+后处理修正,Python代码里的遗传算法则直接将0-1决策编码为染色体,初始解用启发式规则生成。两种方式对比下来,小规模场景下两者误差在5%以内,大规模场景下遗传算法稳定性更优。
3.3 无人机部署优化:连续变量如何更新
无人机部署变量是连续的,每架无人机有横坐标、纵坐标、高度三个维度。但是实际场景里,无人机的飞行高度受限于空域规则和续航,通常被约束在 (H_{min} \le H \le H_{max}),而水平坐标被限定在服务区域范围内。所以代码里的部署变量做了归一化处理,让所有变量范围映射到[0,1]区间,这样遗传算子的交叉和变异更容易产生有效解。
高度变量值得单独说。给定水平位置后,存在一个最优悬停高度。高度太低LoS概率低,路径损耗大;高度太高直线距离变大,路径损耗也增大。实际可以扫一遍高度值观察系统时延随高度的变化曲线,通常会发现一个U形曲线,最优高度在城市环境中往往在80-120米左右。如果项目的代码提供了高度灵敏度分析的功能,建议跑一下看看,这个结果写论文都是很好的素材。
3.4 算力分配与能量约束建模
3.4.1 无人机计算能力分配
假设每架无人机总的CPU频率为 (F_n^{max})(如 10GHz,即每秒 (10^{10}) 周期),分配给所有关联用户的总和不能超过这个上限:
[ \sum_{u \in \mathcal{U}n} f{u,n} \le F_n^{max} ]
在代码里,这个约束是通过一个比例因子去控制的。简单做法是把所有待卸载任务需要的周期数加总,再按比例分配到每个用户,这种做法不会触容量上限,但可能导致负载不均衡。更好的做法是用加权公平分配:根据每个任务的最大容忍时延 (T_u^{max}) 来分配更多算力,时延要求更紧的任务分到更高比例。代码里可以调整这个权重调节因子,默认是等比例分配,追求最优解时建议手动调一调。
3.4.2 无人机飞行能耗与悬停能耗
很多人搞混飞行能耗和悬停能耗。无人机飞行过程中需要克服重力、空气阻力,功率很高,但这个项目的假设是无人机先飞到部署点,之后大部分计算卸载场景下处于悬停状态,所以能耗模型用的是悬停功率 (P_h) 加计算功率 (P_{comp})。
典型的多旋翼无人机悬停功率可以通过动量理论来估算,一个较常用的参考值是200-300W(对应小中型多旋翼)。计算功率和CPU频率的关系可以用动态功耗公式近似:
[ P_{comp} = \kappa \cdot f^{\gamma} ]
其中 (\kappa) 是芯片有效电容系数,(\gamma) 通常取3左右。代码里这两个参数都是可配置的。这个公式说明计算功耗和频率的三次方成正比,由此衍生出一个重要结论:与其把算力平均分给所有用户,不如集中算力给少数时延敏感任务,反而更省电。这也是项目标题里所谓“高效能”的一个重要内涵。
3.5 Matlab 代码模块划分
MATLAB部分整体分为四个模块,我从实际代码结构里给你梳理一下:
- main.m:主入口脚本,负责初始化环境参数、调用优化循环、输出结果图表。
- init_system.m:用户位置生成(支持均匀分布和聚类分布两种模式)、无人机初始位置设定、任务参数随机生成。
- optimize_deployment.m:无人机部署子问题求解器,内部调用fmincon或者模式搜索方法,处理连续变量的优化。
- optimize_scheduling.m:任务卸载子问题求解器,内部实现连续松弛+后处理机制。
- evaluate_cost.m:计算系统总代价、时延统计、能耗统计,供优化循环使用。
这套代码结构的好处是模块间耦合低,你替换任何一个子问题求解器都不会影响其他模块。比如你想把fmincon换成粒子群来对比效果,只需要改optimize_deployment.m内部实现,主循环不用动。
3.6 Python 端的启发式算法布局
Python代码走的是大规模场景路线,核心算法用了两个:
遗传算法(GA):用于无人机位置优化。种群规模建议设30-50,迭代次数100-150代。染色体编码为 (N \times 3) 的实数向量,分别对应每架无人机的经纬度和高度。适应度函数就是总代价函数。代码里做了约束处理——如果某个个体生成的无人机位置超过区域边界或者高度范围,直接罚一个很大的值,这样可以让搜索向可行域收敛。
模拟退火(SA):用于任务卸载决策优化。初始温度设置为100,降温系数0.9,每个温度迭代20次,终止温度0.01。SA的优势是随机扰动跳坑能力强,代码里的邻域操作是随机改变一个用户的卸载决策,如果新解代价更低则接受,否则按Metropolis准则以概率接受。实测中SA在中等规模(200用户)下比纯贪心算法好8%-12%左右。
4. 环境配置与代码运行实操
4.1 MATLAB 环境要求与依赖工具箱
如果要用MATLAB跑这套代码,建议版本在R2021a或以上。核心不需要太多额外工具箱,但有几个函数可能用到:
- Optimization Toolbox:fmincon、patternsearch。
- Parallel Computing Toolbox:如果开启并行种群评估,需要用到parfor。
运行main.m前,先确认你的MATLAB路径已经添加了项目文件夹。直接在命令行窗口执行run('main.m')即可。如果报函数未定义,大概率是路径问题,用addpath(genpath('项目根目录'))解决。
4.2 Python 环境依赖清单与安装
Python代码依赖较少,核心库包括:
- numpy(矩阵运算)
- scipy(优化函数库)
- matplotlib(结果可视化)
安装命令一行就够:
pip install numpy scipy matplotlib建议在虚拟环境里跑,避免和系统Python环境冲突。如果使用conda:
conda create -n mec python=3.9 conda activate mec pip install -r requirements.txt4.3 重要参数配置说明
代码里有一批核心参数,直接影响实验结果。我把常用的配置整理成表,方便你对照调参:
| 参数名 | 含义说明 | 典型推荐值 | 备注 |
|---|---|---|---|
| num_users | 用户数量 | 50-500 | 超过300建议用Python代码 |
| num_uavs | 无人机数量 | 3-10 | 覆盖区域小时不要超过5 |
| area_size | 服务区域尺寸(米) | 1000x1000 | 正方形区域边长 |
| uav_height | 无人机初始高度(米) | 100 | 后续由优化算法自动调整 |
| task_size | 任务数据量范围(Mbit) | 1-20 | 随机生成时用均匀分布范围 |
| c_u | 计算密度(cycles/bit) | 500-2000 | 可设置固定值或随机范围 |
| T_max | 最大容忍时延范围(秒) | 0.5-2.0 | 时延敏感任务小于0.5 |
| alpha_weight | 时延权重系数 | 0.5 | 与beta_weight之和为1 |
| beta_weight | 能耗权重系数 | 0.5 | 体现用户侧能耗影响 |
| uav_cpu | 无人机CPU频率(GHz) | 10 | 按实际无人机平台调整 |
| uav_power_hover | 无人机悬停功率(W) | 200 | 中小型多旋翼参考值 |
4.4 初跑最小示例与预期输出
建议第一次跑先用小规模验证代码链路是否通畅。参数设置为:用户60个,无人机3架,地面基站2个,区域范围500x500米,迭代100次。跑完MATLAB代码,应该能看到几个输出图表:
- 用户和无人机的平面部署示意图(用户用点,无人机用三角形标注)。
- 收敛曲线图:横坐标是迭代次数,纵坐标是系统总代价,曲线应该呈递减趋势,在50代左右开始平缓。
- 卸载方案统计图:本地计算、无人机卸载、基站卸载三类任务的比例柱状图。
如果收敛曲线不是平滑下降而是剧烈震荡,大概率是退火温度参数或者遗传算子设置问题,参考5.2节的排查建议。
5. 常见问题与排查技巧实录
5.1 收敛缓慢或陷入局部最优的处理
这是跑启发式算法最常遇到的问题。我实测中的经验是:如果目标函数在迭代后期基本不动但还没到理想值,大概率陷入了局部最优。解决办法有三个方向:
- 增大初始退火温度。初始温度决定了搜索初期接受差解的概率,如果初始温度过低,算法很快就会收敛到局部最优,连跳坑的机会都没有。建议从100提到150,看收敛曲线是否变得更好。
- 引入变异策略。遗传算法里每10次迭代随机插入几个完全随机新个体,相当于“空降兵”,能把种群从局部最优里拉出来。
- 多起点重启。跑10次独立优化,每次随机初始化,取最优结果。这个方法简单粗暴,但效果最稳定,尤其适合无人机数量较多、解空间复杂的场景。
5.2 约束违规导致解不可行
我在初版代码里吃过一个亏:算力分配约束被忽视,导致生成的卸载方案中无人机算力超载,但MATLAB由于数值容差没报错,输出的结果却是不可行的。后来我加了一步后处理校验模块,核心逻辑是:
- 对每架无人机,统计所有卸载给它的任务所需总CPU周期。
- 如果超过 (F_n^{max}),按任务的最大容忍时延排序,从最宽松的开始把任务移到其他无人机或本地。
- 直到所有无人机都不超载,才输出最终方案。
这个问题很容易被忽略,因为小规模算例的随机任务量碰巧都会满足容量限制,大规模时才会暴露。建议在代码里加一个可行性检查函数,每次迭代后调用一次,避免白白跑了几十分钟然后给出一堆废数据。
5.3 可视化图表异常:部署点重叠或超出区域
无人机优化到后期可能出现两架无人机位置高度重合,这在实际中是物理不合理的。原因通常是目标函数里缺少了无人机间最小间距约束。解决办法是在目标函数中增加惩罚项:
[ C_{penalty} = \lambda \cdot \sum_{i < j} \max(0, D_{min} - | p_i - p_j |_2) ]
其中 (D_{min}) 是无人机间最小安全间距,典型值20-50米。这意味着如果两架无人机距离小于 (D_{min}),就给目标函数增加一个正惩罚,促使优化算法把它们分开。
5.4 卸载比例异常的排查思路
如果实验结果显示几乎所有任务都卸载给了无人机,地面基站完全空闲,可能有三种原因:
- 时延权重过大:把 (\alpha) 和 (\beta) 调整到0.5:0.5后重新跑。
- 空地信道模型参数错误:检查路径损耗参数中的LoS/NLoS附加损耗是否合理。如果(\eta_{LoS}) 设置过小,空地链路损耗会显著低于地面链路,导致所有任务都往无人机走。
- 算力容量没起作用:检查算力分配代码,确保容量约束真的被纳入目标函数而非被跳过。
我把这三种情况逐一排查过,其中信道模型参数的坑最隐蔽,因为图表显示出来只是比例偏差,完全不会给出具体报错,不看公式的人根本想不到是这里的问题。
5.5 代码运行效率优化
大规模用户场景(500用户)下,如果每次迭代都要遍历所有用户-无人机的两两组合,复杂度是 (O(U \times N)),而外层循环迭代次数又是150代,总体来说也能接受,但MATLAB的for循环还是偏慢。以下两个优化手段亲测有效:
- 向量化计算:把用户和无人机的坐标用矩阵存储,一次广播计算所有距离、信道增益、时延和能耗,而非逐用户循环。
- 并行化:在遗传算法的种群评估环节,用
parfor替代for,配合多核机器可以缩短三成以上运行时间。注意parfor要求每个迭代之间独立,GA种群评估恰好满足这个条件。
6. 离线数据分析与结果解读
6.1 用户规模对系统性能的影响趋势
我按50、100、200、500四档用户规模分别做了实验,取最优结果对比。核心趋势是:随着用户数量增加,单位用户的平均时延和能耗都在上升,但增幅在算法优化后明显比未经优化的基准方案平缓。原因是多无人机提供了更多的算力和覆盖冗余,负载可以被摊到多台无人机上。
这个结果在写论文或者做项目汇报时很加分。benchmark对比最好设计四组:本地计算、纯地面基站卸载、单无人机+基站、多无人机联合优化,四组曲线放在一张图里,数据说服力非常直观。
6.2 权重系数的灵敏度分析
如果把 (\alpha/\beta) 从9:1连续扫描到1:9,观察全局代价变化,会发现系统的时延-能耗帕累托前沿。我实测的一条经验是:(\alpha/\beta = 2:1) 左右通常是最均衡的工作点,这时系统没有明显短板。用户对时延敏感度更高的场景,可以把比例调到4:1,代价是总能耗会比均衡点多出15%-20%,这就是“高效能”中的“效”和“能”之间的取舍。
6.3 无人机数量增加带来的边际收益递减
增加无人机数量确实能降低系统时延,但不是线性的。我做过一组实验,从3架加到5架时均时延下降了18%,从5架加到7架时只下降7%。这是因为无人机数量增加后,相互干扰增强,且覆盖新增用户受地面用户空间分布限制,边际收益递减非常明显。项目汇报里面把这条曲线画出来,能够有效论证“部署多少架无人机最经济”,为实际决策提供参考依据。
7. 项目扩展方向与二次开发建议
7.1 动态场景与轨迹优化
当前代码的前提是用户位置静态、无人机悬停服务。如果要做动态扩展,可以在系统模型中加入到达率 (\lambda(t)) 和用户移动模型,将无人机的飞行轨迹参数化(如折线路径或圆形路径),优化问题变为“时变部署+调度”,算法上可以用模型预测控制(MPC)来解决。这是目前该方向的高档扩展之一,代码框架和当前项目的初始化模块高度兼容,改造成本不大。
7.2 多无人机协同缓存与计算融合
如果把“算力卸载”扩展到“算力+内容缓存”,可以利用无人机存储能力提前缓存热门内容,在用户请求时直接从无人机返回数据,省去回传和重复计算。在代码里对应增加缓存数组和一个缓存命中率参数。优化目标需要引入缓存命中率惩罚项,整体思路不变,但实验结果会更贴近实际内容分发场景。
7.3 与强化学习的结合点
大规模场景下,启发式算法的求解时间随规模增长太快,可以考虑用深度强化学习(DRL)替代部分子问题的求解模块。具体做法是:把无人机位置和用户任务分布作为状态,卸载决策作为动作,系统代价的相反数作为奖励,用一个双网络DQN来训练策略。不需要从零开始,直接把Python代码里的遗传算法部分替换成DRN即可,训练好之后,在线决策速度会快一到两个数量级。
7.4 地面基站算力与无人机算力的协同分配
现有代码里地面基站和无人机的算力模块本身是分开的,但优化目标函数没有显式建模它们之间的协同。要做扩展,可以在目标函数中加入一个算力迁移项:把无人机无法及时处理的任务排队转发给空闲的地面基站。这个功能最直接的方式是在卸载决策里新增一档“二次卸载”,见下面设计示意:
- 用户任务首先卸载给无人机。
- 如果无人机算力排队溢出,按优先队列转发给覆盖该区域的基站。
- 转发带来的额外时延和回传能耗被计入总代价。
改动量不大,但对系统整体资源利用率的提升效果显著,值得一试。
8. 实操总结与经验心得
断断续续跑了一整轮静动态实验后,说几点个人体会。
第一,这类系统建模中,信道模型远比优化算法本身影响大。你如果把空地信道换成普通地面信道,后面再精致的优化设计效果都会被放大或抹平,因为物理层假设决定了上限。建模阶段一定要花心思核验信道参数,而不是直接照抄。
第二,启发式算法的调参比想象中更花时间。遗传算法的种群规模、交叉率、变异率,模拟退火的温度衰减系数,不同场景下最优参数差异明显。项目代码里给了默认参数,但做大规模实验时请务必自己多跑几组参数组合,不要迷信默认值。
第三,两个语言版本结合使用效率更高。我实际体验下来,MATLAB版本适合小规模场景验证模型正确性和算法收敛性,方便调试和可视化;Python版本适合大规模场景的压力测试和启发式算法的精细调优。先用MATLAB确认模型逻辑没问题,再切到Python跑大规模实验,是最顺滑的工作流。
第四,任何时候都要保留中间结果的日志。因为多无人机联合优化一次完整实验的耗时可能达到几十分钟,如果跑完发现参数设置错了需要重跑,没有日志会非常痛苦。代码里的evaluate_cost模块建议每次迭代后把目标函数值、各用户卸载方式、无人机位置写入一个CSV文件,后续分析曲线图和写论文配图都方便。
如果你打算基于这套代码做自己的实验,优先从5.2节的约束校验模块看起,确认它不会漏掉算力容量约束,再开始改信道参数和权重系数。等基础链路跑通后,慢慢往里面加入轨迹优化、缓存协同或者强化学习模块,这个方向的可拓展性非常强。
最后送一个实测小技巧:如果想在论文里展示SOTA对比,把收敛曲线图、部署分布图、卸载比例柱状图这三张图放在同一页,从三个视角说明同一个算法的效果,审稿观感会提升很明显。这套代码默认已经输出了这三类图,微调一下样式就能直接用。