基于MATLAB利用模拟退火算法解决费马点问题

数据来源:安徽各市的坐标。安徽内一点到所有各市的距离最短。
代码实现了各点的连线组成不交叉的普通多边形。实现图形的显示,将各市连接。
代码如下

%费马点问题求解
%给n个点,找出一个点,使这个点到n点的距离之和最小,也就是求费马点。
function SA=SA_fun(T,delta,x0,y0,eps)
% FPI=fopen('axis.txt','rt');
% NELEM=fscanf(FPI,'%d',1);
% s(1,:)=fscanf(FPI,'%f',[1,NELEM]);
% s(2,:)=fscanf(FPI,'%f',[1,NELEM]);
[a1,a2,a3,s(1,:),a5,s(2,:)]=textread('axis1.txt','%s%s%s%f%s%f');
%fid=fopen('data1.txt');%以只读模式打开该文本问价你,为fscanf和textscan函数的读取操作做准备
%dat3=fscanf(fid,'%g',[4,inf])%采用fscanf函数读取该文件,逐列读,逐行显示,行列互换
i=1;
while (T>eps)
    for j=1:100
        X=max(s(1,:));
        Y=max(s(2,:));
        x=min(s(1,:));
        y=min(s(2,:));
        x3=abs(X-x)*rand(1)+x;%保证x1在x0附近[-0.5,0.5]之间。
        y3=abs(Y-x)*rand(1)+y;
        dE=fun_SA(s,x3,y3)-fun_SA(s,x0,y0);
        if (dE<=0)
            x0=x3;%移动后得到优解
            y0=y3;
        else
            if(exp(dE/T)<rand(1))%以一定概率移动。
                x0=x3;
                y0=y3;
            end
        end
       i=i+1;
    end
       T=T*delta;
end
SA=fun_SA(s,x0,y0);
%**********************************************
%**********************************************
p=s';%产生n个二维坐标
cen=mean(p);%Average or mean value求平均值。
ang=atan2(p(:,1)-cen(1),p(:,2)-cen(2)); %每个点到坐标中心极角
%atan函数四象限反正切。
p=[p,ang];%妙,不断拓展P空间。
p=sortrows(p,3);%按极角排序
hold on; %连接各点            
plot(p(:,1),p(:,2),'color','black');
p=circshift(p,1);
plot(p(:,1),p(:,2),'color','black');
m=length(s);
for i=1:m
    line([x0,s(1,i)],[y0,s(2,i)],'color','red');
    hold on;
end

距离计算函数

function f=fun_SA(s,x,y)
f1=0;
m=length(s);
for i=1:m
        f1=f1+sqrt((x-s(1,i))^2+(y-s(2,i))^2);
end
f=f1;

axis1.txt文件过大,上传不方便,请看链接这里写链接内容

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值