遗传算法GA求解函数极值
更新时间:2024-02-26 07:52:01 阅读量: 综合文库 文档下载
主程序
%% GA clc % 清屏
clear all; % 删除workplace变量 close all; % 关掉显示图形窗口 warning off
%% 参数初始化
popsize=100; %种群规模 lenchrom=7; %变量字串长度
pc=0.7; %设置交叉概率,本例中交叉概率是定值,若想设置变化的交叉概率可用表达式表示,或从写一个交叉概率函数,例如用神经网络训练得到的值作为交叉概率 pm=0.3; %设置变异概率,同理也可设置为变化的
maxgen=100; % 进化次数
%种群
popmax=50; popmin=0;
bound=[popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax;popminpopmax]; %变量范围
%% 产生初始粒子和速度 fori=1:popsize
%随机产生一个种群
GApop(i,:)=Code(lenchrom,bound); %随机产生个体 %计算适应度
fitness(i)=fun(GApop(i,:)); %染色体的适应度 end
%找最好的染色体
[bestfitnessbestindex]=min(fitness);
zbest=GApop(bestindex,:); %全局最佳 gbest=GApop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优 fori=1:maxgen i
%种群更新 GA选择更新 GApop=Select2(GApop,fitness,popsize);
% 交叉操作 GA
GApop=Cross(pc,lenchrom,GApop,popsize,bound);
% 变异操作 GA变异
GApop=Mutation(pm,lenchrom,GApop,popsize,[imaxgen],bound);
pop=GApop;
for j=1:popsize
%适应度值 if
0.072*pop(j,1)+0.063*pop(j,2)+0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7)<=264.4
if
128*pop(j,1)+78.1*pop(j,2)+64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719 fitness(j)=fun(pop(j,:)); end end
%个体最优更新 if fitness(j) fitnessgbest(j) = fitness(j); end %群体最优更新 if fitness(j) fitnesszbest = fitness(j); end end yy(i)=fitnesszbest; end %% 结果 disp '*************best particle number****************' zbest %% plot(yy,'linewidth',2); title(['适应度曲线 ' '终止代数=' num2str(maxgen)]); xlabel('进化代数');ylabel('适应度'); grid on 子程序 fun function y = fun(x) y=0.072*x(1)+0.063*x(2)+0.057*x(3)+0.05*x(4)+0.032*x(5)+0.0442*x(6)+0.0675*x(7); Mutation function ret=Mutation(pmutation,lenchrom,chrom,sizepop,pop,bound) % 本函数完成变异操作 % pcorss input : 变异概率 % lenchrom input : 染色体长度 % chrom input : 染色体群 % sizepop input : 种群规模 % pop input : 当前种群的进化代数和最大的进化代数信息 % ret output : 变异后的染色体 fori=1:sizepop % 随机选择一个染色体进行变异 pick=rand; while pick==0 pick=rand; end index=ceil(pick*sizepop); % 变异概率决定该轮循环是否进行变异 pick=rand; if pick>pmutation continue; end flag=0; while flag==0 % 变异位置 pick=rand; while pick==0 pick=rand; end pos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异 v=chrom(i,pos); v1=v-bound(pos,1); v2=bound(pos,2)-v; pick=rand; %变异开始 if pick>0.5 delta=v2*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v+delta; else delta=v1*(1-pick^((1-pop(1)/pop(2))^2)); chrom(i,pos)=v-delta; end %变异结束 flag=test(lenchrom,bound,chrom(i,:)); %检验染色体的可行性 end end ret=chrom; Cross function ret=Cross(pcross,lenchrom,chrom,sizepop,bound) %本函数完成交叉操作 % pcorss input : 交叉概率 % lenchrom input : 染色体的长度 % chrom input : 染色体群 % sizepop input : 种群规模 % ret output : 交叉后的染色体 fori=1:sizepop % 随机选择两个染色体进行交叉 pick=rand(1,2); while prod(pick)==0 pick=rand(1,2); end index=ceil(pick.*sizepop); % 交叉概率决定是否进行交叉 pick=rand; while pick==0 pick=rand; end if pick>pcross continue; end flag=0; while flag==0 % 随机选择交叉位置 pick=rand; while pick==0 pick=rand; end pos=ceil(pick.*sum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同 pick=rand; %交叉开始 v1=chrom(index(1),pos); v2=chrom(index(2),pos); chrom(index(1),pos)=pick*v2+(1-pick)*v1; chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束 flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性 flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性 if flag1*flag2==0 flag=0; else flag=1; end %如果两个染色体不是都可行,则重新交叉 end end ret=chrom; Code function ret=Code(lenchrom,bound) %本函数将变量编码成染色体,用于随机初始化一个种群 % lenchrom input : 染色体长度 % bound input : 变量的取值范围 % ret output: 染色体的编码值 flag=0; while flag==0 pick=rand(1,lenchrom); ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值 flag=test(lenchrom,bound,ret); %检验染色体的可行性 end Select2 function ret=Select(individuals,fitness,sizepop) % 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异 % individuals input : 种群信息 % fitness input : 适应度 % sizepop input : 种群规模 % opts input : 选择方法的选择 % ret output : 经过选择后的种群 fitness= 1./(fitness); sumfitness=sum(fitness); sumf=fitness./sumfitness; index=[]; for i=1:sizepop %转sizepop次轮盘 pick=rand; while pick==0 pick=rand; end for j=1:sizepop pick=pick-sumf(j); if pick<0 index=[index j]; break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体 end end end individuals=individuals(index,:); fitness=fitness(index); ret=individuals; test function flag=test(lenchrom,bound,code) % lenchrom input : 染色体长度 % bound input : 变量的取值范围 % code output: 染色体的编码值 flag=1; [n,m]=size(code); fori=1:n if code(i) while pick==0 pick=rand; end for j=1:sizepop pick=pick-sumf(j); if pick<0 index=[index j]; break; %寻找落入的区间,此次转轮盘选中了染色体i,注意:在转sizepop次轮盘的过程中,有可能会重复选择某些染色体 end end end individuals=individuals(index,:); fitness=fitness(index); ret=individuals; test function flag=test(lenchrom,bound,code) % lenchrom input : 染色体长度 % bound input : 变量的取值范围 % code output: 染色体的编码值 flag=1; [n,m]=size(code); fori=1:n if code(i)
正在阅读:
遗传算法GA求解函数极值02-26
中国古镇艺术风采纵览 - 图文10-09
英语小报(卡通人物插画)02-12
六年级写人作文训练08-07
文印室岗位职责12-21
1-工程勘察设计取费标准200212-21
计算机图形学复习题及答案01-05
履约检查表01-08
小学课改阶段性成果简介02-11
高中政治必修四第二单元知识点01-30
- 计算机试题
- 【2012天津卷高考满分作文】鱼心人不知
- 教育心理学历年真题及答案--浙江教师资格考试
- 20180327-第六届“中金所杯”全国大学生金融知识大赛参考题库
- 洪林兴达煤矿2018年度水情水害预测预报
- 基本要道讲义
- 机电设备安装试运行异常现象分析与对策
- 《有机化学》复习资料-李月明
- 非常可乐非常MC2--非常可乐广告策划提案 - 图文
- 2011中考数学真题解析4 - 科学记数法(含答案)
- 企业人力资源管理师三级07- 09年真题及答案
- 基于单片机的光控自动窗帘控制系统设计说明书1 - 图文
- 20160802神华九江输煤皮带机安装方案001
- (共53套)新人教版一生物必修2(全册)教案汇总 word打印版
- 2014行政管理学总复习
- 中国银监会关于加强地方政府融资平台贷款风险监管的指导意见
- 民宿酒店核心竞争与研究
- 游园活动谜语大全2012
- 河南省天一大联考2016届高三英语5月阶段性测试试题(六)(A卷)
- 小型超市管理系统毕业论文详细设计4
- 极值
- 求解
- 遗传
- 算法
- 函数
- 2012亚太金融高峰论坛
- 财务管理的重要性
- 部编版二年级1-8单元知识点(41份)
- ERP系统运行管理办法(暂行,最新)-080610
- 中考语文最新总复习资料—拼音专题练习
- 高二学业水平测试生物试题模拟3
- 21 乡下人家四年级语文
- 水泥厂质检部分岗位安全操作规程、安全生产职责
- 上饶市最美公务员集体
- 高效初中英语阅读理解5
- 函数复习定义域,值域,解析式
- 安捷伦泵与比例阀的结构原理与常见故障 - 图文
- 小学生关于梦想的演讲稿
- 江苏省扬州旅游商贸学校2012年度工作汇报材料
- “十三五”重点项目-纺织品生产建设项目可行性研究报告 - 图文
- 高二生物上册实验专题训练21 - 图文
- 海鲜肠、海鲜软包装项目可行性研究报告
- 备战2017高考语文每日一练系列第六周第03组(含解析)
- 新行员培训心得:态度决定一切
- 垄断法律图书