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

📄 mutation.m

📁 matlab程序 遗传算法变异程序 敬请各位高手指教
💻 M
字号:
function Mpop=mutation(cpop,nxm,u,varnum,pm,lpm,dis,pass,obj,limit)
moutm=zeros(pass(1),pass(4));
for rm=1:pass(1)
    moutm(rm,:)=simu(nxm,cpop(rm,1),cpop(rm,2),u,pass(2),pass(3));
    qm(rm,:)=(moutm(rm,:)-obj).^2;
    Qm(rm)=sum(abs(qm(rm,:)))*100;
end
[mq,numm]=sort(Qm); % 按照从小到大排序
for im=1:pass(1)  % 重新排列种群
    for jm=1:varnum
        cpop(im,jm)=cpop(numm(im),jm);
    end
    Qmn(im)=Qm(numm(im));
end
Pm_rand=rand(pass(1),varnum);
temp1=zeros(pass(1),varnum);
for rm=3:8
    for km=1:varnum
        if Pm_rand(rm,km)<pm(1)
            tempm(1,km)=cpop(rm,km)+lpm(1)*(rand(1)-0.5)*dis(km);
        else
            tempm(1,km)=cpop(rm,km);
        end
    end
    for km=1:varnum
        if tempm(1,km)<limit(km,1)|tempm(1,km)>limit(km,2)
            tempm(1,:)=0;
            break;
        end
    end
    tempm(2,:)=cpop(rm,:);
    moutm1=zeros(1,pass(4));
%     for jm=1:2
        if tempm(1,1)==0|tempm(1,2)==0
            Qm1(1)=100;
            Qm1(2)=Qmn(rm);
%             break;
        else
            moutm1(1,:)=simu(nxm,tempm(1,1),tempm(1,2),u,pass(2),pass(3));
            qm1(1,:)=(moutm1(1,:)-obj).^2;
            Qm1(1)=sum(qm1(1,:))*100;
            Qm1(2)=Qmn(rm);
        end
%         moutm1(jm,:)=simu(nxm,tempm(jm,1),tempm(jm,2),u,pass(2),pass(3));
%         qm1(jm,:)=(moutm1(jm,:)-obj).^2;
%         Qm1(jm)=sum(abs(qm1(jm,:)))*100;
%     end
    [Qmmi,Im]=min(Qm1);
    if Qmmi==100
        '变异程序出错'
        break;
    else
        temp1(rm,:)=tempm(Im,:);
    end
%     temp1(rm,:)=tempm(Im,:);
end
for rm=9:14
    for km=1:varnum
        if Pm_rand(rm,km)<pm(2)
            tempm(1,km)=cpop(rm,km)+lpm(2)*(rand(1)-0.5)*dis(km);
        else
            tempm(1,km)=cpop(rm,km);
        end
    end
    for km=1:varnum
        if tempm(1,km)<limit(km,1)|tempm(1,km)>limit(km,2)
            tempm(1,:)=0;
            break;
        end
    end
    tempm(2,:)=cpop(rm,:);
    moutm1=zeros(1,pass(4));
%     for jm=1:2
        if tempm(1,1)==0|tempm(1,2)==0
            Qm1(1)=100;
            Qm1(2)=Qmn(rm);
        else
            moutm1(1,:)=simu(nxm,tempm(1,1),tempm(1,2),u,pass(2),pass(3));
            qm1(1,:)=(moutm1(1,:)-obj).^2;
            Qm1(1)=sum(qm1(1,:))*100;
            Qm1(2)=Qmn(rm);
        end

%     end
    [Qmmi,Im]=min(Qm1);
    if Qmmi==100
        '变异程序出错'
        break;
    else
        temp1(rm,:)=tempm(Im,:);
    end
%     temp1(rm,:)=tempm(Im,:);
end
for rm=15:20
    for km=1:varnum
        if Pm_rand(rm,km)<pm(3)
            tempm(1,km)=cpop(rm,km)+lpm(3)*(rand(1)-0.5)*dis(km);
        else
            tempm(1,km)=cpop(rm,km);
        end
    end
    for km=1:varnum
        if tempm(1,km)<limit(km,1)|tempm(1,km)>limit(km,2)
            tempm(1,:)=0;
            break;
        end
    end
    tempm(2,:)=cpop(rm,:);
    moutm1=zeros(1,pass(4));
%     for jm=1:2
        if tempm(1,1)==0|tempm(1,2)==0
            Qm1(1)=100;
            Qm1(2)=Qmn(rm);
        else
            moutm1(1,:)=simu(nxm,tempm(1,1),tempm(1,2),u,pass(2),pass(3));
            qm1(1,:)=(moutm1(1,:)-obj).^2;
            Qm1(1)=sum(qm1(1,:))*100;
            Qm1(2)=Qmn(rm);
        end
%         if tempm(jm,1)==0|tempm(jm,2)==0
%             Qm1=100;
%             break;
%         end
%         moutm1(jm,:)=simu(nxm,tempm(jm,1),tempm(jm,2),u,pass(2),pass(3));
%         qm1(jm,:)=(moutm1(jm,:)-obj).^2;
%         Qm1(jm)=sum(abs(qm1(jm,:)))*100;
%     end
    [Qmmi,Im]=min(Qm1);
    if Qmmi==100
        '变异程序出错'
        break;
    else
        temp1(rm,:)=tempm(Im,:);
    end
%     temp1(rm,:)=tempm(Im,:);
end
for rm=1:2
    Mpop(rm,:)=cpop(rm,:);
end
for rm=3:pass(1)
    Mpop(rm,:)=temp1(rm,:);
end

⌨️ 快捷键说明

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