% 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的距离是不是比这个点到ABC三点都近。 4、如果22中的点到x最近,那么将站点留下用于下次重心法选址,否则加入禁忌表。并在下次循环中也用于判断。 5、保留下的站点用重心法确定新的站点x2 6、禁忌搜索的目标函数是各站点到A、B、C三个原有站点和禁忌搜索算法确定的站点距离最短值得和。
时间: 2023-06-25 11:06:38 浏览: 52
下面是使用禁忌搜索算法选取符合规定的坐标进行重心法计算的MATLAB代码:
```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为22个点的重心
x = [mean(points(:,1)), mean(points(:,2))];
% 禁忌表
tabuList = [];
% 目标函数的初始值
f = inf;
% 禁忌搜索的参数设置
maxIter = 100; % 最大迭代次数
tabuTenure = 5; % 禁忌长度
for iter = 1:maxIter
% 计算22个点到x的距离
dist = sqrt(sum((points - x).^2, 2));
% 判断是否符合规定
isFeasible = dist < sqrt(sum((points - A).^2, 2)) & ...
dist < sqrt(sum((points - B).^2, 2)) & ...
dist < sqrt(sum((points - C).^2, 2));
% 计算目标函数值
fNew = sum(min([dist, sqrt(sum((points - A).^2, 2)), sqrt(sum((points - B).^2, 2)), sqrt(sum((points - C).^2, 2))], [], 2));
% 更新禁忌表
if fNew < f
tabuList = [tabuList; find(~isFeasible)];
else
tabuList = [tabuList(2:end); find(~isFeasible)];
end
% 去除禁忌表中的重复元素
tabuList = unique(tabuList);
% 选择下一个点作为新的x
dist(isFeasible) = inf; % 将可行点的距离设为无穷大
[~, idx] = min(dist); % 选择距离最近的非禁忌点
xNew = points(idx,:);
% 更新目标函数值和x
f = fNew;
x = xNew;
% 更新禁忌表中各元素的禁忌长度
for i = 1:length(tabuList)
if tabuList(i) ~= idx
tabuTenureList(tabuList(i)) = tabuTenureList(tabuList(i)) - 1;
end
end
% 将新的禁忌元素加入禁忌表
tabuList = [tabuList, idx];
tabuTenureList(idx) = tabuTenure;
% 更新禁忌表中各元素的禁忌长度
tabuTenureList = tabuTenureList - 1;
tabuList(tabuTenureList <= 0) = [];
tabuTenureList(tabuTenureList <= 0) = [];
% 输出当前迭代次数和目标函数值
fprintf('Iteration %d: f = %f\n', iter, f);
end
% 输出最终结果
fprintf('The optimal location is (%f, %f).\n', x(1), x(2));
```
上述代码中,我们首先将初始点x设为22个点的重心,然后进行禁忌搜索。在每次迭代中,我们计算22个点到x的距离,并判断是否符合规定。如果符合规定,则认为这个点是可行的。然后,我们计算目标函数值,更新禁忌表,选择下一个点作为新的x,并更新禁忌表中各元素的禁忌长度。最终输出最优的选址地点。