工厂、仓库、销售分配模型:基于问题的
这个例子展示了如何建立和解决一个混合整数线性规划问题。问题是在一组工厂、仓库和销售点之间找到最优的生产和分配水平。有关基于求解器的方法,请参见工厂、仓库、销售分配模型:基于求解器.
示例首先为工厂、仓库和销售点生成随机位置。可以随意修改缩放参数 ,它既扩大了生产和分销设施所在的网格的规模,也扩大了这些设施的数量,以便每个网格区域的每种类型的设施密度是独立的 .
设施位置
对于缩放参数的给定值 ,假设存在以下情况:
工厂
仓库
销售网点
这些设施分别位于1和之间的整数网格点上 在 而且 的方向。为了使这些设施有独立的位置,你需要这样做 .在这个例子中,取 , , , .
生产和分销
有 下载188bet金宝搏工厂生产的产品。取 .
每种产品的需求 在销售点 是 .需求是在一段时间内可以售出的数量。该模型的一个约束条件是需求得到满足,这意味着系统生产和分配的数量恰好满足需求。
每个工厂和每个仓库都有容量限制。
产品的生产 在工厂 小于 .
仓库容量 是 .
产品数量 可以从仓库运输 到一个销售点的时间间隔不到 ,在那里 产品的周转率如何 .
假设每个销售点只从一个仓库接收其供应。问题的一部分是确定销售网点到仓库的最便宜的映射。
成本
产品从工厂到仓库,从仓库到销售点的运输成本取决于设下载188bet金宝搏施之间的距离,以及特定的产品。如果 设施之间的距离是多少 而且 ,然后是产品的运输成本 这些设施之间的距离乘以运输成本 :
本例中的距离是网格距离,也称为 距离。它是绝对差的和 坐标和 坐标。
生产单位产品的成本 在工厂 是 .
优化问题
给定一组设施位置、需求和容量限制,可得:
每个工厂每种产品的生产水平
产品从工厂到仓库的分配时间表下载188bet金宝搏
产品从仓库到销售点的分配时间表下载188bet金宝搏
这些数量必须确保需求得到满足,总成本降到最低。此外,每个销售点都必须从一个仓库接收所有产品。下载188bet金宝搏
优化问题的变量和方程
控制变量,也就是你在优化过程中可以改变的变量,是
=产品数量 这是从工厂运来的 到仓库
= sales outlet时取1的二进制变量 与仓库相关
最小化的目标函数是
约束条件是
(工厂产能)。
(需求得到满足)。
(仓库容量)。
(每个销售点对应一个仓库)。
(非负生产)。
(二进制 ).
的变量 而且 在目标函数和约束函数中线性出现。因为 如果限制为整数值,则问题是混合整型线性规划(MILP)。
生成一个随机问题:设施位置
的值 , , , 参数,并生成设施位置。
rng (1)再现率%N = 20;% N从10到30似乎有效。请谨慎选择较大的值。N2 = n * n;F = 0.05;工厂密度百分比W = 0.05;仓库密度百分比S = 0.1;销售点的密度F =地板(F *N2);工厂数量%W =地板(W *N2);仓库数量%S =楼层(S *N2);销售网点的百分比xyloc = randperm(N2,F+W+S);设施的唯一位置[xloc,yloc] = ind2sub([N N],xyloc);
当然,随机选址是不现实的。本例旨在展示解决方案技术,而不是如何生成良好的设施位置。
标出设施。设施1至F为工厂,F+1至F+W为仓库,F+W+1至F+W+S为销售点。
H =数字;情节(xloc (1: F), yloc (1: F),“rs”xloc (F + 1: F + W), yloc (F + 1: F + W),“k *’,...xloc (F + W + 1: F + W + S), yloc (F + W + 1: F + W + S),“波”);LGND =图例(“工厂”,“仓库”,“销售渠道”,“位置”,“EastOutside”);lgnd。自动更新=“关闭”;xlim([0 N+1]);
生成随机容量、成本和需求
生成随机的生产成本、产能、周转率和需求。
P = 20;% 20产下载188bet金宝搏品生产成本在20到100之间pcost = 80*兰特(F,P) + 20;每种产品/工厂的生产能力在500到1500之间pcap = 1000*兰特(F,P) + 500;每个产品/仓库的仓库容量在P*400到P*800之间wcap = P*400*rand(W,1) + P*400;每种产品的周转率在1到3之间turn = 2*rand(1,P) + 1;产品运输成本%每距离5至10之间的每个产品tcost = 5*rand(1,P) + 5;每个销售点的产品需求在200到500之间%的产品/出口d = 300*兰特(S,P) + 200;
这些随机的需求和能力会导致不可行的问题。换句话说,有时需求超过了生产和仓库容量的限制。如果你改变了一些参数,得到了一个不可行的问题,在解决过程中,你会得到一个-2的退出标志。
生成变量和约束
要开始指定问题,请生成距离数组distfw (i, j)
而且distsw (i, j)
.
distfw = 0 (F,W);为工厂-仓库距离分配矩阵为ii = 1:F为jj = 1:W distfw(ii,jj) = abs(xloc(ii) - xloc(F + jj)) + abs(yloc(ii))...- yloc(F + jj));结束结束distsw = 0 (S,W);分配销售网点-仓库距离矩阵为ii = 1:S为jj = 1:W distsw(ii,jj) = abs(xloc(F + W + ii) - xloc(F + jj)))...+ abs(yloc(F + W + ii) - yloc(F + jj));结束结束
为优化问题创建变量。x
表示具有维数的连续变量生产P
——- - - - - -F
——- - - - - -W
.y
表示销售出口到仓库的二进制分配年代
——- - - - - -W
变量。
X = optimvar(“x”, F P W,下界的, 0);Y = optimvar(“y”,年代,W,“类型”,“整数”,下界的0,“UpperBound”1);
现在创建约束条件。第一个限制是生产能力的限制。
Capconstr = sum(x,3) <= pcap';
下一个约束条件是每个销售点都要满足需求。
Demconstr = squeeze(sum(x,2)) == d'*y;
每个仓库都有容量限制。
wrecap = sum(diag(1./turn)*(d'*y),1) <= wcap';
最后,有一个要求是每个销售网点只连接到一个仓库。
salesware = sum(y,2) == ones(S,1);
创造问题和目标
创建一个优化问题。
Factoryprob =优化问题;
目标函数由三部分组成。第一部分是生产成本的总和。
Objfun1 = sum(sum(sum(x,3).*(pcost'),2),1);
第二部分是从工厂到仓库的运输成本之和。
Objfun2 = 0;为p = 1: p objfun2 = objfun2 + tcost (p) *金额(金额(挤压(x (p::)。* distfw));结束
第三部分是从仓库到销售点的运输成本之和。
R = sum(distsw.*y,2);% r是一个长度为s的向量V = d*(tcost(:));Objfun3 = sum(v.*r);
最小化的目标函数是这三部分的和。
factoryprob。目标= objfun1 + objfun2 + objfun3;
在问题中包含约束条件。
factoryprobr . constraints .capconstr = capconstr;factoryprov . constraints .demconstr = demconstr;factoryprov . constraints .warecap = warecap;factoryprov . constraints .salesware =销售软件;
解决问题
关闭迭代显示,这样就不会得到数百行输出。包括一个绘图函数来监视解决方案的进度。
Opts = optimoptions(“intlinprog”,“显示”,“关闭”,“PlotFcn”, @optimplotmilp);
调用解算器来找到解。
[sol,fval,exitflag,output] = solve(factoryprob,“选项”、选择);
如果isempty (sol)如果问题是不可行的,或者你在没有解决方案的情况下提前停止。disp (“求解器没有返回一个解。”)返回停止脚本,因为没有需要检查的内容结束
检查解决方案
检查退出标志和解决方案的不可行性。
exitflag
exitflag = OptimalSolution
Infeas1 = max(max(in可行性(capconstr,sol)))
Infeas1 = 9.0949 -13
Infeas2 = max(max(in可行性(demconstr,sol)))
Infeas2 = 4.5475e-11
Infeas3 = max(不可行(warecap,sol))
Infeas3 = 0
Infeas4 = max(in可行性(销售软件,sol))
Infeas4 = 1.3078e-13
在y
解的一部分恰好是整数值。要了解为什么这些变量可能不完全是整数,请参见一些“整数”解不是整数金宝搏官方网站.
Sol.y = round(Sol.y);%获取整数解金宝搏官方网站
每个仓库有多少个销售网点?注意,在本例中,一些仓库有0个关联出口,这意味着在最佳解决方案中没有使用这些仓库。
Outlets = sum(sol.y,1)
媒体=1×202 0 3 2 2 2 2 2 2 2 3 2 1 0 0 3 4 3 2 3 2
绘制每个销售点与其仓库之间的连接关系。
图(h);持有在为ii = 1:S jj = find(sol.y(ii,:));与ii相关的仓库索引xsales = xloc(F+W+ii);ysales = yloc(F+W+ii);xwarehouse = xloc(F+jj);ywarehouse = yloc(F+jj);如果Rand (1) < .5先画y方向一半的时间情节([xsales、xsales xwarehouse], [ysales、ywarehouse ywarehouse),“g——”)其他的其余时间先画x方向情节([xsales、xwarehouse xwarehouse], [ysales、ysales ywarehouse),“g——”)结束结束持有从标题(“销售网点到仓库的映射”)
没有绿线的黑色*代表未使用的仓库。