这个例子展示了如何建立和解决一个混合整数线性规划问题。问题是在一组工厂、仓库和销售网点之间找到最优的生产和分销水平。关于基于求解器的方法,请参见工厂,仓库,销售分配模型:基于求解器.
该示例首先为工厂、仓库和销售网点生成随机位置。可以随意修改缩放参数 ,它既可以缩放生产和配送设施所在的网格的大小,也可以缩放这些设施的数量,以便每个网格区域内每种类型的设施密度是独立的 .
用于缩放参数的给定值 ,假设有以下情况:
工厂
仓库
销售网点
这些设施都在1和2之间独立的整数网格点 在里面 和 方向。为了使设施具有独立的位置,您需要 .在这个例子中,采取 , , , 和 .
有 下载188bet金宝搏产品制造的产品。拿 .
每个产品的需求 在销售部门 是 .的需求是可以在一个时间间隔内销售数量。在模型中的一个约束是满足需求,这意味着系统产生和需求的准确分布的数量。
还有的每个工厂和每个仓库容量的限制。
生产的产品 在工厂 小于 .
仓库的容量 是 .
产品的数量 可以从仓库运 在时间间隔的销售出口小于 , 在哪里 产品的周转率是多少 .
假设每个销售网点只从一个仓库接收供应品。问题的一部分是确定销售网点到仓库的最便宜映射。
从工厂到仓库的产品的成本以及从仓库到销售店,取决于下载188bet金宝搏设施与特定产品之间的距离。如果 是设备之间的距离 和 ,然后运送产品的成本 这些设施之间是运输成本的距离次数 :
本例中的距离是网格距离,也称为 距离。它是绝对值差的和 坐标和 坐标。
生产一单位产品的成本 在工厂 是 .
给定一组设施位置,以及需求和能力限制,发现:
每个工厂的每种产品的生产水平
产品从工厂到仓库的分配时间表下载188bet金宝搏
仓储到销售网点的产品的分配时间表下载188bet金宝搏
这些数量必须确保满足需求和总成本最小化。而且,每个销售网点必须从一个仓库接收所有产品。下载188bet金宝搏
控制变量,这意味着你可以在优化改变的,是
产品的数量 是从工厂运 仓库
=销售插座时的二进制变量占用1 与仓库相关
最小化的目标函数是
约束是
(工厂的容量)。
(满足需求)。
(仓库)的能力。
(每个销售出口相关联的一个仓库)。
(非负的生产)。
(二进制 ).
变量 和 在出现的线性目标和约束功能。因为 问题是一个混合整数线性规划(MILP)。
的值 , , , 和 参数,并生成该设施的位置。
RNG(1)%的再现性N = 20;%N从10到30,似乎工作。选择慎用大值。N2 = N * N;F = 0.05;工厂的密度%w = 0.05;仓库密度%S = 0.1;销售网点密度%F =地板(F * N 2);%工厂数量W =地板(W * N 2);%仓库数量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.autoupdate =.'离开';XLIM([0 n + 1]); ylim([0 n + 1])
产生随机的生产成本、产能、周转率和需求。
P = 20;%20产品下载188bet金宝搏%生产成本在20至100之间pcost = 80*rand(F,P) + 20;%每个产品/工厂的生产能力在500到1500之间PCAP = 1000 *兰特(F,P)+ 500;%每个产品/仓库在P*400和P*800之间的仓库容量WCAP = P * 400 *兰特(W,1)+ P * 400;1和3之间%产品周转率的每个产品= 1 *rand(1,P) + 1;每个产品每单位距离%产品运输成本5和10之间tcost = 5 *兰特(1,P)+ 5;按销售额%产品需求200和500之间的出口为每%产品/出口d = 300 *兰特(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 =零(s,w);%的销售分配矩阵出口仓库的距离为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,“下界”, 0);y = optimvar (“y”,S,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';
最后,还有一个要求,即每个销售出口连接到只有一个仓库。
销售软件= sum(y,2)== = lip(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是一个长度的矢量v = d * (tcost (:));objfun3 = (v * r)之和;
最小化的目标函数是这三部分之和。
factoryprob.objective = 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(最大值(不可行性(capconstr,溶胶)))
infeas1 = 9.0949 e-13
infeas2 = MAX(最大值(不可行性(demconstr,溶胶)))
infeas2 = 8.0718 e-12
infeas3 = MAX(不可行性(warecap,溶胶))
Infeas3 = 0.
INFEAS4 = MAX(不可发售(销售软件,溶胶))
infeas4 = 2.4425e-15
回合y
将溶液的一部分被精确地整数值。要理解为什么这些变量可能不完全的整数,见一些“整数”的解决方案是不是整金宝搏官方网站数.
sol.y = ROUND(sol.y);%GET整数解金宝搏官方网站
多少个销售网点与每一个仓库关联?请注意,在这种情况下,一些仓库有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相关联XSALES = XLOC(F + W +ⅱ);ysales = yloc(F + W +ⅱ);xwarehouse = XLOC(F + JJ);ywarehouse = yloc(F + JJ);如果兰特(1)<0.5%第一绘制y方向上一半的时间情节([xsales、xsales xwarehouse], [ysales、ywarehouse ywarehouse),'G - ')其他的%绘制x方向的第一时间的其余部分图([XSALES,xwarehouse,xwarehouse],[ysales,ysales,ywarehouse]'G - ')结束结束持有离开标题(“销售网点绘制到仓库”)
没有绿线的黑色*表示未使用的仓库。