目录
猫群优化算法(CSO)是一种受猫行为启发的全局优化算法,最初由Chu等人在2010年提出,旨在模拟猫的两种典型行为——探索(Seeking)和追踪(Tracing)模式,以解决单目标优化问题。将其扩展至多目标优化领域,则需要结合多目标优化的原理,如Pareto最优解的概念,以及适当的适应度评估方法,来同时优化多个相互冲突的目标函数。
1. 猫群优化算法基础
猫群优化算法中的猫被分为两类:领导者猫(Leader Cat, LC)和跟随者猫(Follower Cat, FC)。LC负责探索搜索空间,而FC则基于LC的信息进行局部搜索。
2. 多目标优化的挑战与Pareto解
多目标优化问题要求同时考虑多个目标函数fm(X),m=1,2,...,M,其中M>1。Pareto最优解定义为不存在其他解在所有目标上都优于它,至少在一个目标上更好。因此,多目标优化的目标是找到Pareto前沿上的解集。
3. MOCSO中的多目标适应度评估
在MOCSO中,采用非支配排序和 crowding distance(拥挤度)作为适应度评估的标准,类似于NSGA-II算法。
4. MOCSO算法流程
- 初始化:随机生成初始猫群,包括LC和FC,每个猫的位置对应一个解向量。
- 适应度评估:根据多目标优化问题的目标函数,对每个解进行非支配排序和拥挤度计算。
- 更新LC和FC状态:
- 根据猫的位置与Pareto前沿的距离,动态调整猫的探索和追踪行为参数(α,β,γ)。
- 根据非支配排序和拥挤度,选择部分猫作为LC,其余为FC。
- 位置更新:根据探索模式和追踪模式更新猫的位置。
- 精英保留与种群更新:保留当前Pareto前沿上的解,并可能通过一定的策略(如精英策略或基于拥挤度的选择)更新种群。
- 终止判断:若达到预定的迭代次数或满足收敛条件(如Pareto前沿的稳定),则停止算法;否则,返回步骤2继续迭代。
5.matlab程序
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));% 添加当前目录及其子目录下的所有 MATLAB 文件至搜索路径
% 决策变量数目
nVar=[3 0]; % 第一行表示连续决策变量数,第二行表示离散决策变量数
% 决策变量矩阵大小
VarSize=[1 , nVar(1) ; 1 , nVar(2)];
VarMin=[-5 , 0]; % 决策变量下限
VarMax=[5 , 0]; % 决策变量上限
%算法参数设置
% 最大迭代次数
MaxIt=100;
% 群体大小(粒子数)
nPop=50;
nTest = 0.1 * nPop;% 测试粒子数(群体大小的百分比)
% 惯性权重
w=1;
wdamp=0.99; % 惯性权重衰减率
c1=2; % 全局学习系数
MR = 0.9; % 寻优模式切换比例 % 1 表示全体猫处于寻优模式,0 表示全体猫处于追踪模式
nGrid=5; % 维度网格数量
alpha=0.1; % 网格膨胀率
beta=2; % 领导者选择压力
% 重初始化频率(比例)
reInitPer = 0.2;
% 速度限制
VelMax=0.1*(VarMax-VarMin);
VelMin=-VelMax;
%初始化粒子结构体
empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Velocity=[];
empty_particle.flag = false;
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];
empty_particle.Rank=[];
empty_particle.DominationSet=[];
empty_particle.DominatedCount=[];
empty_particle.CrowdingDistance=[];
empty_particle.GridIndex=[];
empty_particle.GridSubIndex=[];
empty_particle.index = 0;
% 初始化全体粒子数组
particles=repmat(empty_particle,nPop,1);
TestParticles = repmat(empty_particle , nTest , 1); % 测试粒子群
% 遍历粒子群
for i=1:nPop
% 初始化位置
particles(i).Position(1:nVar(1))=unifrnd(VarMin(1),VarMax(1),VarSize(1,:));
particles(i).Position(nVar(1)+1:nVar(2)+1)=unifrnd(VarMin(2),VarMax(2),VarSize(2,:));
% 初始化速度
particles(i).Velocity(1:nVar(1))=zeros(VarSize(1,:));
particles(i).Velocity(nVar(1)+1:nVar(2)+1)=zeros(VarSize(2,:));
% 评估当前位置的成本
particles(i).Cost=func_fitness(particles(i).Position , 0);
particles(i).index = i;
% 初始化个人最好位置和成本
particles(i).Best.Position=particles(i).Position;
particles(i).Best.Cost=particles(i).Cost;
end
% 初始化测试粒子群
for i=1:nTest
% 初始化位置
TestParticles(i).Position(1:nVar(1))=unifrnd(VarMin(1),VarMax(1),VarSize(1,:));
TestParticles(i).Position(nVar(1)+1:nVar(2)+1)=unifrnd(VarMin(2),VarMax(2),VarSize(2,:));
% 评估成本
TestParticles(i).Cost=func_fitness(TestParticles(i).Position , 0);
end
% 初始化最优成本数组
BestCost=zeros(MaxIt,1);
% 非支配排序及初始处理
[particles , F]=NonDominatedSorting(particles);
% 计算拥挤距离
particles=CalcCrowdingDistance(particles,F);
% 对粒子群按成本进行排序
[particles , F]=func_SortPop(particles);
for j = 1 : length(particles)
particles(j).index = j;
end
% 初始化领导猫并划分网格
F1 = particles(F{1});
Grid=func_CreateGrid(F1,nGrid,alpha);
% 将每个粒子分配到对应的网格索引
for i=1:numel(F1)
F1(i)=func_FindGridIndex(F1(i),Grid);
end
% 粒子群运动
for it=1:MaxIt% 主循环,进行最大迭代次数
TestBackupCosts = [TestParticles.Cost];
% 备份测试粒子群的成本
TestNewCosts = zeros(2 , nTest);
for i=1:nTest% 更新测试粒子群的成本
TestParticles(i).Cost = func_fitness(TestParticles(i).Position , it);
TestNewCosts(: , i) = TestParticles(i).Cost;
end% 检查测试粒子群成本是否有变化
tf = isequal(TestBackupCosts , TestNewCosts);
if(tf == 0)% 如果成本发生变化,重新评估主粒子群并进行非支配排序
OldIndex = [particles.index];
OldIndex = OldIndex';
for i=1:nPop
particles(i).Cost = Benchmark(particles(i).Position , it);
end
[particles , F]=NonDominatedSorting(particles);
particles = CalcCrowdingDistance(particles,F);
[particles , F]=SortPopulation(particles);
NewIndex = [particles.index];
NewIndex = NewIndex';
% 应用博尔达计数算法确定是否需要重新初始化部分粒子
OptIndex = BordaCountAlgorithm([OldIndex , NewIndex]);
% 计算不需要重新初始化的粒子数量
NumOfNoChange = floor((1 - reInitPer) * length(OptIndex));
% 对需要重新初始化的粒子进行随机初始化
for i = NumOfNoChange : length(OptIndex)
particles(OptIndex(i)).Position(1:nVar(1))=unifrnd(VarMin(1),VarMax(1),VarSize(1,:));
particles(OptIndex(i)).Position(nVar(1)+1:nVar(2)+1)=unifrnd(VarMin(2),VarMax(2),VarSize(2,:));
% 重新评估成本
particles(OptIndex(i)).Cost=Benchmark(particles((OptIndex(i))).Position , it);
end
% 重新进行非支配排序和拥挤距离计算
[particles , F]=NonDominatedSorting(particles);
particles = CalcCrowdingDistance(particles,F);
[particles , F]=SortPopulation(particles);
% 更新粒子索引
for j = 1 : length(particles)
particles(j).index = j;
end
% 重新初始化领导猫及划分网格
F1 = particles(F{1});
Grid=func_CreateGrid(F1,nGrid,alpha);
for i=1:numel(F1)% 将每个粒子分配到对应的网格索引
F1(i)=FindGridIndex(F1(i),Grid);
end
end
% 随机选择进入寻优模式和追踪模式的粒子
indices = randperm(nPop , floor(nPop*MR));
SeekingPop = [];% 寻优模式粒子
TracingPop = [];% 追踪模式粒子
% 选择领导者
leader=func_Leader(F1,beta);
for i=1:nPop% 遍历
ind = find(indices == i);
if(~isempty(ind))
% 进入寻优模式
[SeekingParticles, leader] = Seeking( particles(i) , leader , VelMax , VelMin , VarMax , VarMin , VarSize , nVar , it);
SeekingPop = [SeekingPop , SeekingParticles];
else
% 进入追踪模式
[ particles(i) , leader ] = Tracing( particles(i) , leader , VelMax , VelMin , VarMax , VarMin , VarSize , nVar , w , c1 , it);
TracingPop = [TracingPop , particles(i)];
end
end
particles = [SeekingPop , TracingPop];
% 合并寻优模式和追踪模式的粒子
[particles , F]=NonDominatedSorting(particles);
% 进行非支配排序
particles=CalcCrowdingDistance(particles,F);
% 计算拥挤距离
[particles , F]=func_SortPop(particles);
particles=particles(1:nPop);
% 对粒子群按成本进行排序
[particles , F]=NonDominatedSorting(particles);
particles=CalcCrowdingDistance(particles,F);
[particles , F]=func_SortPop(particles);
for j = 1 : length(particles)
particles(j).index = j;
end
F1=particles(F{1});
Grid=func_CreateGrid(F1,nGrid,alpha);
for i=1:numel(F1)
F1(i)=func_FindGridIndex(F1(i),Grid);
end
figure(1);
func_plot(F1);
w=w*wdamp;
end
up4073
6.仿真结果
MOCSO的性能受到多种参数的影响,包括种群大小、探索与追踪行为参数、精英保留策略等。合适的参数设置对于算法的有效性和效率至关重要。此外,MOCSO在多目标优化中的性能评估,除了关注Pareto前沿的覆盖率和分布均匀性外,还应考虑算法的收敛速度和计算效率。