这个例子展示了如何建立和解决一个混合整数线性规划问题。问题是在一组工厂、仓库和销售网点之间找到最优的生产和分配水平。有关基于求解器的方法,请参见工厂,仓库,销售分配模型:基于求解器.
该示例首先为工厂、仓库和销售网点生成随机位置。可以随意修改缩放参数 ,它既衡量了生产和配送设施所在的网格的规模,也衡量了这些设施的数量,这样每个网格区域中每种类型的设施的密度是独立的 .
对于给定的缩放参数值 ,假设有以下情况:
工厂
仓库
销售网点
这些设施位于1和之间的独立整数网格点上 在里面 和 方向。为了使设施具有独立的位置,您需要 .在这个例子中,采取 , , , .
有 下载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 * 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.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*rand(F,P) + 500;%每个产品/仓库的仓库容量在P*400到P*800之间wcap = P*400*rand(W,1) + P*400;%每个产品1 - 3的产品周转率转弯= 2*rand(1,P) + 1;%每个产品每距离的产品运输成本为5 - 10tcost = 5*rand(1,P) + 5;%各销售网点的产品需求在200至500之间%的产品/出口d = 300*rand(S,P) + 200;
这些随机的需求和能力会导致不可行的问题。换句话说,有时需求超过了生产和仓储能力的限制。如果你改变一些参数,得到一个不可行的问题,在解决过程中,你将得到一个退出标志-2。
要开始指定问题,请生成距离数组distfw(i,j)
和distsw (i, j)
.
distfw = 0 (F, W);%为工厂-仓库距离分配矩阵为2 = 1: F为xloc(ii) - xloc(F + jj)) + abs(yloc(ii)...- Yloc(F + JJ));结束结束distsw =零(s,w);%分配销售网点-仓库距离矩阵为2 = 1: S为xloc = 1: 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;
每个仓库都有一个容量约束。
Warecap = 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;
关闭迭代显示,这样就不会得到数百行输出。包括一个plot函数来监控解决方案的进度。
选择= optimoptions (“intlinprog”,'展示','离开',“PlotFcn”, @optimplotmilp);
调用求解器来找到解。
[溶胶,fval exitflag、输出]=解决(factoryprob,'选项',选择);
如果isempty (sol)%如果问题是不可行的,或者您早期停止没有解决方案DISP(解算器没有返回解)返回%停止脚本,因为没有什么可以检查结束
检查退出标志和解决方案的不可行性。
exitflag
exitflag = OptimalSolution
infeas1 = max (max(不可行性(capconstr,索尔)))
infeas1 = 9.0949 e-13
infeas2 = max (max(不可行性(demconstr,索尔)))
infeas2 = 8.0718 e-12
infeas3 = max(不可行性(warecap,索尔))
Infeas3 = 0.
INFEAS4 = MAX(不可发售(销售软件,溶胶))
infeas4 = 2.4425 e15汽油
在y
解的一部分是整数值。要理解为什么这些变量可能不是精确的整数,请参见一些“整数”解决方案不是整数金宝搏官方网站.
sol.y =圆(sol.y);得到整数解金宝搏官方网站
每个仓库有多少个销售网点?注意,在本例中,有些仓库有0个关联的网点,这意味着在最佳解决方案中没有使用这些仓库。
媒体=总和(sol.y, 1)
媒体=1×202 0 2 2 2 2 2 2 2 2 2 2 2 1 0 0 3 4 3 2 3 2 2 1
绘制每个销售网点与其仓库之间的连接。
图(h);持有在为x = 1:S jj = find(x .y(x,赋值));%与ii相关的仓库索引xsales = xloc (F + W + 2);ysales = yloc (F + W + 2);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 - ')结束结束持有从标题(“销售网点绘制到仓库”)
没有绿线的黑色*表示未使用的仓库。