2011年数学建模B题 遗传算法优化平台设置matlab实现

最近做了2011年数学建模B题,老师要求用遗传算法实现,参考了高瑜隆的获奖论文《交巡警服务平台的设置与调度模型》,将文中提到的算法思路用代码实现了一下,由于MATLAB水平有限,遇到了很多问题,但所幸都一一解决了,代码做了详细注释,仅供学习交流使用。代码中首先利用题目提供的数据,得到了节点间最短距离矩阵,使用了FLOYD算法,最重要的是覆盖率函数。

%主函数
%构造加权邻接矩阵
%第一步算出路线节点间的距离;
load jiedian.txt
load daolu.txt
a=daolu;
b=jiedian;
dis=zeros(length(b));
for i=1:582
    for j=1:582
        if i==j
            dis(i,j)=0;
        else
            dis(i,j)=inf;
        end
    end
end
for k=1:928
    x1=b(a(k,1),2);
    y1=b(a(k,1),3);
    x2=b(a(k,2),2);
    y2=b(a(k,2),3);
    dis(a(k,1),a(k,2))=sqrt((x1-x2)^2+(y1-y2)^2);
end
for m=1:582
    for n=1:582
        if(dis(m,n)~=inf&&dis(m,n)~=0)
         dis(n,m)=dis(m,n);
        end
        
    end
end
%floyd算法
t=dis;
path=zeros(n);
for k=1:n
    for i=1:n
        for j=1:n
            if t(i,j)>t(i,k)+t(k,j)
                t(i,j)=t(i,k)+t(k,j);
                path(i,j)=k;
            end
        end
    end
end
D=t;
NIND=100;%种群大小
N=582;%个体染色体长度
Chrom=Init(NIND,N);%生成初始种群
count=1;
max_count=2001;
while count
function fugailv=fugai(individual,D)
%输入:一个个体,以及距离矩阵
%输出:它的覆盖率
cc=individual;
q=find(cc==1);
len=length(q);
ss1=1;
z1=[];
%第一个区可覆盖的节点数
ss1=1;
for v1=1:len
    if q(v1)>=1&&q(v1)<=92
        z1(ss1)=q(v1);    %zn存放该区的平台编号
        ss1=ss1+1;
    end
end
xx1=length(z1);
zz1=[];
nn1=1;
for h1=1:xx1
    zz1(nn1,:)=D(z1(h1),1:92);  %zz表示n个平台到92个节点的距离
    nn1=nn1+1;
end
%%先提取出所有平台到节点的距离,存放在一个矩阵中,然后遍历每一个节点,如果此节点可以找到一个距离小于30的平台,count+1
count1=0; %表示i7区满足覆盖的节点数
for kk1=1:92
    if min(zz1(:,kk1))<=30
        count1=count1+1;
    end
end

%第二个区的覆盖节点数
z2=[];
ss2=1;
for v2=1:len
    if q(v2)>=93&&q(v2)<=165
        z2(ss2)=q(v2);
        ss2=ss2+1;
    end
end
xx2=length(z2);
zz2=[];
nn2=1;
for h=1:xx2
    zz2(nn2,:)=D(z2(h),93:165);  %zz表示n个平台到92个节点的距离
    nn2=nn2+1;
end
%%先提取出所有平台到节点的距离,存放在一个矩阵中,然后遍历每一个节点,如果此节点可以找到一个距离小于30的平台,count+1
count2=0; %表示i7区满足覆盖的节点数
for kk2=1:165-93+1
    if min(zz2(:,kk2))<=30
        count2=count2+1;
    end
end

%第三个区的覆盖节点数
z3=[];
ss3=1;
for v3=1:len
    if q(v3)>=166&&q(v3)<=319
        z3(ss3)=q(v3);
        ss3=ss3+1;
    end
end
xx3=length(z3);
zz3=[];
nn3=1;
for h=1:xx3
    zz3(nn3,:)=D(z3(h),166:319);  %zz表示n个平台到m个节点的距离
    nn3=nn3+1;
end
%%先提取出所有平台到节点的距离,存放在一个矩阵中,然后遍历每一个节点,如果此节点可以找到一个距离小于30的平台,count+1
count3=0; %表示i7区满足覆盖的节点数
for kk3=1:319-166+1
    if min(zz3(:,kk3))<=30
        count3=count3+1;
    end
end

%第四个区覆盖的节点数
z4=[];
ss4=1;
for v4=1:len
    if q(v4)>=320&&q(v4)<=371
        z4(ss4)=q(v4);
        ss4=ss4+1;
    end
end
xx4=length(z4);
zz4=[];
nn4=1;
for h=1:xx4
    zz4(nn4,:)=D(z4(h),320:371);  %zz表示n个平台到92个节点的距离
    nn4=nn4+1;
end
%%先提取出所有平台到节点的距离,存放在一个矩阵中,然后遍历每一个节点,如果此节点可以找到一个距离小于30的平台,count+1
count4=0; %表示i7区满足覆盖的节点数
for kk4=1:371-320+1
    if min(zz4(:,kk4))<=30
        count4=count4+1;
    end
end

%第五个区的覆盖率
z5=[];
ss5=1;
for v5=1:len
    if q(v5)>=372&&q(v5)<=474
        z5(ss5)=q(v5);
        ss5=ss5+1;
    end
end
xx5=length(z5);
zz5=[];
nn5=1;
for h=1:xx5
    zz5(nn5,:)=D(z5(h),372:474);  %zz表示n个平台到92个节点的距离
    nn5=nn5+1;
end
%%先提取出所有平台到节点的距离,存放在一个矩阵中,然后遍历每一个节点,如果此节点可以找到一个距离小于30的平台,count+1
count5=0; %表示i7区满足覆盖的节点数
for kk5=1:474-372+1
    if min(zz5(:,kk5))<=30
        count5=count5+1;
    end
end

%第六个区的覆盖节点数
z6=[];
ss6=1;
for v6=1:80
    if q(v6)>=475&&q(v6)<=582
        z6(ss6)=q(v6);
        ss6=ss6+1;
    end
end
xx6=length(z6);
zz6=[];
nn6=1;
for h=1:xx6
    zz6(nn6,:)=D(z6(h),475:582);  %zz表示n个平台到92个节点的距离
    nn6=nn6+1;
end
%%先提取出所有平台到节点的距离,存放在一个矩阵中,然后遍历每一个节点,如果此节点可以找到一个距离小于30的平台,count+1
count6=0; %表示i7区满足覆盖的节点数
for kk6=1:582-475+1
    if min(zz6(:,kk6))<=30
        count6=count6+1;
    end
end

Count=count1+count2+count3+count4+count5+count6;
fugailv=Count/582;
end
function Chrom = Initpop(NIND,N)
%初始化种群
%输入
%MIND:种群大小
%N:个体染色体长度
%输出:
%初始种群
Chrom = zeros(NIND,N);  %用于存储种群
v=[ones(1,80),zeros(1,N-80)];
for i=1:NIND
    Chrom(i,:) = v(randperm(N));  %随机生成初始种群,每个个体只包含0和1,且1的个数为80
end


end
function Selch=variation(Chrom)
%%这个函数的作用是将初始种群父代复制,子代变异,输出200条染色体的集合
%输入
%Chrom是含有100条初始染色体的集合
%输出含有200条染色体的集合
a=[];
h=[];
for i=1:100
    a(i,:)=Chrom(i,:);
    h(i,:)=randperm(512,2);  %randperm函数,产生两个1—N区间上不重复的整数
    c=min(h(i,:));
    d=max(h(i,:));
    %变异
    Chrom(i,c:d)=fliplr(Chrom(i,c:d));%fliplr函数对行向量进行翻转;
    a(i+100,:)=Chrom(i,:);
end
Selch=a;

end
function  output = untitled( NEWChrom,D )
%输入
%NEWChrom:包含200条染色体的种群
%%计算他们的覆盖率,选出其中覆盖率较大的前100条
%输出:前100条染色体的种群
[ns,nd]=size(NEWChrom);
cv=1;
cx=[];
for i=1:ns
    cx(cv)=fugai(NEWChrom(i,:),D);  %计算种群的覆盖率,保存在cx中
    cv=cv+1;
end
 [mv mi]=max(cx);
%mv为最大值,mi为最大值索引,v(mi)=mv
[sv si]=sort(cx,2,'descend');
db=length(si);
sw=[];
for h=1:100
    sw(h,:)=NEWChrom(si(h),:);
end
output=sw;
   

end
function [ max_individual ] = untitled3( new_Chrom ,D)
%输入
%NEWChrom:包含100条染色体的种群
%%计算他们的覆盖率,选出其中覆盖率最大的一条
%输出:覆盖率最大的个体
[ns,nd]=size(new_Chrom);
cv=1;
cx=[];
for i=1:ns
    cx(cv)=fugai(new_Chrom(i,:),D);  %计算种群的覆盖率,保存在cx中
    cv=cv+1;
end
 [mv mi]=max(cx);
%mv为最大值,mi为最大值索引,v(mi)=mv
[sv si]=sort(cx,2,'descend');
db=length(si);
max_individual=new_Chrom(si(1),:);


end

以上就是所有的代码了,这里再给出一段无向赋权图的实现代码,运行结果如下图所示:
2011年数学建模B题 遗传算法优化平台设置matlab实现_第1张图片
下面一段代码是实现无向赋权图:
load jiedian.txt
load daolu.txt
a=daolu;
b=jiedian;
dis=zeros(length(b));
for i=1:582
for j=1:582
if i==j
dis(i,j)=1;
else
dis(i,j)=0;
end
end
end
for k=1:928
x1=b(a(k,1),2);
y1=b(a(k,1),3);
x2=b(a(k,2),2);
y2=b(a(k,2),3);
dis(a(k,1),a(k,2))=1;
end
for m=1:582
for n=1:582
if(dis(m,n)=inf&&dis(m,n)=0)
dis(n,m)=dis(m,n);
end

end

end

Coordinates=cumcm2011B2(:,2:3);
gplot(dis,Coordinates,’-*’)
hold on
ax=[562,558,549,487,482,273,248,240,168,227,218,217,215,68,76,62,17,41,371,29,14,26,70,43];
for k=1:24
xxy(k,:)=b(ax(k),2:3);
end
x2=xxy(:,1);
y2=xxy(:,2);
plot(x2,y2,‘O’)
无向赋权图结果如下图所示:
2011年数学建模B题 遗传算法优化平台设置matlab实现_第2张图片
欢迎留言评论,下载请注明出处。
其中的数据jiedian,daolu数据百度云链接:
链接:https://pan.baidu.com/s/1xFg43shqm5ewBz8Rt42QTQ
提取码:rv5a

你可能感兴趣的:(MATLAB,数学建模,遗传算法,无向赋权图,floyd算法)