• 大小: 12KB
    文件类型: .m
    金币: 2
    下载: 0 次
    发布日期: 2024-01-27
  • 语言: Matlab
  • 标签: Matlab  源代码  

资源简介

该代码用于解决具有机器柔性的柔性作业车间调度问题,工件数量与工序数量可自行调节,采用了传统遗传算法,编码方式为三维实数编码。

资源截图

代码片段和文件信息

%该程序用于解决柔性作业车间调度,m个工件,n道工序,其中n为最大工序数,工件的工序
%数可以少于n,加工机器数为M,每个工件的每道工序具有多个机器可以选择,对应的时间
%不同,其中初始种群的储存方式采用cell数据类型
%Version:1.3
%fileDescription:调度机器可选的柔性作业车间问题,甘特图已完善改善初始解集(均衡分散原则),改善交叉(部分映射交叉)8*8实例
%last edit time:2019-4-15
function main()
count = 1000;     %迭代次数
N = 50;          %种群规模
pc = 0.8;       %交换概率
pm = 0.2;       %变异概率
m = 8;             %工件数
n = 4;             %工序数
M = 8;             %机器数
plotif = 1;        %控制程序是否进行绘图
s = input(mn);    %数据输入
[pTN] = initial_p(mnNsM);    %生成初始种群50采用细胞结构,每个元素为8*4
P = machine(nM);
FIT = zeros(count1);
aveFIT = zeros(count1);
X1=randperm(count);       %收敛图形的横坐标X
X=sort(X1);
%------------------------输出最优解的时有用------------------------------
best_fit = 1000;            %改变模型需要修改此参数
best_p = zeros(mn);
best_TN = zeros(mn);
Y1p = zeros(m1);
Y2p = zeros(m1);
Y3p = zeros(m1);
%-------------------------进行迭代--------------------------------------
for i = 1:count
    [fitY1Y2Y3] = object(pTNNPmn);
    [newpnewTN] = selection(pTNfitN);
    [newpnewTN] = crossover(newppcmnNnewTN);
    [newpnewTN] = var(newppmmnNsnewTN);
    if best_fit > min(fit)
        [best_pbest_TNbest_fitY1pY2pY3p]=best(best_fitbest_pfitbest_TNY1pY2pY3ppTNY1Y2Y3);
    end
    p = newp;
    TN = newTN;
    FIT(i) = min(fit);    %用于适应度函数的
    aveFIT(i) = mean(fit);      %用于适应度函数的
end
%------------------投射最佳方案数据--------------------------------------
   
    fprintf(‘最优解:%d\n‘best_fit);
    fprintf(‘工序1 工序2 工序3 工序4\n‘);
    best_p
    fprintf(‘时间1 时间2 时间3 时间4\n‘);
    best_TN
%------------------------收敛曲线----------------------------------------
    if plotif == 1
    figure;
    plot(XFIT‘r‘);
    hold on;
    plot(XaveFIT‘b‘);
    title(‘收敛曲线‘);
    hold on;
    legend(‘最优解‘‘平均值‘);
%-------------------------甘特图-----------------------------------------
figure;
w=0.5;       %横条宽度 
set(gcf‘color‘‘w‘);      %图的背景设为白色
for i = 1:m
    for j = 1:n
        color=[10.980.98;10.890.71;0.860.860.86;0.380.721;101;011;010.49;10.870.67;0.390.580.92;0.560.730.56];
        a = [Y1p(ij)Y2p(ij)];
        x=a(1[1 1 2 2]);      %设置小图框四个点的x坐标
        y=Y3p(ij)+[-w/2 w/2 w/2 -w/2];   %设置小图框四个点的y坐标
        color = [color(i1)color(i2)color(i3)];
        p=patch(‘xdata‘x‘ydata‘y‘facecolor‘color‘edgecolor‘‘k‘);    %facecolor为填充颜色,edgecolor为图框颜色
            text(a(11)+0.5Y3p(ij)[num2str(i)‘-‘num2str(j)]);    %显示小图框里的数字位置和数值
    end
end
xlabel(‘加工时间/s‘);      %横坐标名称
ylabel(‘机器‘);            %纵坐标名称
title({[num2str(m)‘*‘num2str(M)‘的一个最佳调度(最短完工时间为‘num2str(best_fit)‘)‘]});      %图形名称
axis([0best_fit+20M+1]);         %x轴,y轴的范围
set(gca‘Box‘‘on‘);       %显示图形边框
set(gca‘YTick‘0:M+1);     %y轴的增长幅度
set(gca‘YTickLabel‘{‘‘;num2str((1:M)‘‘M%d‘);‘‘});  %显示机器号
hold on;
    end
%--------------------------输入数据---------------------------------
function s = input(mn)      %输入数据
s = cell(mn);

评论

共有 条评论