2017-12-19 1 views
-1

倉庫(4,1,2,10,9)のIDを顧客にどれくらい近づけるかを返すスクリプトがあります。PHPを使用した複数の倉庫における不均一な商品配分のアルゴリズム

$warehouse_rank = array('0'=>4,'1'=>1, '2'=>2, '3'=>10, '4'=>9);

Iデータベースから製品を検索する場合、私は、倉庫在庫および量でそれを持っているの内訳を返します。そうのような:

foreach ($warehouse_rank as $key => $warehouse_id){ 
    if($product_breakdown['storage'][$product_id['output']]['breakdown'][$warehouse_id] >= $posted->order->quantity) { 
    } 
} 

問題は、これが唯一検出しているが:

$product_breakdown = array(
    'storage'=>array(
     '10001'=>array(
      'total_stock'=>89, 
      'breakdown'=>array(
       '4'=>0, 
       '1'=>89, 
       '2'=>0, 
       '10'=>0, 
       '9'=>0 
      ) 
     ) 
    ) 
); 

10001 is the product ID in this case.

私は私はそれを注文することができ、所望の量を持っている倉庫を決定するためにこのループを作っ要求された数量が倉庫で全体として使用可能な場合。

要求された数量が複数の倉庫に分散している場合、どうすればいいのか、私は頭を悩ますことができません。例えば


は:

彼らは、20個を要求します。

そして、配布は以下の通りです。'4'=>5pc, '1'=>5pc, '2'=>1pc, '10'=>8pc, '9'=>10pc

このような

だから、理想的に倉庫が割り当てられます何か:WID:4=5pc, WID:1=5pc, WID:9=10pc.

二つの要因がありますが、どれだけ近い倉庫があります。可能な限り最小限の倉庫での配賦を達成するために必要です。


これにアプローチする方法はありますか。

倉庫の数は動的です。多かれ少なかれ倉庫が存在する可能性があります。最も近い倉庫からできるだけ多くの量を取り出したいと思います。それは私が$warehouse_rankを持っている理由です。

PS。私は実際の注文をする方法の助けを求めていません。倉庫ごとの数量割り当てだけ。

+0

2番目の例のように、顧客は4つの別々のパッケージを合計20個受け取る必要がありますか? – Andreas

+0

これは卸売り顧客向けです。いくつかのケースでは、彼らは部品で注文を受け取り、他の商品では他の商品と組み合わされます。しかし、現時点では必要ではないので、複数の倉庫ごとに特定の数量をどのように配分するのか分かりません。それで、彼らはそれらに割り当てられた量を準備することができます。理想的には、WID:4 = 5、WID:1 = 5、WID:9 = 10 @Andreas – Borsn

+0

のようなものを理想的に得るために、この種の「ベストフィット」アルゴリズムはPHPとは無関係で、 SOにはあまり適していません。 https://softwareengineering.stackexchange.com/ – Sammitch

答えて

1

これを試してください。

まず、十分な量があるかどうかを確認します。それ以外のエコーは十分ではありません。
しかし、何とかそれに対処しなければなりません。
それから鍵は倉庫であり、故障はその家の数量であるループをforeachします。
可能な金額または注文の残量を差し引いて、注文を変数の順序で保存します。

$orderqt = 25; 
if($orderqt <= $product_breakdown['storage']['10001']['total_stock']){ 
    foreach($product_breakdown['storage']['10001']['breakdown'] as $key => &$breakdown){ 
     if($orderqt>0){ 
      $possibleWarehouses = array_filter(
       $product_breakdown['storage']['10001']['breakdown'], 
       function ($value) use($orderqt) { 
        return ($value >= $orderqt); 
       } 
      ); 

      if(count($possibleWarehouses) != 0){ 
       $house = key($possibleWarehouses); 
       $order[$house] = $orderqt; 
       $product_breakdown['storage']['10001']['breakdown'][$house] -= $orderqt; 
       $orderqt = 0; 
      }elseif($orderqt >= $breakdown){ 
       $orderqt -= $breakdown; 
       $order[$key] = $breakdown; 
       $breakdown = 0; 
      }else{ 
       $order[$key] = $orderqt; 
       $orderqt = 0; 
       $breakdown -= $orderqt; 
      } 
     }else{ 
      break; 
     } 
    } 
}else{ 
    echo "not enough"; 
} 
var_dump($order,$product_breakdown); 

倉庫に注文数量以上の在庫があるかどうかを確認するためにarray_filterが追加されました。
$ possibleWarehousesは、発注された残りの量をフルフィルにできる倉庫を保持する配列です。 この場合、NULL、NULL、倉庫9(数量10)です。
https://3v4l.org/ZeUrt

+0

あなたの質問に答えるには、3つではなく4つのパッケージを意味するからです。近づくことも重要ですが、できるだけ少ないステップ(倉庫)で可能にすることもできます。 – Borsn

+1

@Borsn Yeah!私はあなたのコメントを見ました。私は息子を寝かせなければならなかった。すぐに修正で完了 – Andreas

+1

@Borsn orderをフルフィルティングするのに十分な供給量の倉庫を見つけるには、array_filterを使用してupdateを参照してください。 – Andreas

2

生成された列を追加するようにデータベースクエリを変更します。各倉庫から顧客までの距離を計算しますか?サプライチェーンに追加された各追加倉庫を補うために、この合計に定額の重み付け値を追加します。

結果を在庫量で除算して、各倉庫から供給される単位図あたりのコストを取得します。注文のための十分な在庫があるまで上からこの列のピックのデータベースクエリを注文してください。

ですから、このようなテーブルがあります。

CREATE TABLE IF NOT EXISTS `stock` (
    `warehouse` char(11), 
    `stock` int(10), 
    `distance` int(10) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `stock` (`warehouse`, `stock`, 
`distance`) 
VALUES 
('A', 4, 3), 
('B', 6, 8), 
('C', 10, 10); 

をそしてstock + 15 15は、追加したい加重値であり、あなたは、このようにそれを照会:HERESに

SELECT *, ((stock + 15)/distance) AS per_unit 
FROM stock 
ORDER BY stock DESC, per_unit ASC 

demo sqlfiddle

+0

私はフラットレートの重み付けの考えが好きです。しかし、私は分裂の部分で混乱する。より視覚的に説明できますか? – Borsn

+0

私の回答を更新し、デモへのリンクを追加しました。各ユニットを納入するための費用を得るために、在庫の単位数で割ります。その後、重み付け要因のために10マイル離れた倉庫は在庫が10個あり、2倉庫は5マイル離れて5個あります。同様に、わずか1台で1マイル離れた倉庫には、費用対効果の高いオプションではないので、あなたが望むものが届きます。 – miknik

+0

私は間違いなくこれを考慮に入れます! 15の製品は何ですか?それとも無作為に選んだのですか? – Borsn