本博客下载链接包含修改的word版本, 可免费下载阅览学习, 也可作为数学建模相关课程作业修改上交:
链接:https://pan.baidu.com/s/1HxzDk3q0p6y2xpuJyxPgvw?pwd=qtnc
提取码:qtnc
本文针对原材料供应过程中的最优成本规划问题,研究并设计开发了一个基于遗传算法的供货链规划系统。在分析实际供应链规划需求的基础上,构建了最优化定购方案和最优化运输方案的数学模型,提出了基于遗传算法(或粒子群算法)的最优供应规划模型。
第一问需要利用过去240周的订货量数据与供货量数据对供应商进行评价, 我们构建了供货完成率,供货误差率,波动可接受性以及大额订单比例等指标, 利用公式法, 对供应商保障企业生产的重要性进行了评价, 并筛选了前50家企业.
第二问先以供应商是否选择作为决策变量, 以供应商数量最少作为目标函数使用0-1规划模型, 得到最少需要127家供应商进行供货, 接着以127家供货商每周的供货量作为决策变量, 以最经济原材料价格作为目标函数, 建立数学规划模型, 得到最优的订货方案. 最后以127家供应商与8家转运商的选择作为决策变量, 以最低损耗率作为目标函数建立0-1规划模型, 得到最优的转运方案.
第三问订货过程中, 对原材料A与C进行赋权, 使得A的权重为100,C的权重为1, 赋权后的总和最低作为目标函数, 建立规划模型, 转运过程中, 利用供货数据, 以转运损耗率最低作为目标函数,建立0-1规划模型.
第四问由于企业的产能可以无限提升, 所以所有周, 所有供货商全部按照最大供应量进行供应, 此时只需要选择最合适的转运过程即可.
本文写作过程中使用遗传算法(模拟退火)算法对规划模型进行了改进, 大大加快了运算速度, 并且不会落到局部最优解.有良好的适用性.
关键词: 规划模型(优化模型) 遗传算法 供应链
相关部分代码示例:
Main1:
%% 清空环境
clear all;
clc;
%% 设置种群参数
% 需要自行配置
options = gaoptimset('Generations', 1000,... %设置迭代次数
'PopulationSize', 200); %设置种群
%调用遗传算法
[x1,fval] = ga(@fitness1,402*24,[],[],[],[],zeros(402*24,1),ones(402*24,1),@nonlcon1,options);
%% 结果后处理
S = reshape(x1,24,402);
% 此时S即为所求的变量结果,为24*402的矩阵
% 其中前146列对应A,最后122列对应C,中间列对应B
% 将运行结果保存成excel
xlswrite('供应商的最少数量时对应的决策矩阵.xlsx',S);
nonlcon1.m
function [ceq,c]=nonlcon1(x)
% 此时输入的是行向量
% 对变量取整,保证取值都是0或1
x = round(x);
x =x';
%导入maxA,maxB,maxC的数据
maxA = xlsread('maxA');
maxB = xlsread('maxB');
maxC = xlsread('maxC');
% 对输入变量进行重新排列
S = reshape(x,24,402);
% 分别赋值Sa,Sb,Sc
SA = S(:,1:146);
SB = S(:,147:280);
SC = S(:,281:402);
% 设定阈值(约束)
s = (-2.28e4)*ones(24,1)+(-2.28e4)*eye(24,1);
% 给输出赋值
ceq(:,1) = s-diag(0.98*(SA*maxA/0.6+SB*maxB/0.66+SC*maxC/0.72));
c =0;
end
fitness1.m
function z = fitness1(x)
% 此时输入的是行向量
% 对变量取整,保证取值都是0或1
x = round(x);
% 将输入值转置成列向量
x = x';
% 对输入变量进行重新排列
S = reshape(x,24,402);
% 分别赋值Sa,Sb,Sc
SA = S(:,1:146);
SB = S(:,147:280);
SC = S(:,281:402);
% 定义计数并初始化
countA = 0;
countB = 0;
countC = 0;
% 分别对Sa,Sb,Sc各列求和并计数
for i=1:146
if sum(SA(:,i)) > 0
countA = countA + 1;
end
end
for i=1:134
if sum(SB(:,i)) > 0
countB = countB + 1;
end
end
for i=1:122
if sum(SC(:,i)) > 0
countC = countC + 1;
end
end
% 汇总得到适应度函数
z = countA + countB + countC;
end