这个例子展示了如何建立和解决一个混合整数线性规划问题。问题是在一组工厂、仓库和销售网点之间找到最优的生产和分销水平。关于基于求解器的方法,请参见工厂,仓库,销售分配模型:基于求解器.
该示例首先为工厂、仓库和销售网点生成随机位置。可以随意修改缩放参数 ,它既可以缩放生产和配送设施所在的网格的大小,也可以缩放这些设施的数量,以便每个网格区域内每种类型的设施密度是独立的 .
对于缩放参数的给定值 ,假设有以下情况:
工厂
仓库
销售网点
这些设施在1之间的单独整数网格点上 在 和 的方向。为了让这些设施有单独的位置,你需要这样做 .在本例中,取 , , , 和 .
有 s manbetx 845工厂生产的产品。取 .
对每个产品的需求 在销售部门 是 .需求是以时间间隔销售的数量。模型上的一个约束是满足需求,这意味着系统产生并分发了需求中的数量。
每个工厂和每个仓库都有容量限制。
生产产品 在工厂 小于 .
仓库的能力 是 .
产品的数量 可以从仓库运输 给一个销售网点的时间间隔小于 ,在那里 产品的周转率是多少 .
假设每个销售网点只从一个仓库接收供应品。问题的一部分是确定销售网点到仓库的最便宜映射。
从工厂到仓库以及从仓库到销售点运输产品的成本取决于s manbetx 845设备之间的距离,以及具体的产品。如果 设施之间的距离是距离 和 然后运送产品的成本 这些设施之间的距离乘以运输成本 :
本例中的距离是网格距离,也称为 距离。它是绝对值差的和 坐标和 坐标。
生产一单位产品的成本 在工厂 是 .
给定一组设施位置,以及需求和能力限制,发现:
每个工厂每种产品的生产水平
产品从工厂到仓库的分配时间表s manbetx 845
产品从仓库到销售点的分配时间表s manbetx 845
这些数量必须确保满足需求和总成本最小化。而且,每个销售网点必须从一个仓库接收所有产品。s manbetx 845
控制变量,这意味着您可以在优化中改变的变量
产品的数量 这是从工厂运输的 仓库
=一个值为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]); ylim ([0 N + 1])
产生随机的生产成本、产能、周转率和需求。
p = 20;% 20产s manbetx 845品%生产成本在20至100之间pcost = 80*rand(F,P) + 20;%每个产品/工厂的生产能力在500到1500之间PCAP = 1000 * RAND(F,P)+ 500;%每个产品/仓库在P*400和P*800之间的仓库容量WCAP = P * 400 * RAND(W,1)+ P * 400;每种产品的1至3之间的产品变化率%= 1 *rand(1,P) + 1;每种产品的每距离5到10的%产品运输成本Tcost = 5 * rand(1,p)+ 5;每次销售插座的产品需求量为200%至500%产品/出口d = 300 * rand(s,p)+ 200;
这些随机的需求和能力可能导致不可行的问题。换句话说,有时需求超过了生产和仓库容量的限制。如果你改变一些参数,得到一个不可行的问题,在解决过程中,你将得到一个退出标志-2。
要开始指定问题,请生成距离阵列distfw (i, j)
和distsw (i, j)
.
distfw =零(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);%分配矩阵用于销售Outlet-Warehouse距离为II = 1:s为jj = 1:W dissw (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”,p,f,w,'indowbound', 0);y = optimvar (“y”,s,w,“类型”,“整数”,'indowbound'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 = optimproblem;
目标函数有三个部分。第一部分是生产成本的总和。
objfun1 =(金额(金额总和(x) 3)。* (pcost”),2),1);
第二部分是仓库工厂的运输成本的总和。
objfun2 = 0;为p = 1: p objfun2 = objfun2 + tcost (p) *金额(金额(挤压(x (p::)。* distfw));结束
第三部分是仓储到销售网点的运输成本的总和。
r =总和(distsw。* y, 2);% r是一个长度s的向量v = d * (tcost (:));objfun3 = (v * r)之和;
最小化的目标函数是这三部分之和。
factoryprob。对象= objfun1 + objfun2 + objfun3;
在问题中包含约束条件。
factoryprob.constraints.capconstr = capconstr;factoryprob.constraints.demconstr = demconstr;factoryprob.constraints.warecap = warecap;factoryprob.constraints.salesware = salesware;
关闭迭代显示,这样就不会得到几百行输出。包含一个绘图功能来监视解决方案的进度。
选择= optimoptions (“intlinprog”,“显示”,“关闭”,“PlotFcn”,@ Optimplotmilp);
调用求解器查找解决方案。
[溶胶,fval exitflag、输出]=解决(factoryprob,“选项”、选择);
如果isempty (sol)如果问题不可行,或者你因为没有解决方案而提前停止disp (“求解器没有返回解决方案。”)返回%停止脚本,因为没有要检查的内容结束
检查退出标志和解决方案的可行性。
exitflag
ExitFlag = OptimalAllyolution.
INFEAS1 = MAX(MAX(INFEASIBLE(CAPCONSTR,SOL)))))
infeas1 = 9.0949 e-13
INFEAS2 = MAX(MAX(INFOUSIBLE(DEMCONSTR,SOL)))))
infeas2 = 8.0718 e-12
Infeas3 = Max(不可发售(Warecap,Sol))
infeas3 = 0
infeas4 = max(不可行性(salesware,索尔))
Infeas4 = 2.4425e-15
圆形y
溶液的一部分是完全整数的。要理解为什么这些变量可能不是完全整数,请参阅一些“整数”解决方案不是整数万博 尤文图斯.
sol.y = round(sol.y);%获得整数解决方案万博 尤文图斯
每个仓库有多少销售源网点?请注意,在这种情况下,一些仓库有0个相关插座,这意味着仓库不在最佳解决方案中使用。
媒体=总和(sol.y, 1)
媒体=1×202 0 3 2 2 2 2 3 3 2 1 0 0 3 4 3 2 3 2 2 1
绘制每个销售插座和其仓库之间的连接。
图(h);持有在为II = 1:S JJ =查找(Sol.y(II,:));与II相关联的仓库指数Xsales = XLOC(F + W + II);ysales = yloc(f + w + ii);XWAREHOUSE = XLOC(F + JJ);ywarehouse = yloc(f + jj);如果兰特(1)<.5%下半场抽出y方向情节([xsales、xsales xwarehouse], [ysales、ywarehouse ywarehouse),“g——”)其他的%绘制X方向首先剩下的时间plot([xsales,xwarehouse,xwarehouse],[ysales,ysales,ywarehouse],“g——”)结束结束持有从标题(“销售网点到仓库的映射”)
没有绿线的黑色*表示未使用的仓库。