sql提示索引超出了数组界限 索引超出了数组范围_sql提示索引超出了数组界限


代码如下:

citys = [18.4700 95.1000
 16.4700 94.6400
 20.0900 94.5400
 14.3900 93.3700
 25.2300 97.2400
 22.0000 93.0500
 23.4700 92.0200
 16.2000 96.2900
 17.3000 97.3800
 13.0500 98.1200
 15.5300 97.3800
 24.5200 95.5900
 16.4100 97.1300
 15.0900 92.5500
 18.0000 98.0000];
 
%% 3、计算距离矩阵
D = Distance(citys); % 计算距离矩阵
n = size(D, 1); % 获取所有城市的个数
 
m = 50; % 蚂蚁对数,每对蚂蚁分为蚂蚁1与蚂蚁2、3、4、5
alpha = 1; % 信息素重要程度因子
beta = 5; % 启发函数重要程度因子
rho = 0.1; % 信息素挥发因子
Q = 1; % 常系数(信息素释放量)
Eta = 1./D; % 启发函数
Tau = ones(n,n); % 信息素矩阵
Table1 = zeros(m,n); % 蚂蚁1路径记录表
Table2 = zeros(m,n); % 蚂蚁2路径记录表
Table3 = zeros(m, n); % 路径记录表
Table4 = zeros(m, n); % 路径记录表
Table5= zeros(m, n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 200; % 最大迭代次数
Route_best1 = zeros(iter_max,n); % 蚂蚁1各代最佳路径
Route_best2 = zeros(iter_max,n); % 蚂蚁2各代最佳路径
Route_best3 = zeros(iter_max,n); % 蚂蚁3各代最佳路径
Route_best4 = zeros(iter_max,n); % 蚂蚁4各代最佳路径
Route_best5 = zeros(iter_max,n); % 蚂蚁5各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
while iter <= iter_max 
 start = ones(m,1)+1; %初始出发城市为2
 Table1(:,1) = start;
 Table2(:,1) = start;
 Table3(:,1) = start;
 Table4(:,1) = start;
 Table5(:,1) = start;
 citys_index = 1:n;
 
 % 逐个蚂蚁路径选择
 for i = 1:m
 % 逐个城市路径选择
 for j = 2:n
 tabu1 = Table1(i,1:(j - 1)); %蚂蚁1已访问的城市集合
 tabu1(tabu1==0) = []; %把表中的0元素舍去,因为无意义
 tabu2 = Table2(i,1:(j - 1)); %蚂蚁2已访问的城市集合
 tabu2(tabu2==0) = []; %把表中的0元素舍去,因为无意义
 tabu3 = Table3(i,1:(j - 1)); %蚂蚁3已访问的城市集合
 tabu3(tabu3==0) = []; %把表中的0元素舍去,因为无意义
 tabu4 = Table4(i,1:(j - 1)); %蚂蚁4已访问的城市集合
 tabu4(tabu4==0) = []; %把表中的0元素舍去,因为无意义
 tabu5 = Table5(i,1:(j - 1)); %蚂蚁5已访问的城市集合
 tabu5(tabu5==0) = []; %把表中的0元素舍去,因为无意义
 
 tabu = [tabu1 tabu2 tabu3 tabu4 tabu5]; 
 allow_index = ~ismember(citys_index,tabu);
 allow = citys_index(allow_index); %待访问的城市集合
 P1 = allow;
 P2 = allow;
 P3 = allow;
 P4 = allow;
 P5 = allow;
 % 计算城市间转移概率
 for k = 1:length(allow)
 P1(k) = Tau(tabu1(end),allow(k))^alpha * Eta(tabu1(end),allow(k))^beta;
 P2(k) = Tau(tabu2(end),allow(k))^alpha * Eta(tabu2(end),allow(k))^beta;
 P3(k) = Tau(tabu3(end),allow(k))^alpha * Eta(tabu3(end),allow(k))^beta;
 P4(k) = Tau(tabu4(end),allow(k))^alpha * Eta(tabu4(end),allow(k))^beta;
 P5(k) = Tau(tabu4(end),allow(k))^alpha * Eta(tabu5(end),allow(k))^beta;
 end
 P1 = P1/sum(P1);
 P2 = P2/sum(P2);
 P3 = P3/sum(P3);
 P4 = P4/sum(P4);
 P5 = P5/sum(P5);
 % 轮盘赌法选择下一个访问城市
 Pc1 = cumsum(P1);
 Pc2 = cumsum(P2);
 Pc3 = cumsum(P3);
 Pc4 = cumsum(P4);
 Pc5=cumsum(P5);
 target_index1 = find(Pc1 >= rand);
 target_index2 = find(Pc2 >= rand);
 target_index3 = find(Pc3 >= rand);
 target_index4 = find(Pc4 >= rand);
 target_index5 = find(Pc5 >= rand);
 
 target1 = allow(target_index1(1));
 target2 = allow(target_index2(1));
 target3 = allow(target_index3(1));
 target4 = allow(target_index4(1));
 target5 = allow(target_index5(1));
 
 % 计算蚂蚁1与蚂蚁2到下一个城市的路径长度,选择路径长度较少的蚂蚁进行行走
 % 假设蚂蚁1行走,则蚂蚁1的路径表将添加下一个城市的标号,而蚂蚁2的路径表将添加0
 lengthant1 = D(tabu1(end), target1);
 lengthant2 = D(tabu2(end), target2);
 lengthant3 = D(tabu3(end), target3);
 lengthant4 = D(tabu4(end), target4);
 lengthant5 = D(tabu5(end), target5);
 
 if( lengthant1 <= lengthant2&& lengthant1<=lengthant3 && lengthant1<= lengthant4 && lengthant1 <= lengthant5 )
 Table1(i,j) = target1;
 end
 if(lengthant2 <= lengthant1 && lengthant2 <=lengthant3 &&lengthant2 <=lengthant4 && lengthant2 <= lengthant5 )
 Table2(i,j) = target2;
 end
 
 if(lengthant3 <= lengthant1 && lengthant3 <= lengthant2 && lengthant3 <= lengthant4 && lengthant3 <= lengthant5)
 Table3(i,j)=target3;
 end
 if (lengthant4 <= lengthant1 && lengthant4 <= lengthant2 && lengthant4 <= lengthant3 && lengthant4 <=lengthant5)
 Table4(i,j)=target4;
 end
 
 if (lengthant5<= lengthant1 && lengthant5 <= lengthant2 && lengthant5 <= lengthant3 && lengthant5 <= lengthant4 )
 Table5(i, j) = target5; 
 end
 end
 end
 
 
 
 % 计算各个蚂蚁对的路径距离
 Length1 = zeros(m,1); % 蚂蚁1路径距离之和
 Length2 = zeros(m,1); % 蚂蚁2路径距离之和
 Length3 = zeros(m,1); % 蚂蚁3路径距离之和
 Length4 = zeros(m,1); % 蚂蚁4路径距离之和
 Length5 = zeros(m,1); % 蚂蚁5路径距离之和
 for i = 1:m
 Route1 = Table1(i,:);
 Route1(Route1 == 0) = []; %舍去表中0元素
 Route2 = Table2(i,:);
 Route2(Route2 == 0) = []; %舍去表中0元素
 Route3 = Table3(i,:);
 Route3(Route3 == 0) = []; %舍去表中0元素
 Route4 = Table4(i,:);
 Route4(Route4 == 0) = []; %舍去表中0元素
 Route5 = Table5(i,:);
 Route5(Route5 == 0) = []; %舍去表中0元素
 for j = 1:length(Route1)-1
 Length1(i) = Length1(i) + D(Route1(j),Route1(j + 1));
 end
 for j = 1:length(Route2)-1
 Length2(i) = Length2(i) + D(Route2(j),Route2(j + 1));
 end
 for j = 1:length(Route3)-1
 Length3(i) = Length3(i) + D(Route3(j),Route3(j + 1));
 end
 for j = 1:length(Route4)-1
 Length4(i) = Length4(i) + D(Route4(j),Route4(j + 1));
 end
 for j = 1:length(Route5)-1
 Length5(i) = Length5(i) + D(Route5(j),Route5(j + 1));
 end
 end
 length = Length1 + Length2+Length3+Length4+Length5;
 % 计算最短路径距离及平均距离
 if iter == 1
 [min_Length,min_index] = min(Length);
 Length_best(iter) = min_Length;
 Length_ave(iter) = mean(Length); 
 Route_best1(iter,:) = Table1(min_index,:); 
 Route_best2(iter,:) = Table2(min_index,:);
 Route_best3(iter,:) = Table3(min_index,:); 
 Route_best4(iter,:) = Table4(min_index,:);
 Route_best5(iter,:) = Table5(min_index,:);
 else
 [min_Length,min_index] = min(Length);
 Length_best(iter) = min(Length_best(iter - 1),min_Length);
 Length_ave(iter) = mean(Length);
 if Length_best(iter) == min_Length 
 Route_best1(iter,:) = Table1(min_index,:); 
 Route_best2(iter,:) = Table2(min_index,:);
 Route_best3(iter,:) = Table3(min_index,:); 
 Route_best4(iter,:) = Table4(min_index,:);
 Route_best5(iter,:) = Table5(min_index,:);
 else
 Route_best1(iter,:) = Route_best1((iter-1),:);
 Route_best2(iter,:) = Route_best2((iter-1),:);
 Route_best3(iter,:) = Route_best3((iter-1),:);
 Route_best4(iter,:) = Route_best4((iter-1),:);
 Route_best5(iter,:) = Route_best5((iter-1),:);
 end
 end
 % 更新信息素
 Delta_Tau = zeros(n,n);
 % 逐个蚂蚁计算
 for i = 1:m
 Route1 = Table1(i,:);Route1(Route1 == 0) = []; %舍去表中0元素
 Route2 = Table2(i,:); Route2(Route2 == 0) = []; %舍去表中0元素
 Route3 = Table3(i,:);Route3(Route3 == 0) = [];
 Route4 = Table4(i,:);Route4(Route4 == 0) = [];
 Route5 = Table5(i,:);Route5(Route5 == 0) = [];
 % 逐个城市计算
 for j = 1:length(Route1)-1
 Delta_Tau(Route1(j),Route1(j+1)) = Delta_Tau(Route1(j),Route1(j+1)) + Q/Length1(i);%Delta_tau(Route1( j), Route1( j + 1)) = Delta_tau(Route1(j), Route1(j + 1)) + Q / length1(i);%蚁周模型
 end
 for j = 1:length(Route2)-1
 Delta_Tau(Route2(j),Route2(j+1)) = Delta_Tau(Route2(j),Route2(j+1)) + Q/Length2(i);
 end
 for j = 1:length(Route3)-1
 Delta_Tau(Route3(j),Route3(j+1)) = Delta_Tau(Route3(j),Route3(j+1)) + Q/Length3(i);
 end
 for j = 1:length(Route4)-1
 Delta_Tau(Route4(j),Route4(j+1)) = Delta_Tau(Route4(j),Route4(j+1)) + Q/Length4(i);
 
 end
 for j = 1:length(Route5)-1
 Delta_Tau(Route5(j),Route5(j+1)) = Delta_Tau(Route5(j),Route5(j+1)) + Q/Length5(i);
 end
 Delta_Tau(Route1(end),Route1(1)) = Delta_Tau(Route1(end),Route1(1)) + Q/Length1(i);
 Delta_Tau(Route2(end),Route1(1)) = Delta_Tau(Route2(end),Route1(1)) + Q/Length2(i);
 Delta_Tau(Route3(end),Route1(1)) = Delta_Tau(Route3(end),Route1(1)) + Q/Length3(i);
 Delta_Tau(Route4(end),Route1(1)) = Delta_Tau(Route4(end),Route1(1)) + Q/Length4(i);
 Delta_Tau(Route5(end),Route1(1)) = Delta_Tau(Route5(end),Route1(1)) + Q/Length5(i);
 end
 Tau = (1-rho) * Tau + Delta_Tau;
 % 迭代次数加1,清空路径记录表
 iter = iter + 1;
 Table1 = zeros(m,n);
 Table2 = zeros(m,n);
 Table3 = zeros(m,n);
 Table4 = zeros(m,n);
 Table5 = zeros(m,n);
end
[Shortest_Length,index] = min(Length_best);
Shortest_Route1 = Route_best1(index,:);Shortest_Route1(Shortest_Route1 == 0) = [];
Shortest_Route2 = Route_best2(index,:);Shortest_Route2(Shortest_Route2 == 0) = [];
Shortest_Route3 = Route_best3(index,:);Shortest_Route3(Shortest_Route3 == 0) = [];
Shortest_Route4 = Route_best4(index,:);Shortest_Route4(Shortest_Route4 == 0) = [];
Shortest_Route5 = Route_best5(index,:);Shortest_Route5(Shortest_Route5 == 0) = [];
disp(['最短距离: ' num2str(Shortest_Length)]);
disp(['最短路径1: ' num2str([Shortest_Route1 Shortest_Route1(1)])]);
disp(['最短路径2: ' num2str([Shortest_Route2 Shortest_Route2(1)])]);
disp(['最短路径3:' num2str([shortest Route3])]);
disp(['最短路径4:' num2str([shortest Route4])]);
disp(['最短路径5:' num2str([shortest Route5])]);
%% 7、绘图
figure(2)
plot(1:iter_max,Length_best,'b',1:iter_max,Length_ave,'r:')
legend('最短距离','平均距离')
xlabel('迭代次数')
ylabel('距离')
title('各代最短距离与平均距离对比')
function D = Distance(citys)
%% 计算两两城市之间的距离
% 输入:各城市的位置坐标(citys)
% 输出:两两城市之间的距离(D)
 
n = size(citys, 1);
D = zeros(n, n);
for i = 1: n %i从1到n
 for j = i + 1: n
 D(i, j) = sqrt((citys(i, 1) - citys(j, 1))^2 + (citys(i, 2) - citys(j, 2))^2); %计算距离,勾股定理
 D(j, i) = D(i, j);
 end
 D(i, i) = 1e-4; %对角线的值为0,但由于后面的启发因子要取倒数,因此用一个很小数代替0
end