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

📄 flowshop.m

📁 离散算法
💻 M
📖 第 1 页 / 共 3 页
字号:
clear
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                 参数部分                          %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
runTime = 1;
% ---多目标工作流问题参数-------------------------
funCount=2;       % 目标函数个数
jobCount = 100;
machCount = 10;
proFileName = ['tai', num2str(jobCount), '_', num2str(machCount)];
load(proFileName) % machCount jobCount proCount all_tProcess all_otherParetoOptimalFun all_otherPOFunCounts all_fBound;
selProInds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; % 从中选出的 测试问题 下标  1, 2, 3, 4, 5, 6, 7, 8, 9, 10
selProCount = size(selProInds, 2); % 从中选出的 测试问题 个数

% ---粒子群算法参数-------------------------
popSize = 50;     % 种群规模250
evaluations =15000 ; % 最大迭代次数20000
endEval = floor(0.9*evaluations); 
w_start = 0.9;   %Initial inertia weight's value
w_end = 0.3;       %Final inertia weight
w_varyfor = floor(0.7*evaluations); % evaluations - 1;Weight change step. Defines total number of evaluations for which weight is changed.
w_now = w_start;
inertdec = (w_start-w_end)/w_varyfor; % Inertia weight's change per iteration

c1_start = 0.9; % 最初的变异概率
c1_end = 0.15;
c1_varyfor = floor(0.7 * evaluations);
c1_now = c1_start;
c1_dec = (c1_start - c1_end) / c1_varyfor;


% 产生新解比原来差时,仍然更新为新解的概率,递减
upd_start = 0.5;   %Initial inertia weight's value
upd_end = 0.1;       %Final inertia weight
upd_varyfor = floor(0.7*evaluations); % Weight change step. Defines total number of evaluations for which weight is changed.
upd_now = upd_start;
upd_dec = (upd_start-upd_end)/upd_varyfor; % Inertia weight's change per iteration

replaceRate = 0.5;

% ---适应度函数的参数-------------------------
o_shares = [0.01, 1]; % 各个目标空间上的共享半径,(1 × funCount)维), !!!此处固定为 2个目标
% !!!以下两个参数只作为参数传入适应度的计算,实际适应度函数的计算公式固定,没用到该参数,可进一步研究
a_nonlinear = 2;    % 非线性结合被优越数domiCount的指数参数  
b_nonlinear = 1;    % 非线性结合邻近密度neighDensity的指数参数

% ---数据结构中用到的参数-------------------------
% --粒子的存储结构
% - [X1,...,Xn,   f1,...fk,    domiCount, neighDensity, Fitness,  pBInd      ]
% - [决策变量值, 目标函数值, 被优越数, 邻近密度,   适应度值, 在历史最优位置数组中的横坐标(粒子编号)]
% - -其中 pBInd 的初始编号为初始种群按从优到劣的顺序排列后,给各个粒子的编号,便于跟踪最优粒子的变化情况
parInfSize = jobCount + funCount + 3 + 1 ;% 表示粒子信息的一维数组长度
funInd = jobCount + 1;
dCInd = funInd + funCount;  % 被优越数值在种群数组中的第几列 
nDInd = dCInd + 1;          % 邻近密度值在种群数组中的第几列 
fitInd = nDInd + 1;         % 适应度值在种群数组中的第几列 
pBInd = fitInd + 1;          % 记录粒子编号的变量在第几列,用于后面pBest排序

gBCount=0;  % 全局最优解的个数
pOCount = 0; % 历代Pareto最优解的个数
gBest = [];                 % 记录适应度最优的最优解
ParetoOptimal = [];         % 记录历代搜索到的Pareto最优解

% ---输出图中用到的参数-------------------------
% --
figDiv = 10;   % 坐标分为几段
figF1Min = 0;
figF1Max = 0;
figF1Len = 0;
figF1Step = figF1Len / figDiv;

figF2Min = 0;
figF2Max = 0;
figF2Len = 0;
figF2Step = figF2Len / figDiv; 

midShowTime = 2; % 中间图输出的个数
midShowStep = floor(evaluations / midShowTime);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                 参数部分      结束                    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
proParetoOptimalFun = -ones(40, funCount + 1,selProCount); % 初始为每个问题的 PTrue 个数 上限为 40 个
proPOFunCount =  -ones(selProCount, 1);
proMyPSOPTrueFunCounts = -ones(selProCount, 1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%          开始    各个 测试问题计算                       %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
beforeProTimeStr = '(无)';
for (iSelProInd = 1: selProCount)		
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	%%                读入 测试问题 部分                        %%
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    selProNum = selProInds(1, iSelProInd);  % 测问题编号
	tProcess = all_tProcess(:, :, selProNum); % 测试问题的 处理时间
	otherPOFunCounts= all_otherPOFunCounts(selProNum) ; % 测试问题的 其他算法得到的最优解 个数
    otherParetoOptimalFun = [];
	otherParetoOptimalFun = all_otherParetoOptimalFun(1:otherPOFunCounts,:,selProNum); % 测试问题的 其他算法得到的最优解
    f1OPOMin = min(otherParetoOptimalFun(:, 1)); % 测试问题 其他人全部最优解的边界,用于最终图输出
    f2OPOMin = min(otherParetoOptimalFun(:, 2));
    f1OPOMax = max(otherParetoOptimalFun(:, 1)); 
    f2OPOMax = max(otherParetoOptimalFun(:, 2));
    
	mid_f1Min = all_fBound(selProNum, 1); % 测试问题的边界值(包含一个随机序列和其他人全部最优解的边界),用于初始图和中间图输出
	mid_f2Min = all_fBound(selProNum, 2);
	mid_f1Max = all_fBound(selProNum, 3);
	mid_f2Max = all_fBound(selProNum, 4);   	            
    proDes = strcat(' Taillard -  ',num2str(jobCount),'/',num2str(machCount),', Problem ',num2str(selProNum));
    proShotDes = strcat('tai',num2str(jobCount),'_',num2str(machCount),' - ',num2str(selProNum));
    strcat(proDes, '开始:',DATESTR(NOW), '上个函数:', beforeProTimeStr)   
    beforeProTimeStr = DATESTR(NOW);
    % --10.1 得到初始图和中间图输出的边界  
	mid_figF1Step = round((mid_f1Max - mid_f1Min) / (figDiv - 2 ));
	mid_figF1Min = mid_f1Min - mid_figF1Step;
	mid_figF1Max = mid_f1Max + mid_figF1Step/4 ; % f1Min + figF1Step * figDiv;
	mid_figF1Len = mid_figF1Max - mid_figF1Min;
	mid_figF2Step = round((mid_f2Max - mid_f2Min) / (figDiv - 2 ));
	mid_figF2Min = mid_f2Min - mid_figF2Step;
	mid_figF2Max = mid_f2Max + mid_figF2Step/4;
	mid_figF2Len = mid_figF2Max - mid_figF2Min;
	mid_figBounds = [mid_figF1Min, mid_figF1Max, mid_figF1Step;
                 mid_figF2Min, mid_figF2Max, mid_figF2Step];
% % 	%%------------------------------------------%%
% % 	%       得到图输出的边界
% % 	figF1Step = round((f1Max - f1Min) / (figDiv - 2 ));
% % 	figF1Min = f1Min - figF1Step;
% % 	figF1Max = f1Max + figF1Step/4 ; % f1Min + figF1Step * figDiv;
% % 	figF1Len = figF1Max - figF1Min;
% % 	figF2Step = round((f2Max - f2Min) / (figDiv - 2 ));
% % 	figF2Min = f2Min - figF2Step;
% % 	figF2Max = f2Max + figF2Step/4;
% % 	figF2Len = figF2Max - figF2Min;
% % 	figBounds = [figF1Min, figF1Max, figF1Step;
% %                  figF2Min, figF2Max, figF2Step];
             
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	%%                开始多轮 进化                             %%
	%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    runTimeParetoOptimals = []; % 记录每一轮计算得到的 最优解
	beforeTimeStr = '(无)';
	for (iRunTime = 1: runTime)	
% %         strcat('新一轮开始( ',proDes, ': 第',num2str(runTime), ' - ',num2str(iRunTime),'轮)', ...
% %             '--现在时间:',DATESTR(NOW), '-上一轮开始时间:', beforeTimeStr)
        beforeTimeStr = DATESTR(NOW);
        w_now = w_start;
        c1_now = c1_start;
        upd_now = upd_start;
	%     iRunTime
		%%------------------------------------------%%
		%       初始化种群,计算函数值和适应度值
		initialPop = ones(popSize, pBInd);
		for i=1:popSize
            initialPop(i,1:jobCount) = randperm(jobCount); %[2,3,1,4,5];
            curJobSeq = initialPop(i, 1:jobCount);		
            % 计算完成时间和函数值  !!!暂时去掉 完成时间 的返回

⌨️ 快捷键说明

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