主要内容

工厂、仓库、销售分配模型:基于求解器

这个例子展示了如何建立和解决一个混合整数线性规划问题。问题是在一组工厂、仓库和销售点之间找到最优的生产和分配水平。有关基于问题的方法,请参见工厂、仓库、销售分配模型:基于问题的

示例首先为工厂、仓库和销售点生成随机位置。可以随意修改缩放参数 N ,它既扩大了生产和分销设施所在的网格的规模,也扩大了这些设施的数量,以便每个网格区域的每种类型的设施密度是独立的 N

设施位置

对于缩放参数的给定值 N ,假设存在以下情况:

  • f N 2 工厂

  • w N 2 仓库

  • 年代 N 2 销售网点

这些设施分别位于1和之间的整数网格点上 N x 而且 y 的方向。为了使这些设施有独立的位置,你需要这样做 f + w + 年代 1 .在这个例子中,取 N 2 0 f 0 0 5 w 0 0 5 , 年代 0 1

生产和分销

P 下载188bet金宝搏工厂生产的产品。取 P 2 0

每种产品的需求 p 在销售点 年代 d 年代 p .需求是在一段时间内可以售出的数量。该模型的一个约束条件是需求得到满足,这意味着系统生产和分配的数量恰好满足需求。

每个工厂和每个仓库都有容量限制。

  • 产品的生产 p 在工厂 f 小于 p c 一个 p f p

  • 仓库容量 w w c 一个 p w

  • 产品数量 p 可以从仓库运输 w 到一个销售点的时间间隔不到 t u r n p w c 一个 p w ,在那里 t u r n p 产品的周转率如何 p

假设每个销售点只从一个仓库接收其供应。问题的一部分是确定销售网点到仓库的最便宜的映射。

成本

产品从工厂到仓库,从仓库到销售点的运输成本取决于设下载188bet金宝搏施之间的距离,以及特定的产品。如果 d 年代 t 一个 b 设施之间的距离是多少 一个 而且 b ,然后是产品的运输成本 p 这些设施之间的距离乘以运输成本 t c o 年代 t p

d 年代 t 一个 b t c o 年代 t p

本例中的距离是网格距离,也称为 l 1 距离。它是绝对差的和 x 坐标和 y 坐标。

生产单位产品的成本 p 在工厂 f p c o 年代 t f p

优化问题

给定一组设施位置、需求和容量限制,可得:

  • 每个工厂每种产品的生产水平

  • 产品从工厂到仓库的分配时间表下载188bet金宝搏

  • 产品从仓库到销售点的分配时间表下载188bet金宝搏

这些数量必须确保需求得到满足,总成本降到最低。此外,每个销售点都必须从一个仓库接收所有产品。下载188bet金宝搏

优化问题的变量和方程

控制变量,也就是你在优化过程中可以改变的变量,是

  • x p f w =产品数量 p 这是从工厂运来的 f 到仓库 w

  • y 年代 w = sales outlet时取1的二进制变量 年代 与仓库相关 w

最小化的目标函数是

f p w x p f w p c o 年代 t f p + t c o 年代 t p d 年代 t f w

+ 年代 w p d 年代 p t c o 年代 t p d 年代 t 年代 w y 年代 w

约束条件是

w x p f w p c 一个 p f p (工厂产能)。

f x p f w 年代 d 年代 p y 年代 w (需求得到满足)。

p 年代 d 年代 p t u r n p y 年代 w w c 一个 p w (仓库容量)。

w y 年代 w 1 (每个销售点对应一个仓库)。

x p f w 0 (非负生产)。

y 年代 w ϵ 0 1 (二进制 y ).

的变量 x 而且 y 在目标函数和约束函数中线性出现。因为 y 如果限制为整数值,则问题是混合整型线性规划(MILP)。

生成一个随机问题:设施位置

的值 N f w , 年代 参数,并生成设施位置。

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]);

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象代表工厂、仓库、销售点。

生成随机容量、成本和需求

生成随机的生产成本、产能、周转率和需求。

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的退出标志。

生成目标和约束矩阵和向量

目标函数向量objintlincon由变量的系数组成 x p f w 而且 y 年代 w .所以很自然地P* f * w + s * w系数obj

生成系数的一种方法是从a开始P-by-F-by-W数组其中obj1 x 系数,和S-by-W数组methoda y 年代 w 系数。然后将这些数组转换为两个向量,并将它们组合成obj通过调用

Obj = [obj1(:);obj2(:)];

obj1 = 0 (P,F,W);分配数组obj2 = 0 (S,W);

在生成目标和约束向量和矩阵的过程中,我们生成了 p f w 数组或 年代 w 数组,然后将结果转换为一个向量。

要开始生成输入,先生成距离数组distfw (i, j)而且distsw (i, j)

distfw = 0 (F,W);为工厂-仓库距离分配矩阵ii = 1:Fjj = 1:W distfw(ii,jj) = abs(xloc(ii) - xloc(F + jj)) + abs(yloc(ii))...- yloc(F + jj));结束结束distsw = 0 (S,W);分配销售网点-仓库距离矩阵ii = 1:Sjj = 1:W distsw(ii,jj) = abs(xloc(F + W + ii) - xloc(F + jj)))...+ abs(yloc(F + W + ii) - yloc(F + jj));结束结束

生成的条目其中obj1而且methoda

ii = 1:Pjj = 1:Fkk = 1:W obj1(ii,jj,kk) = pcost(jj,ii) + tcost(ii)*distfw(jj,kk);结束结束结束ii = 1:Sjj = 1: W methoda (ii, jj) = distsw (ii, jj) *总和(d (ii):)。* tcost);结束结束

把这些元素组合成一个向量。

