% 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]; 帮我用matlab写一个从22个坐标中运用禁忌搜索算法选取符合规定的坐标点进行重心法计算。其步骤如下: 1、要求22个点用重心法确定的选址地点为禁忌搜索算法的初始点x。 2、并且已经有三个固定的点A、B、C 3、判断22个点分别到点x的距离是不是比这个点到A、B、C三点都近。 4、如果22个中的点到x最近,那么将站点留下用于下次重心法选址,否则加入禁忌表。并在下次循环中也用于判断是否符合步骤3,如果符合则释放,否则继续留在禁忌表。 5、保留下的站点用重心法确定新的站点x2 6、禁忌搜索的目标函数是寻找一个点,使得22个点到A.B.C和这个新确定得点的最短距离的和最小。
时间: 2023-06-26 14:05:06 浏览: 279
以下是使用禁忌搜索算法选取符合规定的坐标点进行重心法计算的 Matlab 代码:
```
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);
% 禁忌搜索参数设置
tabuListSize = 10;
maxIter = 100;
iter = 1;
tabuList = [];
while iter <= maxIter
% 根据禁忌表选择下一个点进行计算
distList = [];
for i = 1:size(points, 1)
% 如果点已经在禁忌表中,则跳过
if any(ismember(tabuList, i))
continue;
end
% 判断是否符合要求
distAB = norm(x - A);
distBC = norm(x - B);
distCA = norm(x - C);
distX = norm(x - points(i,:));
if distX < distAB && distX < distBC && distX < distCA
distList = [distList, distX];
else
tabuList = [tabuList, i];
if length(tabuList) > tabuListSize
tabuList(1) = [];
end
end
end
% 找到距离和最小的点作为新的x
if ~isempty(distList)
[~, idx] = min(sum([distAB, distBC, distCA, distList], 2));
x = (x + points(idx,:)) / 2;
end
iter = iter + 1;
end
% 输出结果
disp(['最终选址点:[', num2str(x), ']']);
```
代码中的禁忌搜索算法有一个禁忌表,用于存储已经被排除的点。每次循环时,遍历所有未被禁忌的点,判断是否符合要求。如果符合,则将其加入距离列表,否则将其加入禁忌表。在找到距离和最小的点后,将其与当前点的重心作为新的点进行下一次循环。循环次数达到最大值后,输出最终选址点。
阅读全文