ダイナミックソルバー場所配分問題


レイアウト:POSTの
タイトル:動的プログラミングに基づいて、位置割り当てアルゴリズム
字幕:倉庫場所割り当てピッキング人々の最適化された到来用いて経路長を選ぶ
日:2020年1月15日
著者:ZSの
ヘッダ-IMG:IMG / POST-BG web.jpg - ios9
Cataog:真の
タグ:
-動的プログラム
- Mathimatics -数値アルゴリズム
-スケジュール

倉庫場所の割り当てを選ぶ人の到着を最適化するためにピッキング経路長を使用

私たちの読者はみなさん、こんにちは、ZSは、今日の配分問題の場所を解決するために、動的プログラミングアルゴリズムの使用を共有することができます。正確なルート長の式とピッカーツー部品倉庫の保管場所割当ヒューリスティック:主なアイデアは、紙から来ます。動的プログラミングアルゴリズムは常に人々のでした本当に崩壊を書いたとき、いつもあなたが一緒にストロークをすることができます限り、イデオロギーが地すべりではないとして、社会主義のコアバリューを信じるように、小さなシリーズは、ちょうどこのプログラムを書き始め、頭アルゴリズム傷されていますアイデア!上、自宅に近いです!

動的プログラミングアルゴリズムの代表例

最短パスのための1つの動的計画
元の問題のための動的プログラミングアルゴリズムの核となるアイデアは、サブ最適解最適解によって解決されます。、AからDへの最短パス、AはPAC1 C1最短経路、PAC2 C2にAからの最短経路から知られている場合、AからPAC3図1に示す最短C4にAからの最短経路にC3。1パスPac4。次いで、DのAからの最短経路は、分{PAC1 + C1D、PAC2 +である C2D、PAC3 + C3D、Pac4 + C4D}
そうステップによって前進ステップを動かす、最短経路を算出することができます。

はじめに場所配分問題

図2倉庫レイアウト
図2に示すように、枠の長手方向チャネルの両側の棚、。前部および後部横方向シェルフを接続する2つのチャネル。長手方向チャネル棚に対して対称、無差別およびアウトキャリー、同じ列に属する2つのこと。

簡体

  •   按需求频率由大到小将货物分为A,B,C三类。(需求频率:给定订单,需要各类货物的占比)
    
  • 货物数目和库位数目相等。各类货物总数一定。
    

目的

  • 各位置は、商品の種類と一致すると合理的

確率仮説

  • 注文を選ぶ確率を与えられた各A、B、Cの共感をピッキング等しいです。
  • 各積荷場所に商品を割り当てるために選択される特定の確率を有し、それはどこかを選ぶ確率を決定します。PIJこのアルゴリズムは、より重要な変数です。
  • 倉庫最適化問題における商品の流通------ >>>>ピッキング倉庫分布の問題の可能性

評価 - 平均経路長を選びます

例えば、式ピッキング戦略に(四種類の合計)を返すために3

図4は、目的関数
図4図3、例えば、目的関数は、最適化クラス物流倉庫品として、所与の確率分布、ピッキングの平均経路長を解決するためにポリシールーティング。

ダイナミックソルバー場所配分問題

:倉庫4×4パターンでは、A、Bの動的プログラミングアルゴリズムは、商品の二種類説明
vで[M] [NA] [ NB]が副問題、商品がNA、チャネルの前に割り当てられたNB Mを表します。

5動的ソルバー位置配分問題

/*
		动态规划算法的伪代码
*/
for i←0 to all
      for j←0 to all-i
            k←all-i-j
            if   i,j,k 不符合约束条件 
                 then continue
             culum cu(i,j,k)
            cu.Sofar_length←某较大的数
            for o←0 to all_last
	for p←0 to all_last-o
	      q←all_last-o-p
	      if  o,p,q 不符合约束条件 
	           then continue
  	      计算 zi
	      culum cu(zi)
	     cu.计算转化成本
	     if  转换成本+v[m-1][o][p]<cu.Sofar_length
                            更新 cu
v[m][i][j]←cu

コードの実装

