⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_ga.m

📁 遗传算法的Matlab程序
💻 M
字号:
%P199_8  GA
clc;
clear;
pop_size=100;%种群大小
m=42;%每个个体的基因数目
m1=21;%每个个体中x1占的位数
m2=21;%每个个体中x2占的位数
%产生初始种群
for j=1:pop_size
    for i=1:m
        num=randperm(2)-1;
        str_num(j,i)=dec2bin(num(1));%随机产生的二进制数,pop_size个,每个m位        
    end
 
end
delta=10;
cc=0;%迭代次数
while delta>0.01%for qq=1:500%大循环
for j=1:pop_size
for i=1:m
    if i<=m1
            str_num1(j,i)=str_num(j,i);
        else
            str_num2(j,i)=str_num(j,i);
        end
    end
end
f1=bin2dec(str_num1);%x1的适应值
f2=bin2dec(str_num2);%x2的适应值
x1=-100+f1*(100-(-100))/(2^m1-1);%-3.0+f1*(12.1-(-3.0))/(2^m1-1);
x2=-100+f2*(100-(-100))/(2^m2-1);%4.1+f2*(5.8-4.1)/(2^m2-1);
f=fun_value(x1,x2);%适应值
delta=abs(max(f)-1);
%选择
  %1.各染色体总和
  f_sum=sum(f);
  %2.选择概率
  p=f/f_sum;
  %3.累积概率
  p_sum1=0;
  for a=1:pop_size
      p_sum1=p_sum1+p(a);
      p_sum(a)=p_sum1;
  end
  %4.产生随机数进行染色体选择
  r=rand(1,pop_size);
  for k=1:pop_size
      for l=1:pop_size
          if r(k)<p_sum(l)
              str_num01(l)=p_sum(l);
          else
              str_num01(l)=1;
          end
      end
      [sv,ss]=min(str_num01);
      serials(k)=ss;%serials--要选择的染色体序号
  end
  for h=1:pop_size
      v(h,:)=str_num(serials(h),:);%v--交换后的染色体序列
  end

%交叉
t=zeros(1,pop_size);
rr=rand(1,pop_size);
kkk=0;
for kk=1:pop_size
    if rr(kk)<0.25
        t(kk)=kk;%参与交叉的个体号
        kkk=kkk+1;
    end
end
if kkk>=2
[tv1,ts1]=max(t);%ts1,ts2参与交叉
t(ts1)=0;
[tv2,ts2]=max(t);
else
    ts1=1;
    ts2=1;
end
tsp01=randperm(m-1);
tsp=tsp01(1);%交叉位的选择
vstar1(ts1,:)=v(ts1,:);
vstar2(ts2,:)=v(ts2,:);
for ii=1:m
    for jj=1:tsp
        v1(jj)=vstar1(ts1,m+1-jj);
        v2(jj)=vstar2(ts2,m+1-jj);
        v(ts1,m+1-jj)=v2(jj);
        v(ts2,m+1-jj)=v1(jj);
    end
end
%变异
k=1:m*pop_size;%种群中总的基因数目
pm=0.01;%变异率
c=pm*k(end);%每代中平均变异的基因个数
if c~=fix(c)
    c=fix(c)+1;%取变异基因个数
else
    c=fix(c);
end
d=randperm(k(end));
for i=1:c
    d1(i)=d(i);%取出变异的位址
    d2(i)=fix(d1(i)/m)+1;%染色体号
    
    d3(i)=mod(d1(i),m);%染色体位数
    if d3(i)==0
        d3(i)=m;
        d2(i)=d2(i)-1;
    end
end

for hh=1:length(d1)
    if v(d2(hh),d3(hh))=='1'
        v(d2(hh),d3(hh))='0';
    else
        v(d2(hh),d3(hh))='1';
    end
end
str_num=v;
cc=cc+1;
end%大循环
fprintf('迭代次数:')
cc

fprintf('最优值:')
[valuef,tif]=max(f);
valuef
fprintf('最优解:')
v(tif,:)
x1(tif)
x2(tif)
%ran_num=randperm(num);
%b=dec2bin(a)
%for i=1:length(b)
 %   b(2)='1';
    %end
  %  b
%c=bin2dec(b)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -