请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册
查看: 7671|回复: 3

46改进的遗传算法-函数寻优

[复制链接]

1288

主题

1514

帖子

90

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22589
发表于 2017-3-16 22:54:09 | 显示全部楼层 |阅读模式
改进的遗传算法-函数寻优:
百度网盘链接:
链接:http://pan.baidu.com/s/1jIkQs8u

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1\

具体的代码如下:
  1. clc,clear,close all
  2. warning off
  3. tic
  4. popmin = [25]/100;  % Lb
  5. popmax =[100]/100;  % Ub
  6. pc = 0.75;  % 0-1之间
  7. pm = 0.25;   % 0-1之间
  8. nvar = 1;   % 1个未知数
  9. itermax = 100; % 迭代次数
  10. sizepop = 100; % 种群
  11. % 初始化种群
  12. for i=1:sizepop
  13.     pop(i,:) = code(popmin,popmax);    % 实数编码
  14.     fitness(i) = fun(pop(i,:));        % 目标函数值
  15. end
  16. [bestfitness,index] = min(fitness); % 极小值
  17. zbest = pop(index,:);        % 最佳个体
  18. fitnessgbest = fitness;      % 个体最优
  19. gbest = pop;                 % 最优种群
  20. fitnesszbest = bestfitness;  % 全局最优
  21. %% 迭代寻优
  22. for i=1:itermax
  23.     % 选择算子
  24.     pop = select(sizepop,pop,fitness,popmin,popmax);
  25.     % 交叉算子
  26.     pop = cross(sizepop,pc,pop,popmin,popmax);
  27.     % 变异
  28.     pop = mut(sizepop,pm,pop,popmin,popmax);
  29.    
  30.     for j=1:sizepop
  31.         fitness(j) = fun( pop(j,:) );   % 计算适应度值
  32.         if fitness(j)<fitnesszbest
  33.             fitnesszbest = fitness(j);
  34.             zbest = pop(j,:);
  35.         end
  36.     end
  37.     fitness_iter(i) = fitnesszbest;
  38. end
  39. toc
  40. disp(['最优解:',num2str(zbest*100)])
  41. disp(['最优解目标值:', num2str(fitnesszbest)] )
  42. figure,
  43. plot(fitness_iter,'ro-','linewidth',2)
复制代码
选择算子:
  1. function pop = select(sizepop,pop,fitness,popmin,popmax)
  2. [a, b] = sort(fitness,'descend');
  3. c = floor(sizepop/4);
  4. % 替换了最差的个体,保留了精英种群
  5. for i=1:c
  6.     pop(b(i),:) = popmin + rand.*(popmax-popmin);
  7. end
复制代码
交叉:
  1. function pop = cross(sizepop,pc,pop,popmin,popmax)
  2. for j=1:sizepop*2
  3.     if rand>pc
  4.         a = [0,0];
  5.         while min(a)==0
  6.             a = floor( rand(1,2)*sizepop );
  7.         end
  8.         k = rand;
  9.         pop1 =  pop(a(1),:) ;
  10.         pop2 =  pop(a(2),:) ;
  11.         pop12 = (1-k)*pop1+k*pop2;
  12.         pop21 = (1-k)*pop2+k*pop1;
  13.         
  14.         flag1 = test( pop12 ,popmin,popmax);
  15.         if flag1==1   % 不可行
  16.             pop(a(1),:) = pop12;
  17.         end
  18.         flag2 = test( pop21 ,popmin,popmax);
  19.         if flag2==1   % 不可行
  20.             pop(a(2),:) = pop21;
  21.         end
  22.         
  23.     end
  24. end
复制代码
变异:
  1. function pop = mut(sizepop,pm,pop,popmin,popmax)
  2. for j = 1:sizepop*2
  3.     if rand>pm
  4.         a=0;
  5.         while a==0
  6.             a = floor(rand*sizepop);
  7.         end
  8.         b = pop(a,:);
  9.         if rand>0.5
  10.             b = pop(a,:) + rand.* (popmax-pop(a,:));
  11.         else
  12.             b = pop(a,:) + rand.* (popmin-pop(a,:));
  13.         end
  14.         
  15.         flag2 = test( b,popmin,popmax );
  16.         if flag2==1   % 不可行
  17.             pop(a,:) = b;
  18.         end
  19.         
  20.     end
  21. end
复制代码
编码:
  1. function pop = code(popmin,popmax)
  2. flag =1;
  3. while flag==1
  4.     pop = popmin + rand.*(popmax-popmin);  % 实数编码
  5.     % 检验染色体的可行性
  6.     flag = test(pop,popmin,popmax);
  7. end
复制代码
染色体检验:
  1. function flag = test(pop,popmin,popmax)

  2. % 检验染色体的可行性
  3. % if pop(1)<popmin(1) || pop(1)>popmax(1) || pop(2)<popmin(2) || pop(2)>popmax(2)
  4. if pop<popmin || pop>popmax
  5.     flag = 1;  % 不可行
  6. else
  7.     flag = 0;  % 可行
  8. end
复制代码
目标函数:
  1. function y = fun(x1)
  2. x1 = x1*100;

  3. Q = 1000;
  4. fw = 0.6;
  5. Rg = 2;
  6. Qr = 38000;
  7. nL = 0.8;
  8. nb = 0.6;
  9. Rd = 1.5;
  10. T1 = 25;
  11. P1 = 0.15;
  12. L = 10000;
  13. d = 0.2;
  14. co = 4.2;
  15. cw = 2;
  16. % T2 = x1;
  17. % P2 = x2;
  18. % FrL = Rg*0.8/nL/Qr *( co*(1-fw) +cw*fw) *Q*(x1 - T1);
  19. % Fdf = Rd*(x2-P1)*Q*(1-fw)/3.6/nb;
  20. v = 6910.13-462.16382*x1+12.45893*x1^2-0.16682*x1^3+0.00111*x1^4-0.000002910778*x1^5;
  21. Hf = 0.0246*(Q*(1-fw))^1.75*(v^1.75)*L/(d^4.75);
  22. x2 = Hf/100 + 0.3;

  23. FrL = Rg*0.8/nL/Qr *( co*(1-fw) +cw*fw) *Q*(x1 - T1);
  24. Fdf = Rd*(x2-P1)*Q*(1-fw)/3.6/nb;
  25. y = FrL + Fdf;
复制代码









算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

8

帖子

38

金钱

新手上路

Rank: 1

积分
46
发表于 2018-3-8 17:04:48 | 显示全部楼层
好好学习,天天向上。
回复 支持 反对

使用道具 举报

0

主题

13

帖子

1

金钱

新手上路

Rank: 1

积分
14
发表于 2019-4-20 21:26:53 | 显示全部楼层
:)好好学习,天天向上
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

金钱

注册会员

Rank: 2

积分
92
发表于 2023-8-14 15:42:52 | 显示全部楼层

好好学习,天天向上
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-3-29 15:48 , Processed in 0.206430 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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