Obj = [obj1(:);obj2(:)];% obj是目标函数向量

现在创建约束矩阵。

每个线性约束矩阵的宽度就是矩阵的长度obj向量。

Matwid = length(obj);

有两种类型的线性不等式:生产能力约束和仓库容量约束。

F P *生产能力限制,以及W仓库容量限制。约束矩阵非常稀疏,在1%的非零数量级上,因此使用稀疏矩阵可以节省内存。

Aineq = spalloc(P*F + W,matwid,P*F*W + S*W);分配稀疏Aeqbineq = 0 (P*F + W,1);将bineq分配为满方便大小的0个矩阵:Clearer1 = 0(大小(obj1));Clearer12 = clearer1(:);Clearer2 = 0 (size(obj2));Clearer22 = clearer2(:);首先是生产能力的限制计数器= 1;ii = 1:Fjj = 1:P xtemp = clearer1;Xtemp (jj,ii,:) = 1;每个产品和工厂的仓库总和Xtemp = sparse([Xtemp (:);clearer22]);%转换为稀疏Aineq(counter,:) = xtemp';填充行Bineq (counter) = pcap(ii,jj);计数器=计数器+ 1;结束结束现在仓库容量受到限制vj = 0 (S,1);%乘数jj = 1:S vj(jj) = sum(d(jj,:)./turn);P个元素的和结束ii = 1:W xtemp = clearer2;Xtemp (:,ii) = vj;Xtemp = sparse([clearer12; Xtemp (:)]);%转换为稀疏Aineq(counter,:) = xtemp';填充行Bineq (counter) = wcap(ii);计数器=计数器+ 1;结束

线性等式约束有两种类型:需求得到满足的约束,以及每个销售点对应于一个仓库的约束。

Aeq = spalloc(P*W +S,matwid,P*W*(F+S) +S *W);%分配为稀疏beq = 0 (P*W + S,1);将向量分配为满计数器= 1;%需求满足:ii = 1:Pjj = 1:W xtemp = clearer1;Xtemp (ii,:,jj) = 1;Xtemp2 = clearer2;Xtemp2 (:,jj) = -d(:,ii);Xtemp = sparse([Xtemp (:);xtemp2(:)]');%改为稀疏行Aeq(counter,:) = xtemp;%填写行计数器=计数器+ 1;结束结束每个销售点只有一个仓库:ii = 1:S xtemp = clearer2;Xtemp (ii,:) = 1;Xtemp = sparse([clearer12; Xtemp (:)]');%改为稀疏行Aeq(counter,:) = xtemp;%填写行Beq (counter) = 1;计数器=计数器+ 1;结束

绑定约束和整数变量

整数变量是来自长度(obj1) + 1直到最后。

intcon = P*F*W+1:length(obj);

上界来自长度(obj1) + 1也要到最后。

Lb = 0(长度(obj),1);ub = Inf(长度(obj),1);ub(P*F*W+1:end) = 1;

关闭迭代显示,这样就不会得到数百行输出。包括一个绘图函数来监视解决方案的进度。

Opts = optimoptions(“intlinprog”“显示”“关闭”“PlotFcn”, @optimplotmilp);

解决问题

你生成了所有的求解器输入。调用解算器来找到解。

[solution,fval,exitflag,output] = intlinprog(obj,intcon,...Aineq、bineq Aeq,说真的,磅,乌兰巴托,选择);

{

如果isempty(解决方案)如果问题是不可行的,或者你在没有解决方案的情况下提前停止。disp ('intlinprog没有返回一个解。'返回停止脚本,因为没有需要检查的内容结束

检查解决方案

解决方案是可行的,在给定的公差范围内。

exitflag
Exitflag = 1
infeas1 = max(Aineq*solution - bineq)
Infeas1 = 9.0949 -13
infeas2 = norm(Aeq*solution - beq,Inf)
Infeas2 = 2.1998e-11

检查整数分量是否真的是整数,或者是否足够接近,可以合理地四舍五入。要了解为什么这些变量可能不完全是整数,请参见一些“整数”解不是整数金宝搏官方网站

diint = norm(solution(intcon) - round(solution(intcon)),Inf)
差int = 1.2212e-14

有些整型变量并不完全是整数,但它们都非常接近。整型变量四舍五入。

解(intcon) = round(解(intcon));

检查舍入解的可行性,以及目标函数值的变化情况。

infeas1 = max(Aineq*solution - bineq)
Infeas1 = 9.0949 -13
infeas2 = norm(Aeq*solution - beq,Inf)
Infeas2 = 2.1885e-11
diffaround = norm(fval - obj(:)'*solution,Inf)
扩散= 7.4506e-09

四舍五入的解决方案并没有明显改变其可行性。

您可以通过将其重塑为原始尺寸来最容易地检查解决方案。

solution1 =解(1:P*F*W);%连续变量Solution2 = solution(intcon);%整数变量solution1 =重塑(solution1,P,F,W);solution2 =重塑(solution2,S,W);

例如,每个仓库与多少个销售网点相关联?注意,在本例中,一些仓库有0个关联出口,这意味着在最佳解决方案中没有使用这些仓库。

Outlets = sum(solution2,1)销售网点的总和
媒体=1×203 0 3 2 2 2 2 3 2 3 1 1 0 0 3 4 3 2 3 2 1

绘制每个销售点与其仓库之间的连接关系。

图(h);持有ii = 1:S jj = find(solution2(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——”结束结束持有标题(“销售网点到仓库的映射”

图中包含一个轴对象。从销售网点映射到仓库的axis对象包含43个类型为line的对象。这些对象代表工厂、仓库、销售点。

没有绿线的黑色*代表未使用的仓库。

相关的话题