/************************动态规划算法的核心*************************************************************/
 void calcul::doDP(vector<answer> *ans)
{
	culum ***v;
	v=new culum **[M];	
	for(int m=0;m<M;m++)
	{	
		if(m==0)
		{
			int all=N;
			v[0]=new culum * [all+1];
			for(int i=0;i<=all;i++)
				{
					 v[0][i]=new culum[all-i+1];
					for(int j=0;j<=all-i;j++)		
					{
						int k=all-i-j;
						if(calcul::panduan(i,j,k))//判断是否满足各类数目小于总货物数
							continue;
						culum cu; 

						cu.calcul_cost(1,i,j,k,i,j,k); // 第一批i,j,k到某通道用到的货物个数统计,第二批ijk该通道货物数统计
				
						cu.set_lastABC(0,0,0);

						cu.Sofar_length=cu.get_cost();
						v[m][i][j]=cu;
					}
				}
		}		
		else if(m!=(M-1)) //不是最后一个通道也不是第一个通道的情况 
		{
			int all=N*(m+1);
			v[m]=new culum *[all+1];
			for(int i=0;i<=all;i++)
				{
					v[m][i]=new culum[all-i+1];
					for(int j=0;j<=all-i;j++)		
					{
						int k=all-i-j;
						if(calcul::panduan(i,j,k)) //判断是否满足各类数目小于总货物数
							continue;					
						int all_last=N*m;
						
						culum cu;
						culum cu_temp; 

						cu.Sofar_length=9999;
						//穷举前一个通道所有状态解,就是查询数组,并且和本阶段的状态结合,取最优
						for(int o=0;o<=all_last;o++)//穷举上一个通道解的状态
							{
								for(int p=0;p<=all_last-o;p++)
								{	
									int q=all_last-o-p;
									if(calcul::panduan(o,p,q)) //判断是否满足各类数目小于总货物数
										continue;
									int ma=i-o; 	// (i-o) m通道a个数 
									int mb=j-p;		//(j-p)  m通道b个数
									int mc=k-q;  	//(all-i-j)-(all_last-o-p)  m通道c个数
									if((ma<0)||(mb<0)||(mc<0)) //m通道不可行  但是没有用最优化条件
										continue;	
									if((ma+mb+mc)!=N)  //这一项是必须的 保证ma(或者mb,mc)不超过N
										continue;  //只有加和为N才能继续运行 否则跳转
									int lastI=o-v[m-1][o][p].lastA;
									int lastJ=p-v[m-1][o][p].lastB;
								//	int lastK=q-v[m-1][o][p].lastC;
									if(ma>lastI||(ma+mb)>(lastI+lastJ)) //最优化条件,条件要搞清楚
										continue;	
								
									cu_temp=v[0][ma][mb]; //单个通道的库位分配 只有库位分配 ELi enterprob有价值
								
									cu_temp.calcul_cost(m+1,i,j,k); //计算lastprob,Elc,以及cost 
								
								
									if(v[m-1][o][p].Sofar_length+cu_temp.get_cost()<cu.Sofar_length)
									{
										cu=cu_temp; //除了Sofar_length和 lastABC都已经更新完毕

										cu.Sofar_length=v[m-1][o][p].Sofar_length+cu.get_cost();

										cu.set_lastABC(o,p,q);//cu.lastA=o;cu.lastB=p;cu.lastC=q;									
									//这里m=2~M-2是第3~M-1通道 ,o p 是状态(m,i,j)的上一状态最优解
									}														
								}

							}

						v[m][i][j]=cu;						
					}
				}
		
		}
		else //对应最后一个通道情况 m=M-1时
		{
			int i=overall_A;
			int j=overall_B;
			int k=overall_C;
			v[m]=new culum *[1];
			v[m][0]=new culum[1];

			int all_last=N*m;	
			
			culum cu; //1 代表通道号
			cu.Sofar_length=9999;
			culum cu_temp; 
			//穷举前一个通道所有状态解,就是查询数组,并且和本阶段的状态结合,取最优
			for(int o=0;o<=all_last;o++)//穷举上一个通道解的状态
				{
				for(int p=0;p<=all_last-o;p++)
					{	
						int q=all_last-o-p;
						if(calcul::panduan(o,p,q)) //判断是否满足各类数目小于总货物数
							continue;
						int ma=i-o; 	// (i-o) m通道a个数 
						int mb=j-p;		//(j-p)  m通道b个数
						int mc=k-q;  	//(all-i-j)-(all_last-o-p)  m通道c个数	
						if((ma+mb+mc)!=N)
							continue;
						if(ma<0||mb<0||mc<0) //m通道不可行  但是没有用最优化条件
							continue;				
						int lastI=o-v[m-1][o][p].lastA;
						int lastJ=p-v[m-1][o][p].lastB;
					//	int lastK=q-v[m-1][o][p].lastC;
						if(ma>lastI||(ma+mb)>(lastI+lastJ)) //最优化条件
							continue;					
																
						cu_temp=v[0][ma][mb];

						cu_temp.calcul_cost(m+1,i,j,k);
					
						if(v[m-1][o][p].Sofar_length+cu_temp.get_cost()<cu.Sofar_length)
						{
							cu=cu_temp;
							cu.Sofar_length=v[m-1][o][p].Sofar_length+cu.get_cost();
							cu.set_lastABC(o,p,q);//cu.lastA=o;cu.lastB=p;cu.lastC=q;			
							//这里m=2~M-2是第3~M-1通道 所以 o p 是状态(m,i,j)的第一个通道最优解				
						}	
									
					}
				}
			v[m][0][0]=cu;						
		}
	}

実験結果

(実施例6)図入力データ

実施例7の出力データ

図7の各行は、チャネル倉庫を表します。列1はチャンネル番号であり、2,3,4列は、貨物の種類の数であり、最後のものは、評価値です。

リファレンス

[1] Arjan S.ダイクストラ、キース月Roodbergen。正確な経路長の式とピッカー・ツー・部品倉庫[J]の保管場所割当ヒューリスティック。交通研究パートE、2017,102。

出版元の記事 ウォンの賞賛0 ビュー12

おすすめ

転載: blog.csdn.net/weixin_40300702/article/details/104696224