|
function [f,x,endpop]=myga(num,bounds,N,CP,P)
%[f,x]=ga(num,bounds,fun,N,CP,P)
%[f,x]=myga([],bounds,[],[],[])
%该遗传算法适用于:
% 目标函数为求最大值,且解非负整数解
%bounds 边界约束
%Myfun 为目标函数
%num 初始种群数
%N 最大迭代次数
%CP 交叉概率
%P 突变概率
%f 目标最优解
%x 最优解向量
% zxh21st@163.com
m=nargin;
if m<5
disp('-_- 错误!')
disp('>> 输入变量太少')
disp('>> 按回车键查看帮助')
pause
help ga
f='-_- ';
x='没有规矩不成方圆';
break;
end
if isempty(CP)
CP=0.25;
end
if isempty(P)
P=0.01;
end
if isempty(N)
N=100;
end
if any(bounds(:,1))<0
disp('-_- 错误!')
disp('>> 按回车键查看帮助')
pause
help ga
f='-_- ';
x='没有规矩不成方圆';
break;
end
if isempty(num)
num=100;
end
pop=INTinti(num,bounds);
fmax=pop(:,end);
endpop=pop;
n=size(endpop,2);
count=0;x=[];f=zeros(1,num);
while(count<N)
pop=mutation(endpop);
[cpop ,len,v]=cross(pop,bounds,CP);
[pops]=changes(cpop,bounds,len,P);
for i=1:num
sol=pops(i,;
[f(i)]=Myfun(sol);
%惩罚策略
for jj=1:length(sol)
if sol(jj)<BOUNDS(JJ,1)
f(i)=-inf;
end
if sol(jj)>bounds(jj,2)
f(i)=-inf;
end
end
if fmax(i)<F(I)
fmax(i)=f(i);
endpop(i,1:end-1)=pops(i,;
end
end
endpop(:,end)=fmax(;
count=count+1;
% [f,ii]=max(fmax);
% x=endpop(ii,1:end-1);
end
[f,ii]=max(fmax);
x=endpop(ii,1:end-1);
--------------------------------------------------------------------------------------------------------------------
function [pop]=INTinti(num,bounds)
%[pop]=INTinti(num,bounds)
%inti 编码函数
%num 种群数
%bounds 边界约束
% zxh21st@163.com
n=size(bounds,1);
L=bounds(:,2)-bounds(:,1);
p=rand(num,n);
for i=1:num
p(i,:)=round(p(i,:).*L');
pop(i,:)= p(i,:)+bounds(:,1)';
f(i)=myfun(pop(i,:));
end
pop=[pop f'];
-------------------------------------------------------------------------------------------------------------
function [child]=mutation(pop)
%复制函数,采取小盘轮转法
%[child]=mutation(pop)
%mutation 编码
%pop 初始种群
%child 返回复制后的种群
%pop(:,end) 适值度
% zxh21st@163.com
[n,m]=size(pop);
f=pop(:,end);
value=sum(f);
for i=1:n
p(i)=f(i)/value;
q(i)=sum(p(1:i));
end
t=rand(1,n);
for j=1:n
for k=1:n
if t(j)<Q(K)
v(j)=k;
break
end
end
end
i=1:n;
child(i,:)=pop(v(i),:);
----------------------------------------------------------------------------------------------------------------------
function [cpop ,len,v]=cross(child,bounds,CP)
%交叉函数,采取点交叉
%[newpop ,len]=cross(child,bounds,CP)
%child 复制后的种群
%bounds 边界约束
%CP 交叉概率
%newpop 交叉后的新种群
%len 每个变量的编码长度
% 如len返回为[4 3 3];表示有三个变量,第一个变量的二进制编码长度为4,依次类推
% zxh21st@163.com
if isempty(CP)
CP=0.25;
end
[n ,m]=size(child);
B=[];len=[];t=[];
mychild=child(:,1:end-1);
v=[];
p=rand(1,n);
k=1;
for i=1:n
if p(i)<CP
v(k)=i;
k=k+1;
end
end
if (rem(k,2)==0)
temp=v(k-1);
while (temp==v(k-1))
temp=round(rand*(n-1))+1;
end
v(k)=temp;
k=k+1;
end
if isempty(v)
[B(i,:),len]=B2F(mychild(1,:),bounds);
B=[];
else
for i=1:k-1
[B(i,:),len]=B2F(mychild(v(i),:),bounds);
end
for i=1:2:k-2
p2=round(rand*sum(len)-1)+1;
t=zeros(1,p2);
t(i,:)=B(i,1:p2);
B(i,1:p2)=B(i+1,1:p2);
B(i+1,1:p2)=t(i,:);
end
for i=1:k-1
mychild(v(i),:)=F2B(B(i,:),bounds,len);
end
end
cpop=mychild;
----------------------------------------------------------------------------------------------------------------------
function [pops]=changes(cpop,bounds,len,p)
%基因突变函数
%function [pops]=changes(pop,bounds,len,p)
%pop 种群数目
%bounds 边界约束
%len 每个变量的编码长度
% 如len为[4 3 3];表示有三个变量,第一个变量的二进制编码长度为4,依次类推
%p 突变概率
%pops 返回突变后的基因
%p1 基因突变数目
% zxh21st@163.com
if isempty(p)
p=0.01;
end
[n,m]=size(cpop);
pop=cpop;
p1=round(sum(len)*n*p);
k=0;q=[];v=[];
while(k<1)
k=k+1;
q(k)=round(rand*(sum(len)*n-1))+1;
for i=1:k-1
if q(k)==q(i)
q(k)=[];
k=k-1;
end
end
end
for i=1:n
[B(i,:),len]=B2F(pop(i,:),bounds);
end
v=reshape(B,1,n*sum(len));
for i=1:p1
if v(q(i))==0
v(q(i))=1;
else
v(q(i))=0;
end
end
v=reshape(v,n,sum(len));
for i=1:n
pop(i,:)=F2B(v(i,:),bounds,len);
end
pops=pop
cpop
-----------------------------------------------------------------------------------------------------------------
function [B,len,v]=B2F(sol,bounds)
%[B,len]=B2F(x,bounds) 二进制编码函数
%x 编码向量如x=[6 8 9];
%bounds 边界约束ru如bounds=[4 8 ;3 11;6 12;];
%B 二进制编码串
%编码长度L由bounds(2)-bounds(1)决定
%以上为例:
% 编码长度向量L=[4 8 6]编成二进制L=[11 1000 110],则len=[2 4 3]
% 计算B=x-bound(1)=[2 5 3]编成二进制 B=[10 0101 011]
% zxh21st@163.com
n=length(sol);
len=[];B=[];v=[];
L=bounds(:,2)-bounds(:,1);
L=de2bi(L);
for i=1:n
len(i)=length(L(i,:));
end
v=sol-bounds(:,1)';
for i=1:n
B=[B de2bi(v(i),len(i))];
end
----------------------------------------------------------------------------------------------------------------
n=length(x);
m=length(len);
q=[];
for i=1:m
q(i)=sum(len(1:i));
end
q=[0 q];
for j=1:m
pops(j)=bounds(j,1);
p=[];
p=x(q(j)+1:q(j+1));
L1=q(j+1)-q(j);
for k=11
pops(j)=pops(j)+p(k)*2^(k-1);
end
end
----------------------------------------------------------------------------------------------------
function b = de2bi(d, n, p)
%function b = de2bi(d, n, p)
%DE2BI 转换10进制数为二进制数。
% B = DE2BI(D) 转换正整数向量D成二进制矩阵B。
% 二进制矩阵B的每一行表示十进制向量D中相应的数。
% B = DE2BI(D, N) 转换正整数向量D成二进制矩阵B,
% 但指定B的列数为N。
% B = DE2BI(D, N, P) 转换正整数向量D成p进制矩阵B。
% p进制矩阵B的每一行表示十进制向量D中相应的数。
% zxh21st@163.com
d = d(:);len_d = length(d);
if min(d) < 0, error('Cannot convert a negative number');
elseif ~isempty(find(d==inf)),
error('Input must not be Inf.');
elseif find(d ~= floor(d)),
error('Input must be an integer.');
end;
if nargin < 2,
tmp = max(d); b1 = [];
while tmp > 0
b1 = [b1 rem(tmp, 2)];tmp = floor(tmp/2);
end;
n = length(b1);
end;
if nargin < 3,p = 2;end;
b = zeros(len_d, n);
for i = 1 : len_d
j = 1;tmp = d(i);
while (j <= n) & (tmp > 0)
b(i, j) = rem(tmp, p);tmp = floor(tmp/p);
j = j + 1;
end;
end;
--------------------------------------------------------------------------------------------------------------
function [f]=myfun(sol)
% -_-
% 目标函数自己写
% 作者:[B]CUMT[/B]机自01-2班曾新海
% QQ:176466480
% zxh21st@163.com
------------------------------------------------------------------------------------------------------
[此贴子已经被作者于2004-6-4 10:18:52编辑过]
|
|