⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd22.m

📁 粗粒度并行遗传算法
💻 M
字号:
clear all;
clc;
format short;

Pnumber=192;
opt=zeros(1,3);
maxc=5;
qo=zeros(1,288);

Population_number=20;
Emigration_generation=3;
Emigration_number=Population_number;
pc=0.7;
pm=0.15;

cc(1,:)=[20 24 25 22 23 28 23 24 25 27 20 26 20 28 24 26 21 23 19 22 23 23 21 22 24 26 24 27 25 21 24 21 23 22 22 24 26 27 28 24 21 20 22 25 24 26 24 25 24 21 20 23 22 22 22 22 23 22 24 25 27 21 26 28 24 25 24 24 27 27 29 23 24 25 21 24 21 23 26 25 19 28 24 26 27 27 29 22 24 18 23 24 26 25 26 27];
cc(2,:)=[4 3 2 3 4 3 2 3 4 3 2 3 4 3 2 1 2 2 3 4 2 3 5 3 2 1 2 2 4 3 1 2 4 3 2 3 4 3 3 2 1 3 3 4 2 1 2 3 3 2 3 4 4 3 1 1 3 2 1 2 3 3 4 3 2 2 1 2 3 4 3 2 1 2 3 3 2 4 2 3 4 2 3 2 1 2 3 4 3 3 4 2 2 3 3 4];
cc(3,:)=[2 1 2 3 3 4 3 2 2 1 2 3 4 3 2 1 2 3 3 2 4 2 3 4 2 3 2 1 2 3 4 3 3 4 2 2 3 3 4 4 3 2 3 4 3 2 3 4 3 2 3 4 3 2 1 2 2 3 4 2 3 4 3 2 1 2 2 4 3 1 2 4 3 2 3 4 3 3 2 1 3 3 4 2 1 2 3 3 2 3 4 4 3 1 1 3];

v10=1000000;
v20=80000;
v30=50000;

hhh=36.9919+0.0007061*v30-2.3679*10^(-12)*v30^2+2.1528*10^(-15)*v30^3;
hh=5.2975+0.002023802*v20-1.760249*10^(-8)*v20^2+6.4832*10^(-14)*v20^3;

p(1:96)=[2213.182 2248.814 1951.312 1698.104 1116.228 1029.144 1005.312 1019.088 1017.408 1020.768 1021.104 1032.192 1023.12 1000.272 1014.048 1011.696 999.6 1013.376 1015.392 1021.776 1037.232 1046.304 1039.584 1038.912 1039.248 1037.568 1081.14 1418.366 1680.136 1730.278 1872.286 2192.83 2566.202 3185.16 3414.376 3917.122 3911.432 4442.352 4373.522 4485.124 4524.184 4585.402 4421.82 4446.464 4463.276 4513.4 4433.202 4631.592 4441.916 4248.732 4246.436 4119.032 4166.74 4298.232 4275.5 4375.492 4437.34 4488.23 4484.714 4482.696 4427.826 4419.074 4443.042 4407.496 3899.074 3928.91 4121.99 4291.738 4356.966 4390.434 4029.394 4058.2 3921.746 3764.098 3503.244 3605.764 4065.02 4571.61 4655.234 4712.454 4721.958 4814.112 4817.884 4798.02 4697.89 4647.854 3962.894 3965.158 3533.862 3117.786 3057.966 3088.324 3285.392 2663.634 1454.554 1249.32];

pp=0;
for jj=1:96
    pp=pp+p(jj);
end

nnn=10.9218;

q(1,193:200)=[121 103 99 101 113 73 24 21];
q(2,195:200)=[53 53 53 53 53 53];

opt(1:3)=[0 0 0];

qmax1=227.8;
qmax2=60.3;
qmax3=56.7;
qmin1=5;
qmin2=6;
qmin3=5;

vmax1=1455700;
vmax2=106000;
vmax3=93000;
vmin1=466200;
vmin2=66300;
vmin3=37000;

%parameters setting
Population_size=700;
String_Length=1920;
elitist=1;

%ending condition setting
max_generation=150;
max_nonincrease_generation=300;
fo=zeros(maxc,max_generation);

%course parameters checkout
c=Population_size/Population_number;
c=fix(c);
if c<Population_size/Population_number
    Population_size=Population_number*round(Population_size/Population_number);
end
c=Emigration_number/Population_number;
c=fix(c);
if c<Emigration_number/Population_number
    Emigration_number=Population_number*(fix(Emigration_number/Population_number)+1);
end

%course outcomes setting
Subpopulation_size=Population_size/Population_number;
Subemigration_number=Emigration_number/Population_number;

optimal=zeros(maxc,2);

for rr=1:maxc

    %outcomes setting
    if rr>2
        Population_number=1;
    end
    
    generation=1;
    optimal_now=zeros(max_generation,Population_number);
    maxsat=0;
        
    %compute times Initialization
    fitness_computetime=0;
    chromosome_computetime=0;

    %Initialization
    for k=1:Population_number

        for i=1:Population_size
            for iii=1:Pnumber
                tt=clock;
                c=tt(6)/60;
                c=rand(1);
                for j=1:String_Length/Pnumber
                    c=2*c;
                    chromosome(k,i,String_Length/Pnumber*iii-String_Length/Pnumber+j)=fix(c);
                    c=rem(c,1);
                end
            end
        end
    end
    fitness_function=zeros(Population_number,Subpopulation_size);
    selected=zeros(Population_number,1,Population_size);
    chromosome_change=zeros(Population_number,Population_size,String_Length);

    %main
    while 1
        for k=1:Population_number
            maxsat_now=0;
            sum_fit=0;
            for i=1:Subpopulation_size

                %encode
                for jj=1:Pnumber
                    a(jj,1:String_Length/Pnumber)=chromosome(k,i,((jj-1)*(String_Length/Pnumber)+1):jj*(String_Length/Pnumber));
                end
                
                for jj=1:Pnumber
                    param(jj)=0;
                end

                for jj=1:Pnumber/2
                    for j=1:String_Length/Pnumber
                        param(jj)=param(jj)+a(jj,j)*(2^(j-1));
                    end
                    m=2^(String_Length/Pnumber)-1;
                    if param(jj)<1
                        q(3,jj)=qmin3;
                    else
                        q(3,jj)=(qmax3-qmin3)*param(jj)/m+qmin3;
                    end
                end

                for jj=(1+Pnumber/2):Pnumber
                    for j=1:String_Length/Pnumber
                        param(jj)=param(jj)+a(jj,j)*(2^(j-1));
                    end
                    m=2^(String_Length/Pnumber)-1;
                    if param(jj)<1
                        q(2,jj-Pnumber/2)=qmin2;
                    else
                        q(2,jj-Pnumber/2)=(qmax2-qmin2)*param(jj)/m+qmin2;
                    end
                end
                
                chromosome_computetime=chromosome_computetime+1;
                
                for jj=1:Pnumber/2
                    if jj==1
                        q(1,jj)=(p(jj)*nnn-hhh*q(3,jj)-hh*q(2,jj))/(64.6+0.000311319*v10-2.0832*10^(-10)*v10^2+5.4337*10^(-17)*v10^3);
                    else
                        q(1,jj)=(p(jj)*nnn-(36.9919+0.0007061*v(3,jj-1)-2.3679*10^(-12)*v(3,jj-1)^2+2.1528*10^(-15)*v(3,jj-1)^3)*q(3,jj)-(5.2975+0.002023802*v(2,jj-1)-1.760249*10^(-8)*v(2,jj-1)^2+6.4832*10^(-14)*v(2,jj-1)^3)*q(2,jj))/(64.6+0.000311319*v(1,jj-1)-2.0832*10^(-10)*v(1,jj-1)^2+5.4337*10^(-17)*v(1,jj-1)^3);
                    end
                    
                    if q(1,jj)<qmin1
                        q(1,jj)=2*qmin1-q(1,jj);
                    elseif (q(1,jj)>qmax1)
                        q(1,jj)=q(1,jj)+qmax1;
                    end
                    
                    if jj==1
                        v(1,jj)=v10-q(1,jj)+cc(1,jj);
                        v(2,jj)=v20-q(2,jj)+q(1,jj+192)+cc(2,jj);
                        v(3,jj)=v30-q(3,jj)+q(2,jj+194)+cc(3,jj);
                    else
                        v(1,jj)=v(1,jj-1)-q(1,jj)+cc(1,jj);
                        v(2,jj)=v(2,jj-1)-q(2,jj)+q(1,jj+192)+cc(2,jj);
                        v(3,jj)=v(3,jj-1)-q(3,jj)+q(2,jj+194)+cc(3,jj);
                    end
                    
                    if (v(1,jj)<vmin1) | (v(1,jj)>vmax1) | (v(2,jj)<vmin2) | (v(2,jj)>vmax2) | (v(3,jj)<vmin3) | (v(3,jj)>vmax3) 
                        q(1,jj)=q(1,jj)+0.1*qmax1;
                    end

                    q(1,jj+200)=q(1,jj);
                    q(2,jj+200)=q(2,jj);
               end

                %fitness_function
                jj=Pnumber/2;
                fitness_function(k,i)=pp*nnn-((5.2975+0.002023802*v20-1.760249*10^(-8)*v20^2+6.4832*10^(-14)*v20^3)*v10+(36.9919+0.0007061*v30-2.3679*10^(-12)*v30^2+2.1528*10^(-15)*v30^3)*(v10+v20)+64.6*v10+0.00015566*v10^2-0.6944*10^(-10)*v10^3+1.3594*10^(-17)*v10^4+5.2975*v20+0.001011901*v20^2-0.58675*10^(-8)*v20^3+1.6208*10^(-14)*v20^4+36.9919*v30+0.000353*v30^2-0.7893*10^(-9)*v30^3+0.5382*10^(-15)*v30^4)+(5.2975+0.002023802*v(2,jj)-1.760249*10^(-8)*v(2,jj)^2+6.4832*10^(-14)*v(2,jj)^3)*v(1,jj)+(36.9919+0.0007061*v(3,jj)-2.3679*10^(-12)*v(3,jj)^2+2.1528*10^(-15)*v(3,jj)^3)*(v(1,jj)+v(2,jj))+64.6*v(1,jj)+0.00015566*v(1,jj)^2-0.6944*10^(-10)*v(1,jj)^3+1.3594*10^(-17)*v(1,jj)^4+5.2975*v(2,jj)+0.001011901*v(2,jj)^2-0.58675*10^(-8)*v(2,jj)^3+1.6208*10^(-14)*v(2,jj)^4+36.9919*v(3,jj)+0.000353*v(3,jj)^2-0.7893*10^(-9)*v(3,jj)^3+0.5382*10^(-15)*v(3,jj)^4;
                fitness_computetime=fitness_computetime+1;
                if fitness_function(k,i)>maxsat_now
                    maxsat_now=fitness_function(k,i);
                    optimal_now(generation,k)=fitness_function(k,i);
                    aa=chromosome(k,i,:);
                    if fitness_function(k,i)>maxsat
                        maxsat=fitness_function(k,i);
                        optimal(rr,1:2)=[generation fitness_function(k,i)];
                        qo=[q(1,1:96),q(2,1:96),q(3,1:96)];
                    end
                end
            end

            %select
            %common selection
            for i=1:Subpopulation_size
                sum_fit=sum_fit+fitness_function(k,i);
            end
            for i=1:Subpopulation_size
                x=sum_fit*rand(1);
                n=Subpopulation_size;
                while sum_fit>x
                    sum_fit=sum_fit-fitness_function(k,n);
                    n=n-1;
                end
                if n==Subpopulation_size
                    n=n-1;
                end
                selected(1,i)=n+1;
            end

            %reproduce
            for i=1:Subpopulation_size
                for j=1:String_Length
                    chromosome_change(k,i,j)=chromosome(k,selected(1,i),j);
                end
            end
            for i=1:Subpopulation_size
                for j=1:String_Length
                    chromosome(k,i,j)=chromosome_change(k,i,j);
                end
            end

            %crossover
            Crossover_Number=round(Subpopulation_size*pc/2);
            for i=1:Crossover_Number
                parent1=selected(1,i);
                parent2=selected(1,Subpopulation_size-i);
                child1=selected(1,i);
                child2=selected(1,Subpopulation_size-i);
                sitel1=fix(rand(1)*String_Length)+2;
                for j=1:String_Length
                    if(j<sitel1)
                        chromosome(k,child1,j)=chromosome_change(k,parent1,j);
                        chromosome(k,child2,j)=chromosome_change(k,parent1,j);
                    else
                        chromosome(k,child1,j)=chromosome_change(k,parent2,j);
                        chromosome(k,child2,j)=chromosome_change(k,parent1,j);
                    end
                end
            end

            %mutation
            for i=1:Subpopulation_size
                for j=1:String_Length
                    radium=rand(1);
                    if radium<pm
                        chromosome(k,i,j)=abs(chromosome(k,i,j)-1);
                    end
                end
            end

            %elitist strategy
            if elitist>0
                %if rand(1)>0.5
                chromosome(k,fix(Subpopulation_size/2),:)=aa;
            end
        end

        fo(rr,generation)=optimal(rr,2);
        
        if generation>=max_generation
            break;
        elseif mod(generation,Emigration_generation)==0&Population_number>1%&rand(1)>0.5
            %migratory
            for k=1:Population_number
                for i=1:Population_number
                    chromosome(k,i,:)=chromosome_change(i,k,:);
                end
            end
        end

        if generation-optimal(rr,1)>max_nonincrease_generation
            break;
        end

        generation=generation+1;
    end

    %output
    opt(1)=opt(1)+optimal(rr,1);
    opt(2)=opt(2)+optimal(rr,2);
    
    qqq=0;
    for jj=1:96
        if qo(jj)>qmax1
            qqq=1;
        end
    end


    if qqq==0
        qo(1:96)
        qo(97:192)
        qo(193:288)
    end

end

opt(1)=opt(1)/maxc;
opt(2)=opt(2)/maxc;
for rr=1:maxc
    opt(3)=opt(3)+(optimal(rr,2)-opt(2))^2;
end
opt(3)=(opt(3)/maxc)^0.5;


plot(1:max_generation,fo(1,1:max_generation),1:max_generation,fo(2,1:max_generation),1:max_generation,fo(3,1:max_generation),1:max_generation,fo(4,1:max_generation),1:max_generation,fo(5,1:max_generation))

opt

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -