遗传算法示例

编程入门 行业动态 更新时间:2024-10-23 15:30:47

遗传算法<a href=https://www.elefans.com/category/jswz/34/1770116.html style=示例"/>

遗传算法示例

文章目录

  • 问题陈述
  • 模型简述
    • 布局方案评价模型
    • 优化模型
  • 遗传算法求解
    • 代码细节说明
    • 详细代码


问题陈述

现有一长为 20 20 20 米,宽为 15 15 15米,高为 3 3 3米的教室在距离地面 2.5 2.5 2.5米处均匀的安装了 8 8 8个点光源,现假设各个点光源及墙壁的横纵向之间均等距,且每个点光源光强为 1 1 1个单位,要求给出教室内距离地面 1 1 1米处任意一点的光照强度,并给出图像以及近似的函数表示。
假定教室面积、安装点光源的个数、点光源的光照强度以及对各个位置所需的最小光照强度已知,建立教室灯光布局方案的评价标准,并对之前的布局方案进行评价,并给出该评价下的优化方案和最优布局。
已知光强基本原理:点光源对目标点的光照强度与该光源到目标点的距离的平方成反比,与该光源的强度成正比。

模型简述

布局方案评价模型

我们对教室区域高度分别为1m、1.2m、1.5m的平面上将教室区域平均离散化为900个点并计算这2700个点的光照强度,则这2700个点大致反应了整个教室人活动范围内的的照明情况。首先,各样本点的光照强度应该大于光照强度最小值的要求,故我们计算不满足最小值要求的点的数量 n n n。其次,我们计算那三个高度面上的光照强度数值的标准差 s 1 , s 2 , s 3 s1,s2,s3 s1,s2,s3并求和为 s s s,依此来反映光照强度的波动性。最后将这两个评价指标做加权得到评价综合评分 O b j v = t ∗ s + ( 1 − t ) ∗ n Objv=t*s+(1-t)*n Objv=t∗s+(1−t)∗n,其中 t t t为加权系数。
设 x i , i = 1... n x_i,i=1...n xi​,i=1...n为灯的三维坐标值,其中 n n n为灯的数目, p p p为各灯的照明强度, p 1 , p 2 , p 3 p1,p2,p3 p1,p2,p3为三个高度面上的待测点的光照强度数值矩阵,则我们由灯的坐标值及灯的照明强度可算出 p 1 , p 2 , p 3 p1,p2,p3 p1,p2,p3。

 function [p1,p2,p3,s,sumn,ObjV]=measure(x,p,d1,d2)
%输入灯的坐标值,给出待测观测点的光照强度数值
%x 灯的坐标值,n*3的矩阵,(长的方向,宽的方向,高的方向)
%p 灯的照明强度
%d1 教室长
%d2 教室宽
%p1,p2,p3 待测点的光照强度数值矩阵%均匀分布时 ObjV=2.7005e3%由于遗传算法的要求,这里输入的x应该变成1*3n的输入,我们把这个向量reshape成n*3的矩阵
n=length(p); %灯的数目
x=reshape(x,3,n);
x=x';dd1=linspace(0,d1,30);
dd2=linspace(0,d2,30);a=1; %光强基本原理的参数
minp=0.15; %最小光照强度限制
p1=zeros(30,30); %三个面上的光照强度矩阵
p2=zeros(30,30);
p3=zeros(30,30);for i=1:30for j=1:30for k=1:n %累加n个灯的作用           p1(i,j)=p1(i,j)+a*p(k)/((x(k,1)-dd1(i))^2+(x(k,2)-dd2(j))^2+(x(k,3)-0.9)^2); %0.9m高度处的光照强度矩阵  endend
endfor i=1:30for j=1:30for k=1:n %累加n个灯的作用           p2(i,j)=p2(i,j)+a*p(k)/((x(k,1)-dd1(i))^2+(x(k,2)-dd2(j))^2+(x(k,3)-1.2)^2); %1.2m高度处的光照强度矩阵  endend
endfor i=1:30for j=1:30for k=1:n %累加n个灯的作用           p3(i,j)=p3(i,j)+a*p(k)/((x(k,1)-dd1(i))^2+(x(k,2)-dd2(j))^2+(x(k,3)-1.5)^2); %1.5m高度处的光照强度矩阵  endend
end%下面求矩阵的标准差
s1=std2(p1);
s2=std2(p2);
s3=std2(p3);
s=[s1,s2,s3];
n1=length(find(p1<minp));
n2=length(find(p2<minp));
n3=length(find(p3<minp));
nn=[n1,n2,n3];
sumn=sum(nn);
ObjV=sum(nn)+1000*sum(s);%画图
% mesh(dd1,dd2,p1);
% figure
% mesh(dd1,dd2,p2);
% figure
% mesh(dd1,dd2,p3);

优化模型

我们用遗传算法的思想来设计优化方案,优化的主要目标是使教室的光照强度满足光照强度的最低值的要求并且使光照强度尽可能均匀。我们根据上面建立的布局方案的评价模型写出优化函数: O b j v = m i n N + s 1 + s 2 + s 3 Objv=min N+s1+s2+s3 Objv=minN+s1+s2+s3。布局方案的约束条件应为灯的位置坐标限制在教室区域内并且高度不妨碍人的自由活动,所以我将灯的高度的下限设为2米,我们写出约束条件: 0 < x ( k , 1 ) < d 1 , 0 < x ( k , 2 ) < d 2 , 2 < x ( k , 3 ) < h 0<x(k,1)<d1,0<x(k,2)<d2,2<x(k,3)<h 0<x(k,1)<d1,0<x(k,2)<d2,2<x(k,3)<h,其中 d 1 , d 2 , h d1,d2,h d1,d2,h分别是教室的长宽高。

遗传算法求解

代码细节说明

ranking函数会根据具体的问题分配适应度FitnV。若求最小值时用**"+"号**,

FitnV=ranking(ObjV)

若求最大值则要加__"-"号__

FitnV=-ranking(ObjV)

。遗产算法的关键是编写优化评价函数(我们上面的measure就是灯光布局的评价函数),然后套用遗传算法代码就行,用遗传算法时要把遗传算法工具箱放到工作路径中。注意ranking 只能对列操作,不能对行操作,下面的代码演示了ranking的使用。

警告: 函数 system 与某个 MATLAB 内置函数同名。建议您重命名该函数以避免潜在的名称冲突。 
>> x=[1 2 3 4]
x =1     2     3     4
>> t=ranking(x)
t =NaN
>> x=[1 ;2; 3; 4]
x =1234
>> t=ranking(x)
t =2.00001.33330.66670

详细代码

下面的代码分别是遗传算法代码及其操作演示。关于遗传算法中用到的其他的函数的作用及注意事项,代码中的注释已经写的很详细了。

function [XY,Z,unit,ObjV]=genetic1(lb,ub)
%遗传算法程序,gatbx是遗传算法工具箱,放在当前工作目录下
%lb:每个变量的下界
%ub:每个变量的上界NVAR=24;%变量个数(根据具体问题一般要改变)
NIND=40;%种群大小
MAXGEN=100;%最大遗传代数
LIND=10;%个体长度(变量的二进制位数)
GGAP=0.9;%代沟trace=zeros(2,MAXGEN);%寻优结果的初始值
%建立区域描述器
FieldD=[LIND*ones(1,NVAR);%NVAR个LIND
lb;%lb:每个变量的下界(x,y的下界)[0 0 1.5](根据具体问题一般要改变)(在这题是x、y、z三个坐标值的范围)
ub;%[20 15 3] 
ones(1,NVAR);zeros(1,NVAR);ones(1,NVAR);ones(1,NVAR) %NVAR个1,NVAR个0,NVAR个1,NVAR个1
];
Chrom=crtbp(NIND,LIND*NVAR);%创建一个初始种群,二进制编码
unit=bs2rv(Chrom,FieldD);%二进制转为十进制(初始种群),它的每一行均为一个个体p=ones(1,8);d1=20;d2=15;
ObjV=zeros(NIND,1);
for i=1:NIND[~,~,~,~,~,ObjV(i)]=measure(unit(i,:),p,d1,d2);%计算初始目标函数值(这里measure函数中是根据每个个体计算的,所以我们对每个个体计算)
endfor gen=1:MAXGENFitnV=ranking(ObjV);%分配适应度,求最小值故用ObjV,若求最大值则要加负号SelCh=select('sus',Chrom,FitnV,GGAP);%选择sus,随机遍历抽样SelCh=recombin('xovsp',SelCh,0.7);%交叉(重组)概率0.7,xovsp:单点交叉SelCh=mut(SelCh);%变异unit=bs2rv(SelCh,FieldD);%二进制十进制转换(子代个体)ObjVSel=zeros(NIND*GGAP,1); %目标函数值(子代个体)for i=1:NIND*GGAP %原来40个个体到这里变成了36个[~,~,~,~,~,ObjVSel(i)]=measure(unit(i,:),p,d1,d2);%计算变异后的目标函数值(和上面的Objv同理)(这里measure函数中是根据每个个体计算的,所以我们对每个个体计算)end[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入子代的新种群[Y(gen),I(gen)]=max(ObjV);%Y为最优个体下的目标函数值,I为最优个体在种群的下标trace(1,gen)=max(ObjV);%遗传算法性能追踪trace(2,gen)=sum(ObjV)/length(ObjV);if gen==MAXGEN/2        %迭代数为50时画出目标函数分布图figureplot(ObjV);hold on;plot(ObjV,'b*');grid;end
end
unit=bs2rv(Chrom,FieldD);
figure
plot(trace(1,1:gen),'b--o')
hold on;
plot(trace(2,1:gen),'r--o')
grid on
legend('最大值','种群平均值')
title('遗传算法查找最优光源位置性能图');
xlabel('进化代数')
ylabel('优化值')
XY=unit(I(gen),:);%选择一个个体,给出一个最优解
Z=max(Y);
end

操作演示

lb1=[0 0 2];
lb=[lb1,lb1,lb1,lb1,lb1,lb1,lb1,lb1];
ub1=[20 15 3] ;
ub=[ub1,ub1,ub1,ub1,ub1,ub1,ub1,ub1];
[XY,Z,unit,ObjV1]=genetic1(lb,ub);

更多推荐

遗传算法示例

本文发布于:2024-03-14 19:50:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1737203.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:示例   算法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!