%% 清空环境
clc;clear all;close all;
%% 目标函数
% 该函数的变量是一个3*4的矩阵形式的变量
% cons1=@(X)(1);表示无约束条件
% cons1=@(X)(sum(sum(X))>=0);可以尝试添加约束条件
a=[2.5,4.5,-2];
b=[2;4.2;4;-4];
c=[1,2,3,4;-4,-3,-2,-1;1,3,2,4];
fun= @(X)(sum(sum(c.*X.^2))+a*X*b);
cons1=@(X)(sum(sum(X))>=0);
%% 设置种群参数
% 需要自行配置
% 下文中所有出现dim2,或者:的地方,都需要根据实际的矩阵维度来进行更改
sizepop = 500; % 初始种群个数
dim1 = 3; % 空间维数
dim2 = 4;
ger = 500; % 最大迭代次数
xlimit_max = 50*ones(dim1,dim2,1); % 设置位置参数限制(矩阵的形式可以多维)
xlimit_min = -50*ones(dim1,dim2,1);
vlimit_max = 1*ones(dim1,dim2,1); % 设置速度限制
vlimit_min = -1*ones(dim1,dim2,1);
c_1 = 0.8; % 惯性权重
c_2 = 0.5; % 自我学习因子
c_3 = 0.5; % 群体学习因子
%% 生成初始种群
% 首先随机生成初始种群位置
% 然后随机生成初始种群速度
% 然后初始化个体历史最佳位置,以及个体历史最佳适应度
% 然后初始化群体历史最佳位置,以及群体历史最佳适应度
for i_1=1:dim1
for i_2=1:dim2
for j=1:sizepop
pop_x(i_1,i_2,j) = xlimit_min(i_1,i_2)+(xlimit_max(i_1,i_2) - xlimit_min(i_1,i_2))*rand; % 初始种群的位置
pop_v(i_1,i_2,j) = vlimit_min(i_1,i_2)+(vlimit_max(i_1,i_2) - vlimit_min(i_1,i_2))*rand; % 初始种群的速度
end
end
end
gbest = pop_x; % 每个个体的历史最佳位置
for j=1:sizepop % 每个个体的历史最佳适应度
if cons1(pop_x(:,:,j)) % 约束条件
fitness_gbest(j)=fun(pop_x(:,:,j));
else
fitness_gbest(j) = 10^10;
end
end
zbest = pop_x(:,:,1); % 种群的历史最佳位置
fitness_zbest = fitness_gbest(1); % 种群的历史最佳适应度
for j=1:sizepop
if fitness_gbest(j) < fitness_zbest % 如果求最小值,则为<; 如果求最大值,则为>;
zbest = pop_x(:,:,j);
fitness_zbest=fitness_gbest(j);
end
end
%% 粒子群迭代
% 更新速度并对速度进行边界处理
% 更新位置并对位置进行边界处理
% 进行自适应变异
% 进行约束条件判断并计算新种群各个个体位置的适应度
% 新适应度与个体历史最佳适应度做比较
% 个体历史最佳适应度与种群历史最佳适应度做比较
% 再次循环或结束
iter = 1; %迭代次数
record = zeros(ger, 1); % 记录器
while iter <= ger
for j=1:sizepop
% 更新速度并对速度进行边界处理
pop_v(:,:,j)= c_1 * pop_v(:,:,j) + c_2*rand*(gbest(:,:,j)-pop_x(:,:,j))+c_3*rand*(zbest-pop_x(:,:,j));% 速度更新
for i_1=1:dim1
for i_2=1:dim2
if pop_v(i_1,i_2,j) > vlimit_max(i_1,i_2)
pop_v(i_1,i_2,j) = vlimit_max(i_1,i_2);
end
if pop_v(i_1,i_2,j) < vlimit_min(i_1,i_2)
pop_v(i_1,i_2,j) = vlimit_min(i_1,i_2);
end
end
end
% 更新位置并对位置进行边界处理
pop_x(:,:,j) = pop_x(:,:,j) + pop_v(:,:,j);% 位置更新
for i_1=1:dim1
for i_2=1:dim2
if pop_x(i_1,i_2,j) > xlimit_max(i_1,i_2)
pop_x(i_1,i_2,j) = xlimit_max(i_1,i_2);
end
if pop_x(i_1,i_2,j) < xlimit_min(i_1,i_2)
pop_x(i_1,i_2,j) = xlimit_min(i_1,i_2);
end
end
end
% 进行自适应变异
if rand > 0.85
i_1=ceil(dim1*rand);
i_2=ceil(dim2*rand);
pop_x(i_1,i_2,j)=xlimit_min(i_1,i_2) + (xlimit_max(i_1,i_2) - xlimit_min(i_1,i_2)) * rand;
end
% 进行约束条件判断并计算新种群各个个体位置的适应度
if cons1(pop_x(:,:,j)) % 约束条件
fitness_pop(j) = fun(pop_x(:,:,j)); % 当前个体的适应度
else
fitness_pop(j) = 10^10;
end
% 新适应度与个体历史最佳适应度做比较
if fitness_pop(j) < fitness_gbest(j) % 如果求最小值,则为<; 如果求最大值,则为>;
gbest(:,:,j) = pop_x(:,:,j); % 更新个体历史最佳位置
fitness_gbest(j) = fitness_pop(j); % 更新个体历史最佳适应度
end
% 个体历史最佳适应度与种群历史最佳适应度做比较
if fitness_gbest(j) < fitness_zbest % 如果求最小值,则为<; 如果求最大值,则为>;
zbest = gbest(:,:,j); % 更新群体历史最佳位置
fitness_zbest=fitness_gbest(j); % 更新群体历史最佳适应度
end
end
record(iter) = fitness_zbest;%最大值记录
iter = iter+1;
end
%% 迭代结果输出
plot(record);title('收敛过程')
disp(['最优值:',num2str(fitness_zbest)]);
disp('变量取值:');
disp(zbest);
m1_粒子群算法目标函数_源码
版权申诉
45 浏览量
2021-09-29
17:12:36
上传
评论 1
收藏 2KB ZIP 举报
呼啸庄主
- 粉丝: 74
- 资源: 4702
最新资源
- AIS2024 valid
- 最入门的爬虫代码 python.docx
- 爬虫零基础入门-爬取天气预报.pdf
- 最通俗易懂的 MongoDB 非结构化文档存储数据库教程.zip
- 以mongodb为数据库的订单物流小项目.zip
- 腾讯云-mongodb数据库, 项目部署.zip
- 腾讯 APIJSON 的 MongoDB 数据库插件.zip
- 理解非关系型数据库和关系型数据库的区别.zip
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0