使用蚁群算法解决公交车路径规划问题的MATLAB代码实现,包含详细注释和仿真流程。该算法以站点间行驶时间或距离为优化目标,寻找最优公交路线。
1. 问题建模与参数设置
1.1 输入数据
-
站点坐标:假设有20个公交站点,随机生成位置。
-
距离矩阵:计算所有站点间的欧氏距离。
% 生成站点坐标(示例)
rng(1); % 固定随机种子
n_stops = 20;
stops = rand(n_stops, 2) * 100; % 在100x100区域内随机生成坐标
% 计算距离矩阵
dist_matrix = zeros(n_stops, n_stops);
for i = 1:n_stops
for j = 1:n_stops
dist_matrix(i,j) = norm(stops(i,:) - stops(j,:));
end
end
dist_matrix(dist_matrix == 0) = 1e-4; % 避免除零错误
1.2 算法参数
n_ants = 30; % 蚂蚁数量
max_iter = 100; % 最大迭代次数
alpha = 1; % 信息素重要程度
beta = 2; % 启发式信息重要程度
rho = 0.1; % 信息素挥发率
Q = 1; % 信息素增量常数
tau0 = 1e-6; % 初始信息素浓度
2. 蚁群算法核心实现
2.1 初始化信息素矩阵
tau = tau0 * ones(n_stops, n_stops); % 初始信息素矩阵
best_route = []; % 全局最优路径
best_length = Inf; % 全局最短路径长度
2.2 迭代优化过程
for iter = 1:max_iter
% 每只蚂蚁独立搜索路径
ant_routes = cell(n_ants, 1);
ant_lengths = zeros(n_ants, 1);
for k = 1:n_ants
% 初始化蚂蚁路径
route = zeros(1, n_stops);
visited = false(1, n_stops);
current = randi(n_stops); % 随机选择起点
route(1) = current;
visited(current) = true;
% 逐步访问所有站点
for step = 2:n_stops
% 计算未访问站点的转移概率
unvisited = find(~visited);
prob = zeros(1, length(unvisited));
for i = 1:length(unvisited)
j = unvisited(i);
prob(i) = (tau(current, j)^alpha) * (1/dist_matrix(current, j))^beta;
end
prob = prob / sum(prob); % 归一化概率
% 轮盘赌选择下一站点
next = randsample(unvisited, 1, true, prob);
route(step) = next;
visited(next) = true;
current = next;
end
% 计算路径总长度(返回起点形成闭环)
total_length = sum(dist_matrix(sub2ind(size(dist_matrix), route(1:end-1), route(2:end)))...
+ dist_matrix(route(end), route(1));
ant_routes{k} = route;
ant_lengths(k) = total_length;
end
% 更新全局最优路径
[min_length, idx] = min(ant_lengths);
if min_length < best_length
best_length = min_length;
best_route = ant_routes{idx};
end
% 更新信息素(全局挥发 + 最优路径增强)
tau = (1 - rho) * tau; % 信息素挥发
delta_tau = zeros(n_stops, n_stops);
for k = 1:n_ants
route = ant_routes{k};
for step = 1:length(route)-1
i = route(step);
j = route(step+1);
delta_tau(i,j) = delta_tau(i,j) + Q / ant_lengths(k);
end
% 处理闭环路径
delta_tau(route(end), route(1)) = delta_tau(route(end), route(1)) + Q / ant_lengths(k);
end
tau = tau + delta_tau; % 信息素累积
end
3. 结果可视化与分析
3.1 绘制最优路径
% 闭环路径(回到起点)
optimal_route = [best_route, best_route(1)];
figure;
plot(stops(:,1), stops(:,2), 'o', 'MarkerSize', 8, 'MarkerFaceColor', 'b');
hold on;
plot(stops(optimal_route,1), stops(optimal_route,2), 'r-', 'LineWidth', 1.5);
title(sprintf('最优公交路线 (总距离: %.2f 单位)', best_length));
xlabel('X坐标'); ylabel('Y坐标');
grid on;
3.2 收敛曲线绘制
% 在迭代过程中记录每次迭代的最优值(需修改迭代循环)
% 在迭代循环内添加:
% history_best(iter) = best_length;
figure;
plot(1:max_iter, history_best, 'LineWidth', 1.5);
xlabel('迭代次数'); ylabel('最短路径长度');
title('算法收敛曲线');
grid on;
4. 完整代码整合
% 公交车路径规划 - 蚁群算法实现
clc; clear; close all;
%% 1. 生成站点坐标
n_stops = 20;
stops = rand(n_stops, 2) * 100;
%% 2. 计算距离矩阵
dist_matrix = zeros(n_stops);
for i = 1:n_stops
for j = 1:n_stops
dist_matrix(i,j) = norm(stops(i,:) - stops(j,:));
end
end
dist_matrix(dist_matrix == 0) = 1e-4;
%% 3. 算法参数设置
n_ants = 30; % 蚂蚁数量
max_iter = 100; % 最大迭代次数
alpha = 1; % 信息素权重
beta = 2; % 启发式权重
rho = 0.1; % 信息素挥发率
Q = 1; % 信息素增量常数
tau0 = 1e-6; % 初始信息素
%% 4. 初始化
tau = tau0 * ones(n_stops);
best_route = [];
best_length = Inf;
history_best = zeros(max_iter, 1); % 记录收敛过程
%% 5. 蚁群算法迭代
for iter = 1:max_iter
ant_routes = cell(n_ants, 1);
ant_lengths = zeros(n_ants, 1);
% 每只蚂蚁构建路径
for k = 1:n_ants
route = zeros(1, n_stops);
visited = false(1, n_stops);
current = randi(n_stops);
route(1) = current;
visited(current) = true;
for step = 2:n_stops
unvisited = find(~visited);
prob = zeros(1, length(unvisited));
for i = 1:length(unvisited)
j = unvisited(i);
prob(i) = tau(current, j)^alpha * (1/dist_matrix(current, j))^beta;
end
prob = prob / sum(prob);
next = randsample(unvisited, 1, true, prob);
route(step) = next;
visited(next) = true;
current = next;
end
% 计算闭环路径长度
total_length = sum(dist_matrix(sub2ind(size(dist_matrix), route(1:end-1), route(2:end)))...
+ dist_matrix(route(end), route(1));
ant_routes{k} = route;
ant_lengths(k) = total_length;
end
% 更新全局最优
[min_length, idx] = min(ant_lengths);
if min_length < best_length
best_length = min_length;
best_route = ant_routes{idx};
end
history_best(iter) = best_length;
% 更新信息素
tau = (1 - rho) * tau;
delta_tau = zeros(n_stops);
for k = 1:n_ants
route = ant_routes{k};
for step = 1:length(route)-1
i = route(step); j = route(step+1);
delta_tau(i,j) = delta_tau(i,j) + Q / ant_lengths(k);
end
delta_tau(route(end), route(1)) = delta_tau(route(end), route(1)) + Q / ant_lengths(k);
end
tau = tau + delta_tau;
end
%% 6. 结果可视化
% 绘制最优路径
figure;
plot(stops(:,1), stops(:,2), 'o', 'MarkerSize', 8, 'MarkerFaceColor', 'b');
hold on;
optimal_route = [best_route, best_route(1)];
plot(stops(optimal_route,1), stops(optimal_route,2), 'r-', 'LineWidth', 1.5);
title(sprintf('最优公交路线 (总距离: %.2f 单位)', best_length));
xlabel('X坐标'); ylabel('Y坐标');
grid on;
% 绘制收敛曲线
figure;
plot(1:max_iter, history_best, 'LineWidth', 1.5);
xlabel('迭代次数'); ylabel('最短路径长度');
title('算法收敛曲线');
grid on;
5. 算法改进方向
- 动态信息素初始化:根据贪心算法结果初始化信息素,加速收敛。
- 精英蚂蚁策略:为最优路径额外增加信息素。
- 自适应参数调整:根据迭代进度动态调整α、β、ρ。
- 多目标优化:同时考虑行驶时间、乘客等待时间、车辆容量约束。
- 实时交通数据集成:结合实时路况调整距离矩阵。
关键参数调优建议
参数 | 作用 | 典型范围 | 调整策略 |
---|---|---|---|
α | 控制信息素影响 | 0.5~1.5 | 增大α增强信息素引导 |
β | 控制启发式信息影响 | 2~5 | 增大β更倾向于短路径 |
ρ | 信息素挥发速度 | 0.05~0.2 | 增大ρ防止早熟,降低局部最优风险 |
n_ants | 并行搜索能力 | 20~50 | 站点数多时需增加蚂蚁数量 |
Q | 信息素增量强度 | 0.1~10 | 与路径长度量级匹配 |
通过调整参数和引入改进策略,可进一步提升算法在复杂公交网络中的规划性能。实际应用中需结合具体场景添加运营约束(如站点服务时间、发车间隔等)。