gusucode.com > 《matlab在数学建模中的应用》一书 所有的 源代码 > 第12章/P12-1/Sams.m

    %MYFSAPLP SOLVE THE PLP IN THE THIRD PROBLEM BY SA ALGORITHM.
%首先只考虑n为偶数的情况
%变量初始化
clc
clf
clear;
xmin = 0; xmax = 200; ymin = 0; ymax = 150;
r = 25; n =6;
fval_every=1; fval_best=fval_every; fval_pro=fval_every;
lamdao=1e30; fs_every=1;
t0=98; tf=3; a=0.98; t=t0; t_mid=50;
p=1;
dfo=0;
while(t>tf)
	if p==1
		%产生新解
		for i=1:n./2
            x(i.*2-1)=r+2*r*(i-1);
            x(i*2)=r+2*r*(i-1);
            y(2*i-1)=r;
            y(2*i)=3*r;
		end
        for i=1:(n-1)
            for j=(i+1):n
                fs_every=fs_every.*sqrt((x(i)-x(j)).^2+(y(i)-y(j)).^2);
            end
        end
        fs_every=fs_every.^(1./n);
        fval_every=fs_every;
        dfval=fval_pro-fval_every;
		if dfval<0
            if p~=1
                x(i)=x0;
                y(i)=y0;
                fval_pro=fval_every;
                fs_pro=fs_every;
                dfo_pro=dfo;
            else
                fval_pro=fval_every;
                fs_pro=fs_every;
                dfo_pro=dfo;
            end
		else
            rand_jud=rand;
            if rand_jud>exp(-dfval./t)
                x(i)=x0;
                y(i)=y0;
                fval_pro=fval_every;
                fs_pro=fs_every;
                dfo_pro=dfo;
            else
                fs_every=fs_pro;
                fval_every=fval_pro;
                dfo=dfo_pro;
            end
		end
        if fval_every>fval_best
            x_best=x;
            y_best=y;
            fval_best=fval_every;
            fs_best=fs_every;
            dfo_bestk=dfo;
        end
        p=p-1;
        
	else
%         keyboard
        for k=1:500.*n
            i=ceil(rand.*n);
            x0=(xmin+r)+rand*((xmax-r)-(xmin+r));
            y0=(ymin+r)+rand*((ymax-r)-(ymin+r));
            for j=1:n
                if j~=i
                    dis0=sqrt((x(j)-x(i)).^2+(y(j)-y(i)).^2);
                    dis1=sqrt((x(j)-x0).^2+(y(j)-y0).^2);
                    if dis0 < 2*r
                        dfo=dfo-1;  
                    else
                        dfo=dfo+1;
                    end
                    if dis1 < 2*r
                        dfo=dfo+1;
                    else
                        dfo=dfo-1;
                    end
                    fs_every=fs_every./dis0.^(1./n);
                    fs_every=fs_every.*dis1.^(1./n);
                end
            end
            dfo_tmp=dfo./2;
            fval_every=fs_every-dfo_tmp.*lamdao./t;      
            
			dfval=fval_pro-fval_every;
			if dfval<0
                if p~=1
                    x(i)=x0;
                    y(i)=y0;
                    fval_pro=fval_every;
                    fs_pro=fs_every;
                    dfo_pro=dfo;
                else
                    fval_pro=fval_every;
                    fs_pro=fs_every;
                    dfo_pro=dfo;
                end
			else
                rand_jud=rand;
                if rand_jud>exp(-dfval./t)
                    x(i)=x0;
                    y(i)=y0;
                    fval_pro=fval_every;
                    fs_pro=fs_every;
                    dfo_pro=dfo;
                else
                    fs_every=fs_pro;
                    fval_every=fval_pro;
                    dfo=dfo_pro;
                end
			end
            if fval_every>fval_best
                x_best=x;
                y_best=y;
                fval_best=fval_every;
                fs_best=fs_every;
                dfo_bestk=dfo;
            end
        end
    end
    t=t.*a;
end

%求解结束
x_center = x_best;
y_center = y_best;
disp('圆心坐标分别为:')
circle_center = [x_center; y_center]';
disp(circle_center)
%绘图
hold on
for i = 1 : length(x_center)
    x_plot_tmp = linspace(x_center(i)-r,x_center(i)+r);
    y_plot_tmp_up = ...
        sqrt(r.^2 - (x_plot_tmp - x_center(i)).^2) ...
            + y_center(i);
    y_plot_tmp_down = ...
        - sqrt(r.^2 - (x_plot_tmp - x_center(i)).^2) ...
            + y_center(i);
    plot(x_plot_tmp,y_plot_tmp_up);
    plot(x_plot_tmp,y_plot_tmp_down);
end