求救怎么改啊?附代码

在这里插入图片描述%% 数据准备
% 清空环境
clear all
clc
% 开始计时
t0 = clock;
%导入数据
points=xlsread(‘附件1:数据集1-终稿’, ‘B3:D615’);
Horizontal0_Vertical1_type=xlsread(‘附件1:数据集1-终稿’, ‘E3:E615’);
%--------------------------------------------------------------------------
%% 计算校正点相互距离
n = size(points,1);
D = zeros(n,n);
for i = 1:n
for j = 1:n
if i ~= j
D(i,j) = sqrt(sum((points(i,:) - points(j,:)).^2));
else
D(i,j) = 1e-4;
end
end
end
%--------------------------------------------------------------------------
%% 初始化参数
ant_num = 200; % 种群数
iter = 1; % 迭代初值
iter_max = 100; % 迭代次数
alpha1 = 25;
alpha2 = 15;
beta1 = 20;
beta2 = 25;
seita = 30;
delta = 0.001;
alpha = 1; % 信息素重要程度因子
beta = 5; % 启发函数重要程度因子
q = 0.3; %信息素减少因子
vol = 0.2; % 信息素挥发因子
P1 = zeros(1,n);
P2 = zeros(1,n);
Q = 10; % 常系数
Heu_F = 1./D; % 启发函数
Tau = ones(n,n); % 信息素矩阵
Table = zeros(ant_num,n); % 路径记录表
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径长度
Limit_iter = 0; % 程序收敛迭代次数
%-------------------------------------------------------------------------
%% 迭代寻找最佳路径
while iter <= iter_max
start_point = 1;
end_point = 613;
ant_i = 1;
point_index = 1:n;
% 逐个蚂蚁路径选择
for ant_i = 1:ant_num
count = 1;
Table(ant_i,1) = start_point;
c = 1;
v_err_last = 0;
h_err_last = 0;
while Table(ant_i,count) ~= end_point
has_visited = Table(ant_i,1:count); % 已访问路径集合(禁忌表)
allow_index = ~ismember(point_index,has_visited);
allow = point_index(allow_index); % 允许表
c = 1;
P1 = zeros(1,n);
% 计算可行点转移概率
for k = 1:length(allow)
%判断到达下一个点误差是否过大
Li = D(has_visited(end),allow(k));
v_err_cur = v_err_last + Lidelta;
h_err_cur = h_err_last + Li
delta;
if (allow(k) == end_point && v_err_cur < seita && h_err_cur < seita)
S(has_visited(end),allow(k)) = 1;
P1© = allow(k);
c = c+1;
elseif (Horizontal0_Vertical1_type(allow(k)) == 1 && (v_err_cur < alpha1 &&h_err_cur < alpha2))
S(has_visited(end),allow(k)) = 1;
P1© = allow(k);
c = c+1;
elseif (Horizontal0_Vertical1_type(allow(k)) == 0 && (v_err_cur < beta1 && h_err_cur< beta2))
S(has_visited(end),allow(k)) = 1;
P1© = allow(k);
c = c+1;
else
S(has_visited(end),allow(k))=0;
end
%确定下一个可行点的启发式信息值
if S(has_visited(end),allow(k))==1
Heu_F(has_visited(end),allow(k))=S(has_visited(end),allow(k))/(D(has_visited(end),allow(k))+D(end_point,allow(k)));
%确定可行点的状态转移概率
P2(c-1) = Tau(has_visited(end),allow(k))^alpha Heu_F(has_visited(end),allow(k))^beta;
end
end
if P1(1) ~= 0
PP = P2(1:c-1);
PP = PP/sum(PP);
% 轮盘赌选点
Pc = cumsum(PP);
target_index = find(Pc >= rand);
target = P1(target_index(1));
Table(ant_i,count+1) = target;
Li = D(has_visited(end),Table(ant_i,count+1)); %计算当前点与目标点的距离
v_err_cur = v_err_last + Li
delta;
h_err_cur = h_err_last + Lidelta;
%局部更新信息素
Delta_Tau(Table(i,j),Table(i,j+1)) = q
Delta_Tau(Table(i,j),Table(i,j+1));
%根据校正点类型进行校正
if Horizontal0_Vertical1_type(target,1) == 1
v_err_cur = 0;
end
if Horizontal0_Vertical1_type(target,1) == 0
h_err_cur = 0;
end
v_err_last = v_err_cur;
h_err_last = h_err_cur;
count = count+1;
else
c = 1;
count = 1;
Table(ant_i,:) = 0;
Table(ant_i,1) = 1;
v_err_last = 0;
h_err_last = 0;
end
end
ant_num = ant_i + 1;
end
% 计算各个蚂蚁的路径距离
Length = zeros(ant_num,1);
for i = 1:ant_num
Route = Table(i,:);
for j = 1:(n - 1)
if Route(j + 1) ~= 0
Length(i) = Length(i) + D(Route(j),Route(j + 1));
end
end
end
% 计算最短路径距离
if iter == 1
[min_Length,min_index] = min(Length);
Length_best(iter) = min_Length;
Route_best(iter,:) = Table(min_index,1:n);
Limit_iter = 1;
else
[min_Length,min_index] = min(Length);
Length_best(iter) = min(Length_best(iter - 1),min_Length);
if Length_best(iter) == min_Length
Route_best(iter,:) = Table(min_index,1:n);
Limit_iter = iter;
else
Route_best(iter,:) = Route_best((iter-1)😅;
end
end
% 更新信息素
Delta_Tau = zeros(n,n);
% 逐个蚂蚁计算
for i = 1:ant_num
% 逐个路径计算
for j = 1:(n - 1)
if Table(i,j+1) ~= 0
Delta_Tau(Table(i,j),Table(i,j+1)) = Delta_Tau(Table(i,j),Table(i,j+1)) + Q/Length(i);
end
end
end
Tau = (1-vol) * Tau + Delta_Tau;
% 迭代次数加1, 清空路径表
iter = iter + 1;
Table = zeros(ant_num,n);
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值