📄 gamax.asv
字号:
%利用遗传算法求解函数极小值,用于二进制编码
%参数说明:
%obj--要求解的函数
% 调用格式: obj(x)
%m--群体规模
%n--编码长度
%coding--生成初始群体函数
% 调用格式: coding(m,n), m,n为整数
% 返回值: m×n的0-1矩阵, 表示m个个体, 每个个体编码长度为n
%uncoding--解码函数, 将二进制转换为十进制
% 调用格式: uncoding(chrom,a,b), chrom为0-1矩阵, 表示二进制群体, a, b分别为搜索空间的上下界
% 返回值: 一列向量, 表示实值群体
%select--选择函数
% 调用格式: select(fitness,n), fitness为一列向量, 表示适应度值, n为选择个数
% 返回值: n×1的整数向量, 表示被选择个体的编号
%cross--交叉函数
% 调用格式: cross(chrom,pc), chrom为0-1矩阵, 表示二进制群体, pc为交叉概率
% 返回值: 0-1矩阵, 表示交叉后的新的群体
%mutation--变异函数
% 调用格式: mutation(chrom,pc), chrom为0-1矩阵, 表示二进制群体, pm为变异概率
% 返回值: 0-1矩阵, 表示变异后的新的群体
%pc--交叉概率
%pm--变异概率
%a, b--搜索空间[a,b]
%gn--迭代次数
%graph--是否要作图
%floor--取整函数
%feval--求值函数,调用格式: feval(函数名,参数表)
function mx=GaMax(Obj,m,n,coding,uncoding,select,cross,mutation,pc,pm,a,b,c,d,gn,graph)
chrom=feval(coding,m,n); %生成初始群体,x1和x2各用5位二进制数编码
for t=1:gn
x1=feval(uncoding,chrom(:,1:floor(n/2)),a,b);%解码
x2=feval(uncoding,chrom(:,1+floor(n/2):n),c,d);%解码
y=feval(Obj,x1,x2);%计算适应度,适应度越大越好
[my,i]=max(y);%取出最大值赋给my,同时取得位置i
mx=[x1(i),x2(i)];% 最优解,求第i个位置的x1,x2的值
index=feval(select,y,m);%选择
chrom=chrom(index,:);%根据index位置取部分个体构成新群体
chrom=feval(cross,chrom,pc); %交叉
chrom=feval(mutation,chrom,pm);%变异
end
if graph
[X,Y] = meshgrid(a:0.0499:b,c:0.0499:d);
Z = feval(Obj,X,Y);
mesh(X,Y,Z,'EdgeColor','black')
hold on
plot3(mx(1),mx(2),feval(Obj,mx(1),mx(2)),'o')
hold off
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -