数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 10431|回复: 10

-_- 本人编的“遗传算法”  !见笑

[复制链接]
发表于 2003-12-25 03:47:03 | 显示全部楼层 |阅读模式
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)&gt;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) &lt; 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 &lt; 2,
   tmp = max(d); b1 = [];
   while tmp &gt; 0
      b1 = [b1 rem(tmp, 2)];tmp = floor(tmp/2);
   end;
   n = length(b1);
end;
if nargin &lt; 3,p = 2;end;
b = zeros(len_d, n);
for i = 1 : len_d
   j = 1;tmp = d(i);
   while (j &lt;= n) &amp; (tmp &gt; 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编辑过]

 楼主| 发表于 2003-12-25 03:50:09 | 显示全部楼层
请各位多多指教!
[此贴子已经被作者于2004-6-4 10:21:36编辑过]

发表于 2003-12-25 20:11:38 | 显示全部楼层
二个字,
弓虽!
你有没有拿它检验过,可曾得到比较好的结果?
 楼主| 发表于 2003-12-27 02:23:10 | 显示全部楼层

re:

我已经验证过了,对于具体问题要修改相应参数可达到更优。
对于有约束的问题,在目标函数中构成罚函数。




[此贴子已经被作者于2003-12-26 21:46:42编辑过]

发表于 2003-12-27 03:41:12 | 显示全部楼层
人家说你强,你怎么能这样说人家呢??
 楼主| 发表于 2003-12-27 05:41:58 | 显示全部楼层

抱歉

抱歉
[此贴子已经被作者于2004-6-4 10:18:31编辑过]

发表于 2003-12-28 23:16:00 | 显示全部楼层
看不懂
发表于 2003-12-28 23:49:33 | 显示全部楼层
好利害,建议加为精华。
发表于 2003-12-29 20:56:45 | 显示全部楼层
支持!
发表于 2004-1-7 05:39:23 | 显示全部楼层
楼主:
     怎么用?????
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-5-16 21:46 , Processed in 0.058270 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表