【多目标优化求解】基于matlab布谷鸟算法多目标(成本+时间+质量)优化求解【含Matlab源码 118期】

举报
海神之光 发表于 2022/05/29 00:03:33 2022/05/29
【摘要】 一、布谷鸟算法简介 布谷鸟算法,英文叫做Cuckoo search (CS algorithm)。首先还是同样,介绍一下这个算法的英文含义, Cuckoo是布谷鸟的意思,啥是布谷鸟呢,是一种叫做布谷的鸟...

一、布谷鸟算法简介

布谷鸟算法,英文叫做Cuckoo search (CS algorithm)。首先还是同样,介绍一下这个算法的英文含义, Cuckoo是布谷鸟的意思,啥是布谷鸟呢,是一种叫做布谷的鸟,o(∩_∩)o ,这种鸟她妈很懒,自己生蛋自己不养,一般把它的宝宝扔到别的种类鸟的鸟巢去。但是呢,当孵化后,遇到聪明的鸟妈妈,一看就知道不是亲生的,直接就被鸟妈妈给杀了。于是这群布谷鸟宝宝为了保命,它们就模仿别的种类的鸟叫,让智商或者情商极低的鸟妈妈误认为是自己的亲宝宝,这样它就活下来了。
布谷鸟搜索算法(Cuckoo Search, CS)是2009年Xin-She Yang 与Suash Deb在《Cuckoo Search via Levy Flights》一文中提出的一种优化算法。布谷鸟算法是一种集合了布谷鸟巢寄生性和莱维飞行(Levy Flights)模式的群体智能搜索技术,通过随机游走的方式搜索得到一个最优的鸟巢来孵化自己的鸟蛋。这种方式可以达到一种高效的寻优模式。

1 布谷鸟的巢寄生性
在这里插入图片描述
2 莱维飞行
在这里插入图片描述
图1.模拟莱维飞行轨迹示意图

3 布谷鸟搜索算法的实现过程
在这里插入图片描述

二、部分源代码

close all;
clear;
clc;
format long;

n=20;%%%初始化鸟窝数量
pa=0.25;%%%外来鸟蛋被巢主鸟发现的概率5%%%巢主鸟发现寄生卵的概率
%%%%最大迭代次数
N_iter=300;
REP=[];%精英池初始化
RC=[];
R1=[];
%%定义全局变量nd
global nd;
nd=15;%%%搜索维度
Lb=-5*ones(1,nd);%下限
Ub=5*ones(1,nd);%上限
% %%%基于sobol序列随机初始化解
for xh=1:20
    xh
p = sobolset(nd,'Skip',1e2);
p = scramble(p,'MatousekAffineOwen');
SOBOL = net(p,n);
for i=1:n
    for j=1:nd
        nest(i,j)=Lb(1,j)+(Ub(1,j)-Lb(1,j))*SOBOL(i,j);
    end
end
maxFun=4; %目标函数的个数
iterations=1;
%%%计算初试目标函数值
% disp('开始计算初始化目标函数......')
   
for i=1:n
    cstatisc(1,i)=statisc(nest(i,:));
    ccost(1,i)=costc(nest(i,:));
    ctimec(1,i)=timec(nest(i,:));
    cquality(1,i)=qualityc(nest(i,:));
end
% disp('始化目标函数计算结束......')

%%确定粒子非劣解,把每个粒子当作非劣解
% disp('生成ST矩阵……') %用于存放粒子信息
for i=1:n
    ST(i,1:nd)=nest(i,:);
end

ST(:,nd+1)=cstatisc(1,:);
ST(:,nd+2)=ccost(1,:);
ST(:,nd+3)=ctimec(1,:);
ST(:,nd+4)=cquality(1,:);
ST(:,nd+5)=0;

%%STS矩阵存放粒子信息(包括四个目标函数值)
STS=ST;
% %%%pop为萤火虫粒子
% XINXI=ST;
% popo=ST;
% kk=1;
% %%%筛选可理解度,使可理解度为0.7857
%         while(kk<=size(STS,1))
%             if (STS(kk,nd+2)>3||STS(kk,nd+3)>3)
%                 STS(kk,:)=[];
%                 kk=kk-1;
%             end
%                 kk=kk+1;
%         end
%%-------------对外部档案集初始化--------%%
%disp('外部档案集初始化……')

for i=1:size(STS,1)
    if (isempty(REP))
        REP(1,:)=ST(i,:);
        RC=[RC;ST(i,:)];
    else
         for k=1:size(REP,1)
             %% if 条件判断第i个布谷鸟STS(i,)支配精英池REP中的第k条布谷鸟,删除第k条布谷鸟
            if (((STS(i,nd+1)>=REP(k,nd+1))&&(STS(i,nd+2)<=REP(k,nd+2))&&(STS(i,nd+3)<=REP(k,nd+3))&&(STS(i,nd+4)>=REP(k,nd+4)))&&((STS(i,nd+1)>REP(k,nd+1))||(STS(i,nd+2)<REP(k,nd+2))||(STS(i,nd+3)<REP(k,nd+3))||(STS(i,nd+4)>REP(k,nd+4))))
                REP(k,1)=9999;%%%支配标志之一,表示第i个布谷鸟信息STS(i,)支配REP(k,:),要删除REP(k,:),保存STS(i,:)
                insert_flag=1;
                %%elseif条件用来判断第i个布谷鸟不支配精英池里面的第k条规则,此时此条规则不需要从精英池里面移除
            elseif (((STS(i,nd+1)<=REP(k,nd+1))&&(STS(i,nd+2)>=REP(k,nd+2))&&(STS(i,nd+3)>=REP(k,nd+3))&&(STS(i,nd+4)<=REP(k,nd+4)))&&((STS(i,nd+1)<REP(k,nd+1))||(STS(i,nd+2)>REP(k,nd+2))||(STS(i,nd+3)>REP(k,nd+3))||(STS(i,nd+4)<REP(k,nd+4))))
                    insert_flag=0;%%%第i个布谷鸟不支配REP(k,:),这个规则不删除
                    break;
           %%%判断STS(i,:)REP(k,:)是否重复
            elseif((((STS(i,nd+1)==REP(k,nd+1))&&(STS(i,nd+2)==REP(k,nd+2))&&(STS(i,nd+3)==REP(k,nd+3))&&(STS(i,nd+4)==REP(k,nd+4)))))
             %%%判断STS(i,1:nd)REP(k,1:nd)1:nd维元素是否相等,如果相等,即STS(i,1:nd)REP(k,1:nd)重复
             %%%%不需要将STS(i,1:nd)加入REP中否则加入精英池
                    if ((STS(i,nd+1)==0)||(STS(i,nd+2)==0)||(STS(i,nd+3)==0)||(STS(i,nd+4)==0))
                            insert_flag=0;
                    elseif (isempty(setdiff(STS(i,1:nd),REP(k,1:nd))))
                            insert_flag=0;%%%重复,不将STS(i,:)加入精英池REP
                    else
                            insert_flag=0;%%%如果不重复,加入精英池REP//本应该是取值insert_flag=1
                    end
            else
                %%%这一段代码判断的是STS与REP互不支配情况,当目标函数有一个为0时,此条规则不需要加入精英池里面,否则加入
                 if ((STS(i,nd+1)~=0)&&(STS(i,nd+2)~=0)&&(STS(i,nd+3)~=0)&&(STS(i,nd+4)~=0))
                    insert_flag=1;
                 elseif((STS(i,nd+1)==0)||(STS(i,nd+2)==0)||(STS(i,nd+3)==0)||(STS(i,nd+4)==0))
                     insert_flag=0;
                 end
            end
        end
        k1=1;
        %%%
        while(k1<=size(REP,1))
            if (REP(k1,1)==9999)
                REP(k1,:)=[];
                k1=k1-1;
            end
                k1=k1+1;
        end
        
        if (insert_flag==1)
            REP((size(REP,1)+1),:)=STS(i,:);
            RC=[RC;STS(i,:)];%%%曾经放入精英池中的布谷鸟信息
        end
    end
end
disp('开始正式进入主循环——')
iterations=2;
tic
while(iterations<N_iter)
    gbestpool=[];
     if (size(REP,1)>2)
        for f=1:maxFun
            %排序
            for i=1:(size(REP,1)-1)
                for j=(i+1):(size(REP,1))
                    if (REP(i,nd+f)<REP(j,nd+f))
                        temp=REP(i,:);
                        REP(i,:)=REP(j,:);
                        REP(j,:)=temp;
                    end 
                end
            end
            %排序结束
            REP(1,nd+5)=10;
            REP(size(REP,1),nd+5)=10;
            %寻找最大最小目标函数值
            fmax=0;
            for i=1:size(REP,1)
                if (REP(i,nd+f)>fmax)
                    fmax=REP(i,nd+f);
                end
            end
             fmin=10;
            for i=1:size(REP,1)
                if (REP(i,nd+f)<fmin)
                    fmin=REP(i,nd+f);
                end
            end
            %寻找最大最小目标函数值结束
            
            %拥挤距离
            for i=2:(size(REP,1)-1)
                REP(i,nd+5)= REP(i,nd+5)+abs((REP(i+1,nd+f)-REP(i-1,nd+f))/(fmax-fmin));
            end   
        end    
    else 
        REP(1,nd+5)=10;
    end
    
    %计算拥挤距离结束
    %按拥挤距离排序
        for i=1:(size(REP,1)-1)
            for j=(i+1):size(REP,1)
                if (REP(i,nd+5)<REP(j,nd+5))
                temp=REP(i,:);
                REP(i,:)=REP(j,:);
                REP(j,:)=temp;    
                end
            end
        end
    %按拥挤距离排序结束
 
    
 %选择前10%的粒子存入gbestpool
    for i=1:ceil(size(REP,1)*0.1)
        gbestpool=[gbestpool;REP(i,:)];
    end
    
 %选择前10%的粒子存入gbestpool结束
 %%随机选择一个作为最优解
  gb=gbestpool(fix(1+(size(gbestpool,1)-1)*rand),:);
        best=gb(1,1:nd);
 
 %%布谷鸟按照levy进行飞行,产生新的布谷鸟
  new_nest=get_cuckoos_levy(nest,best,Lb,Ub);
  %%%发现并随机选择
for i=1:n
    fitness(1,i)=statisc(new_nest(i,:));
    fitness(2,i)=costc(new_nest(i,:));
    fitness(3,i)=timec(new_nest(i,:));
   fitness(4,i)=qualityc(new_nest(i,:));
end 
  %%第t+1代解与第t代解比较,如果
for i=1:n
    if fitness(1,i)>=cstatisc(iterations-1,i)&&fitness(2,i)<=ccost(iterations-1,i)&&fitness(3,i)<= ctimec(iterations-1,i)&& fitness(4,i)>=cquality(iterations-1,i)
         best_new_nest(i,:)=new_nest(i,:);
    else
         best_new_nest(i,:)=nest(i,:);
    end
    
end 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.
[4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.
[5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/119454276

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。