找回密码
 注册
Simdroid-非首页
查看: 424|回复: 2

【原创】非线性整数规划的遗传算法Matlab程序(附图)

[复制链接]
发表于 2007-3-17 19:59:57 | 显示全部楼层 |阅读模式 来自 河南郑州
GreenSim团队的博客开通了,更多原创程序请访问我们的博客
http://blog.sina.com.cn/greensim

    通常,非线性整数规划是一个具有指数复杂度的NP问题,如果约束较为复杂,Matlab优化工具箱和一些优化软件比如lingo等,常常无法应用,即使能应用也不能给出一个较为令人满意的解。这时就需要针对问题设计专门的优化算法。下面举一个遗传算法应用于非线性整数规划的编程实例,供大家参考!

    模型的形式和适应度函数定义见后面

    这是一个具有200个01决策变量的多目标非线性整数规划,编写优化的目标函数如下,其中将多目标转化为单目标采用简单的加权处理。
  1. function Fitness=FITNESS(x,FARM,e,q,w)
  2. %% 适应度函数
  3. % 输入参数列表
  4. % x 决策变量构成的4×50的0-1矩阵
  5. % FARM 细胞结构存储的当前种群,它包含了个体x
  6. % e 4×50的系数矩阵
  7. % q 4×50的系数矩阵
  8. % w 1×50的系数矩阵
  9. %%
  10. gamma=0.98;
  11. N=length(FARM);%种群规模
  12. F1=zeros(1,N);
  13. F2=zeros(1,N);
  14. for i=1:N
  15. xx=FARM{i};
  16. ppp=(1-xx)+(1-q).*xx;
  17. F1(i)=sum(w.*prod(ppp));
  18. F2(i)=sum(sum(e.*xx));
  19. end
  20. ppp=(1-x)+(1-q).*x;
  21. f1=sum(w.*prod(ppp));
  22. f2=sum(sum(e.*x));
  23. Fitness=gamma*sum(min([sign(f1-F1);zeros(1,N)]))+(1-gamma)*sum(min([sign(f2-F2);zeros(1,N)]));

  24.     针对问题设计的遗传算法如下,其中对模型约束的处理是重点考虑的地方
  25. function [Xp,LC1,LC2,LC3,LC4]=MYGA(M,N,Pm)
  26. %% 求解01整数规划的遗传算法
  27. %% 输入参数列表
  28. % M 遗传进化迭代次数
  29. % N 种群规模
  30. % Pm 变异概率
  31. %% 输出参数列表
  32. % Xp 最优个体
  33. % LC1 子目标1的收敛曲线
  34. % LC2 子目标2的收敛曲线
  35. % LC3 平均适应度函数的收敛曲线
  36. % LC4 最优适应度函数的收敛曲线
  37. %% 参考调用格式[Xp,LC1,LC2,LC3,LC4]=MYGA(50,40,0.3)

  38. %% 第一步:载入数据和变量初始化
  39. load eqw;%载入三个系数矩阵e,q,w
  40. %输出变量初始化
  41. Xp=zeros(4,50);
  42. LC1=zeros(1,M);
  43. LC2=zeros(1,M);
  44. LC3=zeros(1,M);
  45. LC4=zeros(1,M);
  46. Best=inf;

  47. %% 第二步:随机产生初始种群
  48. farm=cell(1,N);%用于存储种群的细胞结构
  49. k=0;
  50. while k %以下是一个合法个体的产生过程
  51. x=zeros(4,50);%x每一列的1的个数随机决定
  52. for i=1:50
  53. R=rand;
  54. Col=zeros(4,1);
  55. if R<0.7
  56. RP=randperm(4);%1的位置也是随机的
  57. Col(RP(1))=1;
  58. elseif R>0.9
  59. RP=randperm(4);
  60. Col(RP(1:2))=1;
  61. else
  62. RP=randperm(4);
  63. Col(RP(1:3))=1;
  64. end
  65. x(:,i)=Col;
  66. end
  67. %下面是检查行和是否满足约束的过程,对于不满足约束的予以抛弃
  68. Temp1=sum(x,2);
  69. Temp2=find(Temp1>20);
  70. if length(Temp2)==0
  71. k=k+1;
  72. farm{k}=x;
  73. end
  74. end

  75. %% 以下是进化迭代过程
  76. counter=0;%设置迭代计数器
  77. while counter

  78. %% 第三步:交叉
  79. %交叉采用双亲双子单点交叉
  80. newfarm=cell(1,2*N);%用于存储子代的细胞结构
  81. Ser=randperm(N);%两两随机配对的配对表
  82. A=farm{Ser(1)};%取出父代A
  83. B=farm{Ser(2)};%取出父代B
  84. P0=unidrnd(49);%随机选择交叉点
  85. a=[A(:,1:P0),B(:,(P0+1):end)];%产生子代a
  86. b=[B(:,1:P0),A(:,(P0+1):end)];%产生子代b
  87. newfarm{2*N-1}=a;%加入子代种群
  88. newfarm{2*N}=b;
  89. %以下循环是重复上述过程
  90. for i=1:(N-1)
  91. A=farm{Ser(i)};
  92. B=farm{Ser(i+1)};
  93. P0=unidrnd(49);
  94. a=[A(:,1:P0),B(:,(P0+1):end)];
  95. b=[B(:,1:P0),A(:,(P0+1):end)];
  96. newfarm{2*i-1}=a;
  97. newfarm{2*i}=b;
  98. end
  99. FARM=[farm,newfarm];%新旧种群合并

  100. %% 第四步:选择复制
  101. FLAG=ones(1,3*N);%标志向量,对是否满足约束进行标记
  102. %以下过程是检测新个体是否满足约束
  103. for i=1:(3*N)
  104. x=FARM{i};
  105. sum1=sum(x,1);
  106. sum2=sum(x,2);
  107. flag1=find(sum1==0);
  108. flag2=find(sum1==4);
  109. flag3=find(sum2>20);
  110. if length(flag1)+length(flag2)+length(flag3)>0
  111. FLAG(i)=0;%如果不满足约束,用0加以标记
  112. end
  113. end
  114. NN=length(find(FLAG)==1);%满足约束的个体数目,它一定大于等于N
  115. NEWFARM=cell(1,NN);
  116. %以下过程是剔除不满主约束的个体
  117. kk=0;
  118. for i=1:(3*N)
  119. if FLAG(i)==1
  120. kk=kk+1;
  121. NEWFARM{kk}=FARM{i};
  122. end
  123. end
  124. %以下过程是计算并存储当前种群每个个体的适应值
  125. SYZ=zeros(1,NN);
  126. syz=zeros(1,N);
  127. for i=1:NN
  128. x=NEWFARM{i};
  129. SYZ(i)=FITNESS2(x,NEWFARM,e,q,w);%调用适应值子函数
  130. end
  131. k=0;
  132. %下面是选择复制,选择较优的N个个体复制到下一代
  133. while k minSYZ=min(SYZ);
  134. posSYZ=find(SYZ==minSYZ);
  135. POS=posSYZ(1);
  136. k=k+1;
  137. farm{k}=NEWFARM{POS};
  138. syz(k)=SYZ(POS);
  139. SYZ(POS)=inf;
  140. end
  141. %记录和更新,更新最优个体,记录收敛曲线的数据
  142. minsyz=min(syz);
  143. meansyz=mean(syz);
  144. pos=find(syz==minsyz);
  145. LC3(counter+1)=meansyz;
  146. if minsyz Best=minsyz;
  147. Xp=farm{pos(1)};
  148. end
  149. LC4(counter+1)=Best;
  150. ppp=(1-Xp)+(1-q).*Xp;
  151. LC1(counter+1)=sum(w.*prod(ppp));
  152. LC2(counter+1)=sum(sum(e.*Xp));

  153. %% 第五步:变异
  154. for i=1:N
  155. if Pm>rand%是否变异由变异概率Pm控制
  156. AA=farm{i};%取出一个个体
  157. POS=unidrnd(50);%随机选择变异位
  158. R=rand;
  159. Col=zeros(4,1);
  160. if R<0.7
  161. RP=randperm(4);
  162. Col(RP(1))=1;
  163. elseif R>0.9
  164. RP=randperm(4);
  165. Col(RP(1:2))=1;
  166. else
  167. RP=randperm(4);
  168. Col(RP(1:3))=1;
  169. end
  170. %下面是判断变异产生的新个体是否满足约束,如果不满足,此次变异无效
  171. AA(:,POS)=Col;
  172. Temp1=sum(AA,2);
  173. Temp2=find(Temp1>20);
  174. if length(Temp2)==0
  175. farm{i}=AA;
  176. end
  177. end
  178. end

  179. counter=counter+1
  180. end

  181. %第七步:绘收敛曲线图
  182. figure(1);
  183. plot(LC1);
  184. xlabel('迭代次数');
  185. ylabel('子目标1的值');
  186. title('子目标1的收敛曲线');
  187. figure(2);
  188. plot(LC2);
  189. xlabel('迭代次数');
  190. ylabel('子目标2的值');
  191. title('子目标2的收敛曲线');
  192. figure(3);
  193. plot(LC3);
  194. xlabel('迭代次数');
  195. ylabel('适应度函数的平均值');
  196. title('平均适应度函数的收敛曲线');
  197. figure(4);
  198. plot(LC4);
  199. xlabel('迭代次数');
  200. ylabel('适应度函数的最优值');
  201. title('最优适应度函数的收敛曲线');
复制代码
--------------------------------------------------------------------------------
GreenSim团队简介

——更多原创程序,请访问GreenSim团队的主页→http://blog.sina.com.cn/greensim

    GreenSim团队长期从事建模仿真、算法设计、代写程序等业务,为您提供实验、课题、论文、项目等方面的仿真服务。
    GreenSim团队擅长的学科领域主要有
智能算法】遗传算法、模拟退火、神经网络、蚁群算法、免疫优化、支持向量机、拟物拟人
运筹优化】数学建模、数值优化算法、大规模/非线性问题、组合优化、NP完全问题
信息与通信】无线通信、信号处理、计算机网络
其它学科】任何问题,只要能归结为数学问题或者算法仿真,我们都有实力和信心解决
    GreenSim团队的联系方式:
QQ: 330264704,535115369  Email:
greensim@163.com(来 信 必 复)

[ 本帖最后由 aiwa 于 2007-3-18 13:39 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2008-4-19 17:05:29 | 显示全部楼层 来自 山西太原
Simdroid开发平台
while k和while counter是什么意思?如何跳出循环?
回复 不支持

使用道具 举报

发表于 2008-5-26 22:43:48 | 显示全部楼层 来自 浙江杭州
非常感谢lz分享
受教了哈:)

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 11:16 , Processed in 0.044126 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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