MATLAB实现多目标粒子群算法
以下源代码为MOPSO的双目标规划,目标函数使用ZDT1来测试
多目标粒子群(MOPSO)
- 起源:1995年,受到鸟群觅食行为的规律性启发,James Kennedy和Russell Eberhart建立了一个简化算法模型,经过多年改进最终形成了粒子群优化算法(Particle Swarm Optimization, PSO) ,也可称为粒子群算法。粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。
MATLAB程序:
clc;clear;close all;CostFunction = @(x) evaluate_objective(x); %目标函数ZDT1nVar = 30; %变量个数VarSize = [1 nVar]; %变量矩阵大小VarMin = 0; %变量值定义域VarMax = 1; %注意: 该函数变量不能出现负值MaxIt = 200; %最大迭代次数N = 40; %种群规模nRep = 50; %档案库大小w = 0.9; %惯性权重系数wdamp = 0.99; %惯性权重衰减率c1 = 1.7; %个体学习因子c2 = 1.8; %全局学习因子nGrid = 5; %每一维的分格数alpha = 0.1; %膨胀率beta = 2; %最佳选择压gamma = 2; %删除选择压mu = 0.1; %变异概率empty_particle.Position = []; %粒子位置向量empty_particle.Velocity = []; %粒子速度向量empty_particle.Cost = []; %粒子目标值向量empty_particle.Best.Position = []; %粒子最佳位置向量empty_particle.Best.Cost = []; %粒子最佳目标值向量empty_particle.IsDominated = []; %粒子被支配个体向量empty_particle.GridIndex = []; %粒子栅格索引向量empty_particle.GridSubIndex = []; %粒子栅格子索引向量pop = repmat(empty_particle,N,1); %粒子初始空矩阵for i = 1:N %初始化N个个体% 产生服从均匀分布, VarSize大小的位置矩阵pop(i).Position = unifrnd(VarMin,VarMax,VarSize);pop(i).Velocity = zeros(VarSize);pop(i).Cost = CostFunction(pop(i).Position);pop(i).Best.Position = pop(i).Position;pop(i).Best.Cost = pop(i).Cost;endpop = DetermineDomination(pop);rep = pop(~[pop.IsDominated]);Grid = CreateGrid(rep,nGrid,alpha);for i = 1:numel(rep)rep(i) = FindGridIndex(rep(i),Grid);% GridIndex = 绝对位置,.GridSubIndex = 坐标位置end%MOPSO主循环for it = 1:MaxItfor i = 1:N %逐一个体更新速度和位置,0.5的概率发生变异leader = SelectLeader(rep,beta); %从支配个体轮盘赌选出全局最佳个体rep = [rep;pop(~[pop.IsDominated])]; %添加新的最佳栅格位置到库pop(i).Velocity = w*pop(i).Velocity + ...c1*rand(VarSize).*(pop(i).Best.Position-pop(i).Position)+ ...c2*rand(VarSize).*(leader.Position-pop(i).Position); %速度更新pop(i).Position = pop(i).Position+pop(i).Velocity; %位置更新pop(i).Position = limitToPosition(pop(i).Position,VarMin,VarMax); %限制变量变化范围pop(i).Cost = CostFunction(pop(i).Position); %计算目标函数值%应用变异策略pm = (1-(it-1)/(MaxIt-1)^(1/mu)); % 变异概率逐渐变小NewSol.Position = Mutate(pop(i).Position,pm,VarMin,VarMax);NewSol.Cost = CostFunction(NewSol.Position); % 计算变异后的目标值if Dominates(NewSol,pop(i))pop(i).Position = NewSol.Position;pop(i).Cost = NewSol.Cost;else %以0.5的概率决定是否接受变异if rand < 0.5pop(i).Position = NewSol.Position;pop(i).Cost = NewSol.Cost;endendif Dominates(pop(i),pop(i).Best) % 如果当前个体优于先前最佳个体,则替换之pop(i).Best.Position = pop(i).Position;pop(i).Best.Cost = pop(i).Cost;else %以0.5的概率替换个体最佳if rand <0.5pop(i).Best.Position = pop(i).Position;pop(i).Best.Cost = pop(i).Cost;endendend %每个个体rep = DetermineDomination(rep);rep = rep(~[rep.IsDominated]);Grid = CreateGrid(rep,nGrid,alpha); for i =1:numel(rep) rep(i) = FindGridIndex(rep(i),Grid); end if numel(rep) > nRep Extra = numel(rep)-nRep; for e = 1:Extra rep = DeleteOneRepMemebr(rep,gamma); end end disp(['迭代次数 =',num2str(it)]); w = w*wdamp; end figure(1); location = [rep.Cost]; %取最优结果 scatter(location(1,:),location(2,:),'filled','b'); xlabel('f1');ylabel('f2'); title('Pareto 最优边界图'); box on; %============================= %计算目标函数值 %============================= function f =evaluate_objective(x) f = []; f(1) = x(1); g = 1; sum = 0; V = size(x,2); for i = 2:V sum = sum + x(i); end sum = 9*(sum/(V-1)); g = g+sum; f(2) = g*(1-sqrt(x(1)/g)); f = [f(1);f(2)]; end %============================= %判断全局支配状况,返回0 = 非支配解 %============================= function pop =DetermineDomination(pop) nPop = numel(pop); for i =1:nPop pop(i).IsDominated = false; %初始化为互不支配 end for i = 1:nPop-1 for j = i+1:nPop if Dominates(pop(i),pop(j)) pop(j).IsDominated = true; end if Dominates(pop(j),pop(i)) pop(i).IsDominated = true; end end end end %============================= %判断两个目标值x,y的支配状态 % x支配y,返回1;y支配x,返回0 %============================= function b = Dominates(x,y) if isstruct(x) x=x.Cost; end if isstruct(y) y=y.Cost; end b=all(x<=y) && any(x<y); end %============================= %创建栅格矩阵 %============================= function Grid = CreateGrid(pop,nGrid,alpha) c = [pop.Cost]; cmin = min(c,[],2); cmax = max(c,[],2); dc = cmax-cmin; cmin = cmin-alpha*dc; cmax = cmax+alpha*dc; nObj = size(c,1); empty_grid.LB = []; empty_grid.UB = []; Grid = repmat(empty_grid,nObj,1); for j = 1:nObj cj = linspace(cmin(j),cmax(j),nGrid+1); Grid(j).LB = [-inf cj]; Grid(j).UB = [cj +inf]; end end %============================= %栅格索引定位 %============================= function particle = FindGridIndex(particle,Grid) nObj = numel(particle.Cost); nGrid = numel(Grid(1).LB); particle.GridSubIndex = zeros(1,nGrid); for j = 1:nObj particle.GridSubIndex(j) = find(particle.Cost(j)<=Grid(j).UB,1,'first'); %从左到右找到第一个目标值小于栅格值的位置 end particle.GridIndex = particle.GridSubIndex(1); for j = 2:nObj % 左上角开始数到右下角,先数行再换行继续数 particle.GridIndex = particle.GridIndex-1; particle.GridIndex = nGrid*particle.GridIndex; particle.GridIndex = particle.GridIndex + particle.GridSubIndex(j); end end %============================= %从全局支配个体中找出一个最佳个体 %============================= function leader = SelectLeader(rep,beta) GI = [rep.GridIndex]; OC = unique(GI); %一个栅格可能被多个支配解占用 N = zeros(size(OC)); for k =1:numel(OC) N(k) = numel(find(GI == OC(k))); end % 计算选择概率,为了增加多样性,尽量不选多次出现的个体 % 如果N大P就小, 即多次出现的栅格点被选中的概率小 P = exp(-beta*N); P = P/sum(P); sci = RouletteWheelSelection(P); %轮盘赌策略选择 sc = OC(sci); % 轮盘赌选择的栅格点 SCM = find(GI==sc); smi = randi([1 numel(SCM)]); sm = SCM(smi); leader = rep(sm); %当前全局最佳位置点 end %============================= %轮盘赌选择一个较好的支配个体 %============================= function i = RouletteWheelSelection(P) r = rand; C = cumsum(P); i = find(r<=C,1,'first'); end %============================= %限制变量变化范围在定义域内 %============================= function Position = limitToPosition(Position,VarMin,VarMax) for i =1:size(Position,2) if Position(i)<VarMin Position(i) = VarMin; elseif Position(i) > VarMax Position(i) = VarMax; end end end %============================= %删除档案库中的一个个体 %============================= function rep = DeleteOneRepMemebr(rep,gamma) GI = [rep.GridIndex]; OC = unique(GI); N = zeros(size(OC)); for k = 1:numel(OC) N(k) = numel(find(GI == OC(k))); end P = exp(gamma*N); P = P/sum(P); sci = RouletteWheelSelection(P); sc = OC(sci); SCM = find(GI == sc); smi = randi([1 numel(SCM)]); sm = SCM(smi); rep(sm) = []; end %============================= %使用变异策略 %============================= function xnew = Mutate(x,pm,VarMin,VarMax) nVar = numel(x); j = randi([1 nVar]); dx = pm*(VarMax-VarMin); lb = x(j)-dx; if lb<VarMin lb=VarMin; end ub = x(j)+dx; if ub > VarMax ub = VarMax; end xnew = x; xnew(j) = unifrnd(lb,ub); end
帕累托最优边界:
MATLAB实现多目标粒子群算法相关推荐
- MATLAB实现多目标粒子群优化算法(MOPSO)
MATLAB实现多目标粒子群优化算法(MOPSO) 这里如何用MATLAB实现多目标粒子群优化算法. 本教程参考:MATLAB实现多目标粒子群算法 对其中的优化项.优化目标项进行了简单的修改.优化项由 ...
- 基于多目标粒子群算法在分布式电源选址和定容中的应用matlab程序
基于多目标粒子群算法在分布式电源选址和定容中的应用matlab程序 摘 要: 为更好地解决分布式电源选址定容问题,提出一种改进的多目标粒子群算法.考虑投资成本.网损以及电压稳定性三因素建立了一个三目标 ...
- MATLAB代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化
MATLAB代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化 关键词:综合能源 冷热电三联供 粒子群算法 多目标优化 参考文档:<基于多目标算法的冷热电联供型综合能源系统运行优化> ...
- 多目标粒子群算法(MOPSO)的原理和matlab实现
算法原理部分参考文献基于改进多目标粒子群算法的配电网储能选址定容 0.前言 初学者面对多目标优化问题可能比较困难,写下这篇博客记录一下自己学习的心得,希望能和大家一起交流学习. 采用粒子群求单目标优化 ...
- 基于多目标粒子群算法的配电网储能选址定容(含MATLAB程序)
一.主要内容 程序是对文章<基于多目标粒子群算法的配电网储能选址定容>的方法复现,具体内容如下: 以系统节点电压水平(电网脆弱性).网络损耗以及储能系统总容量为目标建立了储能选址定容优化模 ...
- 4.基于多目标粒子群算法冷热电联供综合能源系统运行优化
4.基于多目标粒子群算法冷热电联供综合能源系统运行优化<文章复现> 相关资源代码:基于多目标粒子群算法冷热电联供综合能源系统运行优化 基于多目标算法的冷热电联供型综合能源系统运行优化 考虑 ...
- MATLAB代码:基于粒子群算法的电动汽车充电站最优选址和定容
MATLAB代码:基于粒子群算法的电动汽车充电站最优选址和定容 关键词:选址定容 电动汽车 充电站位置 仿真平台:MATLAB 主要内容:代码主要做的是一个电动汽车充电站的选址定容问题,提出了能够计及 ...
- 基于多目标粒子群算法(MOPSO)的含风管柴储的微电网多目标优化——附代码
目录 摘要: 1.微电网模型 2.微电网多目标优化调度的目标函数 2.1运行成本最小: 2.2风光消纳率最高: 3.微电网多目标优化调度的约束条件 3.1最大最小功率约束: 3.2最大最小功率约束: ...
- 韩老师多目标优化:多目标粒子群算法
一. 内容简介 韩老师多目标优化:多目标粒子群算法 视频: [2022.2.5韩老师十七课时(中)多目标优化:多目标粒子群算法] https://www.bilibili.com/video/BV1e ...
最新文章
- 字符串BF和KMP匹配算法
- java 文件读取 进度_读取文本文件时如何使用Java进度栏?
- F - Monkey Banana Problem
- cmd:计算机cmd常用命令集合之详细攻略daiding
- 格子箱被评选为12家最值得注意的亚洲初创科技公司之一
- MTCNN可攻破?华为提出一种可复制、可靠的攻击方法
- Struts2之拦截器篇
- 通过zabbix获取数据库连接的信息及部分扩展
- MySQL5.5的安装步骤
- 关于程序员抵制996的一些想法
- tensorflow roadshow 全球巡回演讲 会议总结
- 逐飞K66核心板+逐飞DAP下载器调试方式及接线(SWD)
- pyton入门 — 其他常用语法
- Halium 9 尝鲜 -- 在小米平板4上的移植 (一)
- ArcGIS中将中文经纬度标记转换为英文标记
- 简易计算机机房设计规范,电子计算机机房设计规范GB50174-93[8]
- 安装ModelSim的详细步骤:
- 配置Fcitx输入法的云输入功能 Fcitx候选词框显示省略号的解决办法
- 钢的基本知识02——钢材牌号表示含义
- 有这样的语音闹钟,你还会懒床吗??
热门文章
- S32DS创建自己的SDK
- 博世BOSCH DELFOR 交付预测报文详解
- SQL:查询近一年每个月的数据
- 【产品经理】谁是产品经理,产品经理到底要做什么?
- 双系统完整卸载Ubuntu+Windows磁盘分区安全删除Ubuntu的EFI分区和其他分区
- webrtc笔记-信令部分(SDP)
- oracle查询结果集迭代,Oracle 如何循环查询结果集,进行新增或修改
- 计算机软考铁路不认,软考高级工程师容易考吗
- 基于Actix-Web 和Rbatis 的用户注册和登录实现(一)
- python商业爬虫实战与智能投顾基础_python机器学习到量化智能投顾,人生没有彩排,交易却可能回测...