。
この例では,混合整数线形计画问题を设定および解决する方法を说明します。问题は,一连の工场,仓库,贩売店间の生产および流通の最适レベルを求めることです。问题ベースのアプローチについては那工厂,仓库,贩売店割り当て:问题ベースを参照してください。
この例では,まず工场,仓库,贩売店のランダムな位置を生成します。スケーリングパラメーター を自由に変更し,生产およびおよび通施设が配置さている両両ののサイズをすると共に,グリッドエリアの各ののの密度 に依存しないよう,これらの施设の数号スケーリングします。
特价のスケーリングパラメーターの値 には以下があるとします。
个の工场
个の仓库
个の贩売店
これらの施设は, および 方向でと1 の间にある别个の整数グリッド点にあります。施设が别个の位置をもつためには, である必要があります。このこの例で, 那 那 那 とします。
工艺では, 個の製品が製造されています。 とします。
店 における各制品 の需要は です。需要とは,ある期间において贩売可能な数量です。このモデルの制约の1つは需要を満たすことです。つまり,システムが需要に厳密に见合う数量を生产および供给することです。
各工艺および仓库にはははの制约ががありありますますますます。
工艺 における制品 の生产は 未満です。
仓库 の销量は です。
特价の晚期にに から贩売店に输送できる制品 の数量は 未満です。ここで, は制品 の回転率です。
各贩売店は1つの仓库からのみをのものとしします问题の贩売て,仓库に対し贩売店を最もコストコストに配置することありことありありありますありますありありありありあり
工厂の仓库および仓库贩売店店までのの品输送コスト,空间の距离およびおよびおよびに异なり。 が施设 と の间の距离であるととと,これらの施设间で制品 を出荷するコストは输送コスト に距离を乘算した値になります。
この例における距离は 距离とも呼ばれるグリッド距离です。これは 座标と 座标の差の绝対値の総和です。
工艺 で制品 を1単位生产するコストは です。
一道のの施设の位置と需要および力の制约所与としてとしてとして,以下をます。
各工场における各制品の生产レベル
工场から仓库への制品の出荷スケジュール
仓库から贩売店へへ制品の出荷スケジュール
これらの数量は,需要が満たされ,総コストが最小化されるものでなければなりません。また,各贩売店はすべての制品を1つの仓库からのみ受け取る必要があります。
制御変数(最适化において変更可能な変数)は以下のとおりです。
=工艺 から仓库 に输送する制品 の数量
=贩売店 が仓库 と关键词られられられているに値がががに値が
最小化する目的关数は以下のとおりです。
制约は次のとおりです。
(工场の能力)。
(需要を満たす)。
(仓库の销量)。
(各贩売店が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 * 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分%的下载188bet金宝搏产品%生产成本20到100之间pcost = 80 * rand(f,p)+ 20;每种产品/工厂的500平方程的产能率为500和1500PCAP = 1000 * RAND(F,P)+ 500;每个产品/仓库的P * 400和P * 800之间的%仓库容量WCAP = P * 400 *兰特(W,1)+ P * 400;每种产品的1和3之间的%产品变化率转= 2 * rand(1,p)+ 1;每种产品的每距离5到10的产品运输成本tcost = 5 * rand(1,p)+ 5;按销售额%产品需求200和500之间的出口为每%产品/出口d = 300 * rand(s,p)+ 200;
これらのランダムな需要と能力によって実行不可能な问题につながることがあります。つまり,需要が生产と仓库の能力を超える场合があります。パラメーターを変更して実行不可能な问题が発生した场合,解を生成する际に终了フラグ-2が表示されます。
intlincon
の目的关数ベクトルobj.
は,参数
および
の系数で构成されます。したがって,当然obj.
にはp * f * w + s * w
系数が。
系数を生成する1つの方法は,
系数にp-by-fy-w
配列OBJ1
那
系数にS-BY-W
配列OBJ2
を使用して开始することです。次にこれらの配列を2つのベクトルに変换し,以下を呼び出すことによって,これらをobj.
に结合します。
OBJ = [OBJ1(:); OBJ2(:)];
OBJ1 =零(P,F,W);%分配阵列OBJ2 =零(S,W);
目的关节および制约のと行列の生成血流传球仪, 配列または 配列を生成し,その结果をベクトルに変换します。
入力の生成を开放するには,距离の配列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 DISTSW(II,JJ)= ABS(XLOC(F + W + II) - XLOC(F + JJ))......+ ABS(YLOC(F + W + II) - YLOC(F + JJ));结尾结尾
OBJ1
とOBJ2
のエントリを生成します。
为了II = 1:P为了JJ = 1:F为了KK = 1:W OBJ1(II,JJ,KK)= pcost(JJ,ⅱ)+ tcost(ⅱ)* distfw(JJ,KK);结尾结尾结尾为了II = 1:S为了JJ = 1:W OBJ2(II,JJ)= distsw(II,JJ)*和(d(二,:)* tcost。);结尾结尾
エントリを1つのベクトルに结合します。
OBJ = [OBJ1(:); OBJ2(:)];%obj是目标函数矢量
ここで制約行列を作成します。
各线形制约行列の幅はobj.
ベクトルの长さです。
matwid =长度(OBJ);
线形不等式には,生产能力の制约と仓库能力の制约の2种类があります。
生产触力の制约P * F.
と仓库仓库力の制约W.
があります。制约行列は1%非ゼロの顺序できわめて疎であるため,スパース行列を使ってメモリを保存します。
Aineq = spalloc(p * f + w,matwid,p * f * w + s * w);%分配稀疏AEQbineq =零(p * f + w,1);%分配bineq为全尺寸方便的零矩阵:lemener1 = zeros(尺寸(obj1));clearer12 = clearer1(:);lemener2 =零(尺寸(obj2));Clearer22 = Clearer2(:);%首先生产容量约束计数器= 1;为了II = 1:F为了JJ = 1:P = xtemp clearer1;xtemp(JJ,II,:) = 1;在仓库的每个产品和工厂总和%xtemp =稀疏([xtemp(:); clearer22]);%转换为稀疏Aineq(计数器,:) = xtemp';%填写Bineq(计数器)= PCAP(II,JJ);计数器=计数器+ 1;结尾结尾现在仓库容量有限VJ =零(S,1);%乘数为了JJ = 1:S VJ(JJ)= SUM(D(JJ,:) ./转弯);P个元素的%A总和结尾为了II = 1:W = xtemp clearer2;xtemp(:,ⅱ)= VJ;xtemp =稀疏([clearer12; xtemp(:)]);%转换为稀疏Aineq(计数器,:) = xtemp';%填写Bineq(计数器)= WCAP(II);计数器=计数器+ 1;结尾
线形等式制约は,需要を満たす制约と各店が1つの仓库に対応制约ののの2种类があり。
AEQ = spalloc(p * w + s,matwid,p * w *(f + s)+ s * w);%分配不如疏BEQ =零(P * W + S,1);%分配向量计数器= 1;需求需求满足:为了II = 1:P为了JJ = 1:W XTEMP =更清晰;XTEMP(II,:,JJ)= 1;xtemp2 =更清晰的2;XTEMP2(:,JJ)= -D(:,II);xtemp = sparse([xtemp(:); xtemp2(:)]);%变为稀疏行AEQ(计数器,:) = XTEMP;行填充%计数器=计数器+ 1;结尾结尾每次销售渠道只有一个仓库:为了II = 1:S = xtemp clearer2;xtemp(II,:) = 1;xtemp =稀疏([clearer12; xtemp(:)]');%变为稀疏行AEQ(计数器,:) = XTEMP;行填充%Beq(计数器)= 1;计数器=计数器+ 1;结尾
整数変数は长度(OBJ1)+ 1
から最后までとなります。
INTCON = P * F * W + 1:长度(OBJ);
上限も长度(OBJ1)+ 1
から最后までとなります。
lb =零(长度(obj),1);UB = INF(长度(obj),1);UB(P * F * W + 1:END)= 1;
何百分子力量の表示表示されに,反复表示をオフしします解决进行状况监视するするためプロット关键
opts = Optimoptions('intlinprog'那'展示'那'离开'那'plotfcn',@ optimplotmilp);
ソルバーの入力がすべて生成されました。ソルバーを呼び出して解を求めます。
[解决方案,FVAL,EXITFLAG,输出] = INTLINPROG(OBJ,INTCON,......Aineq,Bineq,AEQ,BEQ,LB,UB,OPTS);
如果的isEmpty(溶液)%如果问题是不可行的,或者你有没有解决方案提前终止DISP('intlinprog没有返回解决方案。)返回%停止脚本,因为没有什么检查结尾
解は指定された许容误差の范囲内で実行可能です。
ExitFlag.
EXITFLAG = 1
Infeas1 = Max(Aineq *解决方案 - Bineq)
Infeas1 = 8.2991e-12
infeas2 =规范(AEQ *溶液 - BEQ,天道酬勤)
Infeas2 = 1.6428E-11
これらの妥当しますである确认しますますかをしに整するをしににするが厳密ににするがににではない性がにのをするが厳密をを性がににを性しににする性しににする性ににに。一部の“整数”解は整数ではないを参照してください。
diffint =范数(溶液(INTCON) - 轮(溶液(INTCON)),天道酬勤)
闪烁= 1.1990E-13
整数変数が厳密に整数ではない场合がありますが,すべて整数に非常に近い変数です。したがって整数変数を丸めます。
溶液(INTCON)= ROUND(溶液(INTCON));
丸めた解の実行可能性と目的关数値の変更を确认します。
Infeas1 = Max(Aineq *解决方案 - Bineq)
Infeas1 = 8.2991e-12
infeas2 =规范(AEQ *溶液 - BEQ,天道酬勤)
infeas2 = 5.8435e-11
diffrounding =规范(FVAL - OBJ(:)'*溶液,天道酬勤)
Diffrounding = 1.8626E-08
解の丸めによって,その実行可能性は目につくほどには変更されませんでした。
。
解决方法1 =溶液(1:P * F * W);%的连续变量solution2 =解决方案(INTCON);%整数变量解决方法1 =重塑(解决方法1,P,F,W);溶液2 =重塑(溶液2,S,W);
たとえば,各仓库に关连付けられている贩売店数はいくつでしょうか。この场合,一部の仓库は关连付けられた店铺がゼロであることに注意してください。これは,仓库が最适解で使用されていないことを示します。
网点=总和(solution2,1)%琛在销售网点
outlets =1×203 0 3 2 2 2 3 2 3 1 1 0 0 3 4 3 2 3 2 1
各贩売店とその仓库间の接続をプロットします。
图(H);抓住在为了II = 1:S JJ =查找(解决方案2(II,:));仓库的%索引与ii相关联XSALES = XLOC(F + W +ⅱ);ysales = yloc(F + W +ⅱ);xwarehouse = XLOC(F + JJ);ywarehouse = yloc(F + JJ);如果兰特(1)<0.5%第一绘制y方向上一半的时间plot([xsales,xsales,xwarehouse],[ysales,ywarehouse,ywarehouse],'G - ')别的%绘制x方向的第一时间的其余部分图([XSALES,xwarehouse,xwarehouse],[ysales,ysales,ywarehouse]'G - ')结尾结尾抓住离开标题(“销售网点映射到仓库”)
绿色の线がない黒い*は使用されない仓库を表します。