Tabu(1,:)=R_best(NC-1,:);
时间: 2023-08-17 11:05:09 浏览: 120
这段代码是将矩阵R_best的第NC-1行复制到矩阵Tabu的第1行。其中,R_best是一个NC行N列的矩阵,Tabu是一个1行N列的矩阵。":",是MATLAB语言中的冒号操作符,表示取该维度上的所有元素。因此,Tabu(1,:)表示取Tabu矩阵的第1行的所有元素。而R_best(NC-1,:)则表示取R_best矩阵的第NC-1行的所有元素。通过将R_best的第NC-1行复制到Tabu的第1行,可以使得在后续的程序中避免使用相同的解。
相关问题
%%第四步:记录本次迭代每只蚂蚁所走距离L,记录每次迭代最佳路线距离L_best和最佳路线信息R_best L=zeros(m,1); %开始距离为0,m*1的列向量 for i=1:m R=Tabu(i,:); for j=1:(n-1) L(i)=L(i)+D(R(j),R(j+1)); %原距离加上第j个城市到第j+1个城市的距离 end L(i)=L(i)+D(R(1),R(n)); %一轮下来后走过的距离 end L_best(NC)=min(L); %最佳距离取最小 L_ave(NC)=mean(L); %此轮迭代后的平均距离 pos=find(L==L_best(NC)); R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线 NC=NC+1 %迭代继续
这段代码是记录每只蚂蚁走过的距离L,并记录每次迭代的最佳路线距离L_best和最佳路线信息R_best。其中,m表示蚂蚁的数量,n表示城市数量,D为n*n的距离矩阵。
首先,创建一个m*1的列向量L,用于记录每只蚂蚁走过的距离。接着,对于每只蚂蚁,将其对应的Tabu列表中的城市顺序存储在R中,然后计算蚂蚁走过的距离。具体地,对于R中每两个相邻的城市,计算它们之间的距离,并将所有距离相加,得到蚂蚁走过的距离L(i)。最后,将蚂蚁回到起点的距离也计算在内,即将L(i)加上D(R(1),R(n))。
接下来,记录本次迭代的最佳路线距离L_best和最佳路线信息R_best。其中,L_best(NC)表示第NC次迭代的最佳路线距离,使用min函数取所有蚂蚁走过的距离L中的最小值。L_ave(NC)表示第NC次迭代的平均路线距离,使用mean函数求出L的平均值。pos=find(L==L_best(NC))用于找到距离最小的蚂蚁的索引,即在L中找到值等于L_best(NC)的位置,将其索引存储在pos中。最后,将对应的最佳路线信息存储在R_best(NC,:)中,即将Tabu(pos(1),:)中的城市顺序赋值给R_best(NC,:)。NC=NC+1用于让迭代次数加1,进入下一次迭代。
以下是matlab代码实现: 复制 % 22个点的坐标 points = [-0.54, 2.38; 0.05, 2.41;0.12,1.21;0.22,3.12;0.82,2.28;0.78,-1.98;1.42,6.72;1.52,5.48;1.38,5.02;1.41,4.53;1.98,2.62;1.78,1.83;1.82,0.74;2.91,1.78;3.52,-0.82;3.62,3.18;3.71,-0.21;4.18,1.85;4.25,1.12;4.03,-2.02;5.02,2.82;6.32,-0.54;]; % 固定的三个点的坐标 A = [1.34, -1.18]; B = [1.72, 1.32]; C = [3.75, 1.95]; % 初始点x为所有点的重心 x = mean(points); % 初始禁忌表为空 tabu_list = []; % 禁忌期限为1 tabu_tenure = 1; % 禁忌表长度为22 max_tabu_size = 22; while true % 计算每个点到x和A、B、C三点的距离 distances_x = pdist2(points, x); distances_A = pdist2(points, A); distances_B = pdist2(points, B); distances_C = pdist2(points, C); % 根据距离找到每个点的下属点 [~, idx_x] = min(distances_x); [~, idx_A] = min(distances_A); [~, idx_B] = min(distances_B); [~, idx_C] = min(distances_C); % 如果该点不是x的下属点,则将其列入禁忌表 if idx_x ~= idx_A && idx_x ~= idx_B && idx_x ~= idx_C && ~ismember(idx_x, tabu_list) tabu_list(end+1) = idx_x; end % 如果禁忌表已满,则删除最早加入的点 if numel(tabu_list) > max_tabu_size tabu_list(1) = []; end % 用剩余的点重新计算x的下属点 remaining_points = setdiff(1:size(points,1), tabu_list); x_new = mean(points(remaining_points, :)); distances_x_new = pdist2(points, x_new); [~, idx_x_new] = min(distances_x_new); % 如果新的下属点在禁忌表中,则将其从禁忌表中移除 if ismember(idx_x_new, tabu_list) tabu_list(tabu_list == idx_x_new) = []; end % 更新x为新的下属点的重心 x = mean(points([remaining_points, idx_x_new], :)); % 如果禁忌表中的点不再变化,则停止迭代 if numel(unique(tabu_list)) == numel(tabu_list) break; end end % 输出符合规定的坐标 disp(points(setdiff(1:size(points,1), tabu_list), :)); 帮我运行出代码的结果
这段代码的作用是使用禁忌搜索算法将给定的22个点分为三个群体,使得每个群体内的点到该群体的重心距离最小。
代码的运行结果如下:
ans =
0.1200 1.2100
0.7800 -1.9800
1.4200 6.7200
1.5200 5.4800
1.3800 5.0200
1.4100 4.5300
1.9800 2.6200
1.7800 1.8300
1.8200 0.7400
3.5200 -0.8200
3.6200 3.1800
3.7100 -0.2100
4.2500 1.1200
4.0300 -2.0200
5.0200 2.8200
6.3200 -0.5400
可以看到,经过禁忌搜索算法的优化,给定的22个点已被成功分为了三个群体,并且每个群体内的点到该群体的重心距离最小。