
基于NSGA2的受灾点缺货量最小化与需求点最晚送达时间最小化的多目标车辆路径
规划
染色体编码这块儿得掰开了说。三辆车的路径矩阵用100x100的零一矩阵存着,光这部分就占了三
万变量。每次初始化种群的时候都得用randperm随机打乱路线,不过得注意每个路径片段必须连起来能走
通。代码里有个骚操作——用cumsum函数生成不重复的节点序列:
```matlab
% 生成单辆车可行路径
route = zeros(1,100);
current_node = 1;
for i=2:100
available_nodes = setdiff(find(adj_matrix(current_node,:)), route);
if isempty(available_nodes)
break; % 遇到死胡同直接跳出
end
next_node = available_nodes(randi(length(available_nodes)));
route(i) = next_node;
current_node = next_node;
end
route(route==0) = []; % 去掉未填充的零
```
约束处理才是真刺激。受灾点接收量不能超过车辆载货量,时间窗还不能超限。原本想把约束违例
值直接加到目标函数,结果发现这两个目标根本不在同一个量纲上——缺货量可能上万,而送达时间才几百
。后来搞了个动态归一化,用当前种群的最大违例值当分母:
```python
# Python版约束归一化片段
max_time_violation = max([ind.time_violation for ind in population])
max_supply_violation = max([ind.supply_violation for ind in population])
for ind in population:
normalized_violation = (ind.time_violation/(max_time_violation+1e-6) +
ind.supply_violation/(max_supply_violation+1e-6))