• m基于遗传优化的复杂工序调度matlab仿真,输出甘特图和优化收敛图


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB核心程序

    4.完整MATLAB


    1.算法描述

            遗传算法 (Genetic Algorithm,GA) 是一种基于规律进化的随机优化搜索算法,该算法最早是由Holland在1975年提出的。遗传算法的主要优势是通过对目标对象进行优化操作,并通过基于概率的搜索方法,获得相应的搜索空间,因此GA算法具有较强的全局搜索能力。由于遗传算法特有的全局搜索能力,其被广泛使用在各个领域,包括信号处理,机器学习以及控制域等。遗传优化的主要算法流程图如下图所示:

           遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。遗传算法的实现过程实际上就像自然界的进化过程那样。

    遗传算法的一般步骤:

    1.随机产生种群

    2.根据策略判断个体的适应度,是否符合优化准则,若符合,输出最佳个体及其最优解,结束。否则,进行下一步

    3.依据适应度选择父母,适应度高的个体被选中的概率高,适应度低的个体被淘汰

    4.用父母的染色体按照一定的方法进行交叉,生成子代

    5.对子代染色体进行变异

    由交叉和变异产生新一代种群,返回步骤2,直到最优解产生

    基本遗传算法的具体过程如下:

    这里写图片描述

    2.仿真效果预览

    matlab2022a仿真如下:

     

    3.MATLAB核心程序

    1. .........................................................
    2. Lens = data(:,2);
    3. NUM = length(Lens);%x,y
    4. %间隔
    5. SCALE= 45/60;%转换为小时
    6. Sums = 29; %每一行的最大值不大于29
    7. Sums2= 24; %每一行的总和不大于24
    8. %纵坐标最大范围
    9. Ymax = 24;
    10. %放射变换
    11. %根据遗传算法进行参数的拟合
    12. MAXGEN = 400;
    13. NIND = 2000;
    14. Chrom = crtbp(NIND,NUM*10);
    15. %49个变量的区间
    16. Areas = [];
    17. for i = 1:NUM
    18. Areas = [Areas,[1;Ymax]];%最多24
    19. end
    20. FieldD = [rep([10],[1,NUM]);Areas;rep([0;0;0;0],[1,NUM])];
    21. Error = zeros(1,MAXGEN);
    22. Error2 = zeros(1,MAXGEN);
    23. for a=1:1:NIND
    24. J(a,1) = 0;
    25. end
    26. Objv = (J+eps);
    27. gen = 0;
    28. while gen < MAXGEN;
    29. gen
    30. FitnV=ranking(Objv);
    31. Selch=select('sus',Chrom,FitnV);
    32. Selch=recombin('xovsp', Selch,0.995);
    33. Selch=mut( Selch,0.005);
    34. phen1=bs2rv(Selch,FieldD);
    35. for a=1:1:NIND
    36. YY = round(phen1(a,:));
    37. flag= [];
    38. %设置约束条件,间隔
    39. for i = 1:Ymax
    40. indx{i} = find(YY == i);%找到每一行的序列号
    41. end
    42. Xs=[];
    43. Ys=[];
    44. Ls=[];
    45. flag = zeros(1,Ymax);
    46. Numss= 0;
    47. for i = 1:Ymax
    48. NO = indx{i};
    49. X0 = [];
    50. Ltmps= Lens(NO);
    51. Ytmps= YY(NO);
    52. for j = 1:length(NO)
    53. if j == 1
    54. X0(j) = 0;
    55. else
    56. X0(j) = X0(j-1)+Ltmps(j-1)+SCALE;
    57. end
    58. end
    59. Xs=[Xs,X0];
    60. Ys=[Ys,Ytmps];
    61. Ls=[Ls,Ltmps'];
    62. if isempty(NO)==0
    63. Numss = Numss+1;
    64. if X0(end) + Ltmps(end) <= Sums & sum(Ltmps) <= Sums2
    65. flag(i)=1;
    66. else
    67. flag(i)=0;
    68. end
    69. end
    70. end
    71. epls = func_obj(Xs,Ys,Ls,Ymax);
    72. %符合约束条件的进行输出
    73. E = epls;
    74. JJ(a,1) = E;
    75. XX_{a} = Xs;
    76. YY_{a} = Ys;
    77. LL_{a} = Ls;
    78. end
    79. Objvsel=(JJ);
    80. [Chrom,Objv]=reins(Chrom,Selch,1,0,Objv,Objvsel);
    81. gen=gen+1;
    82. Error(gen)=min(JJ);
    83. if gen <= 64
    84. Error2(gen) = mean(Error(1:gen));
    85. else
    86. Error2(gen) = mean(Error(gen-64:gen));
    87. end
    88. end
    89. figure;
    90. plot(Error2,'b-o');
    91. xlabel('迭代次数');
    92. ylabel('优化目标值');
    93. grid on
    94. %得到最优坐标
    95. [V,I] = min(JJ);
    96. X_opt = XX_{I};
    97. Y_opt = YY_{I};
    98. L_opt = LL_{I};
    99. %画出甘特图
    100. for i = 1:length(L_opt)
    101. indx = find(Lens==L_opt(i))
    102. NO2_(i)= indx(1);
    103. end
    104. figure;
    105. for i=1:length(X_opt)
    106. hold on;
    107. plotRec(X_opt(i),X_opt(i)+L_opt(i),Y_opt(i));
    108. text((X_opt(i)+X_opt(i)+L_opt(i))/2,Y_opt(i)-0.5,num2str(NO2_(i)));
    109. end
    110. xlabel('时间');
    111. ylabel('序号');
    112. title('甘特图');
    113. 02_053m

    4.完整MATLAB

    V

  • 相关阅读:
    H264码流RTP封装方式详解
    java-代码操作服务器之SSH连续发送命令
    python常用pip安装源网址
    一篇文章教你学会ASP.Net Core LINQ基本操作
    OpenCV鼠标绘制线段
    即时通讯软件
    《Unity3D高级编程之进阶主程》第四章 UI(一) - NGUI和UGUI比较
    努力一周,开源一个超好用的接口Mock工具——Msw-Tools
    leetcode(力扣) 452. 用最少数量的箭引爆气球 & 435. 无重叠区间 (贪心)
    第55节—— redux-toolkit中的createReducer——了解
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128205472