自動編成/スマート在庫システム?


11

過去1週間、Unity3Dを使用して在庫システムに取り組んできました。最初はDesign3の人たちから助けを得ましたが、パスを分割するまでそれほど長くありませんでした。彼らのコードのやり方が本当に好きでなかったので、OOPの匂いはまったくありませんでした。

私はさらに一歩進んだ-アイテムは複数のスロット、高度な配置システム(アイテムはベストフィットを見つけるために最善を尽くす)、ローカルマウスシステム(マウスはアクティブなバッグ領域に閉じ込められる)などをとります

これが私の作品のデモです。

私たちがゲームに入れたいのは、自動整理機能ではなく、自動整理機能です。この機能が必要なのは、インベントリが「リアルタイム」になるためです。バイオハザード1、2、3などでは、ゲームを一時停止してインベントリで何かを行うのとは異なります。ゾンビに囲まれた粘着性のある状況で自分を想像してみてください。弾丸はなく、周りを見回すと、地面に近くに弾丸があることがわかります。そのため、弾丸を手に取り、拾ってみますが、弾丸はありません合わない!あなたはあなたの持ち物を見て、あなたがアイテムのいくつかを再編成するならば、それが合うことを見つけます!-現在、プレーヤー-ゾンビに囲まれているため、再編成する時間がないため、スペースを確保するために停止して在庫を整理すると、死亡します(在庫をリアルタイムで記憶し、一時停止しないでください)- それが自動的に行われるのはいいことですか?- はい!

(これはDungeon siegeなどの一部のゲームに実装されていると思うので、実行可能であることを確認してください)

たとえば、この写真を見てください。

自動並べ替えの機能

はい、そのため、問題を自動並べ替えると、スペースが表示されますが、次の理由で不良です。左下に移動すると、自動ソートと同じスペースが得られます。2-「それはFが私のものを再注文するように誰に言ったのですか?」

私はこれのために「コードを書く方法」を求めているのではなく、いくつかのガイダンスを求めています。これはグラフや最短経路に関するものですか?大学での勉強を続けることができなかったのではないかと思います:/でも、もしそうなら、教えてください。関連することを学びます。

解決策は1つだけではないことに注意してください。だから私が最初にしなければならないことは、状況が「解決可能」かどうかを判断することだと思います。状況が解決可能かどうかを判断する方法を知っていれば、「解決」できます。私はそれを「解決可能」にする条件を知る必要があるだけです。そして、これにはいくつかのアルゴリズム/データ構造が必要だと思います。

これは、1x3のアイテムをフィットさせようとする複数のソリューションの写真です。

ここに画像の説明を入力してください

矢印は解決策の1つを示していますが、見れば、複数の解決策が見つかるはずです。これは私が最終的に自動分類しないものですが、解決策を見つけてそれを適用します。

私がそれに時間を費やした場合、私はそれを解決する方法を思い付くでしょうが、それは最善の方法ではないでしょう、それは、あなたの手ではなく足で車の車輪を握るようなものです!XDまたは、配列が必要な問題を解決しようとするのと同じですが、それらの存在をまだ認識していません。これに対する正しいアプローチは何ですか?

解説からの更新

@Stephen私は本当にAlogsの第一人者ではありません。あなたは「ナップサック」と@BlueRajaについて言及しました-Danny Pflughoeftは2Dビンのパッキングアルゴについて言及しました。それらはどういうわけか関連/同じですか?-私はこれにどのように取り組むべきかについてまだ混乱しています。

そして、はい、私はすでに「ヒューリスティック」を使用していますが、自分がそうであるとは本当に知りませんでした。Dは、最初の使用可能なスロットを見つけ、アイテムがそこに収まるかどうかを確認します。

たとえば、2x2と1x4のアイテムがあるため、それらの「かさ高さ」(nSlotsRequired = nRowsReq * nColsRecと呼びます)に基づいてアイテムを注文しても機能するかどうかはわかりません。次の項目の残りの部分に異なる影響を与えます。そう... :/

私はこのビデオを見、完全な梱包のアイデアが本当に好きでしたが、在庫が2Dであるため、どうすればよいか疑問に思います。私が複数のバッグを持つことができるのは確かですが、ビンの梱包がここでの鍵であるかどうかさえわかりませんが、ゲームでは1つのバッグになるだけです。つまり、「1つの」バッグにアイテムを収めることだけが問題です。したがって、そのvidの例(パイプとバス)は実際には私の問題と一致しません。また、このナップザックの事柄についても注意深く見ましたが、「値」がアイテム/在庫にどのように関連しているかはわかりませんでしたが、「重量」はかさ高さと同じだと思います。


7
これは2Dビンパッキング、つまりNP-Completeです。そのため、すべての項目に適合できるかどうかを通知するアルゴリズムは、(最悪の場合)非効率的です。ただし、かなり良い近似アルゴリズムを見つけることができます。
BlueRaja-Danny Pflughoeft 2013年

これが、私がこれよりも(最近の一般的な)1スロット/アイテムタイプの在庫モデルを決定した理由です。私はあなたのための解決策があればいいのに、私はこの問題をあきらめました...
Ryno

@ BlueRaja-DannyPflughoeftアイテムが特定の形状に制限されている場合、シンプルで効率的なアルゴリズムが利用できるかどうか疑問に思いますか?
congusbongus 2013年

形状を制限しても複雑さは減りませんが、考えるのが簡単になるので、複雑さは処理されたと思います。
Patrick Hughes

@VeXeすみません、あなたの質問の更新を見逃しました。箱詰めとナップザックは同じではありません。しかし、どちらも梱包の問題です。あなたの場合の「価値」は、在庫オブジェクトの形状とサイズです。
スティーブン

回答:


8

これはナップザック問題のバリエーションです。Danny Pflughoeftが言及するように、それはNP-Completeです。私が正しく覚えていれば、それは線形時間で解決できないことを意味します。

しかし、いくつかのステップでこれを解決することができます。これは基本的に並べ替えの問題です。

まず、各アイテムの「かさ高さ」を計算します。これはいくつかの方法で計算できます。

  • かさ高さ= max(長さ、幅);

  • かさ高さ=長さ*幅

  • かさ高さ= sqrt(長さ*幅)

次に、スコアが最も高いアイテムを最初にインベントリに配置します。後で残りのスペースに収まらない可能性が高いためです。小物はいつも収まります。

配置戦略には、ヒューリスティック(知識に基づいた推測のためのファンシーな名前;-))が必要です。左上から何か最初の空きスロットにアイテムを収めようとするようなもの。

ディアブロIIの在庫分類戦略は、私が思うにやや似たような働きをしました。剣や槍のようなものは左上になり、次に服と鎧、そしてバックラーなどになります。

私はあなたが本当にこれを試してみて、アルゴリズムが適切に機能するようになるまでアルゴリズムを微調整する必要があると思います(異なるバルク計算、異なるヒューリスティック)。


1
NP-completeは、多項式よりも複雑な問題のセットです。在庫が比較的少ない場合(アイテム数が1000未満の場合:))は、指数アルゴリズムでも非常に高速に動作します。これは、このようなアルゴリズムの1つのステップにかかる時間がほとんどないためです。それにもかかわらず、あなたのアイデアを使用することは、動的プログラミングアルゴリズムを実装するよりも十分簡単である必要があります-> +1
MartinTeeVarga

賛成票のthx。ええ、在庫は無限ではないはずなので、指数アルゴリズムはうまく機能するはずです^^
Stephen

@ sm4:通常、1,000はNP完全問題の膨大な数です。これらの問題はO(2 ^ n)であることを覚えておいてください-2 ^ 64でさえ計算上実行不可能です!
BlueRaja-ダニーPflughoeft 2014年

3

ハハ、@助けてくれたみんな、ありがとう。ようやく解決しました。これが私が基本的にしたことです:

IEnumerator AddItem_Sorted (Item item)
  1. 簡単な条件:アイテムが収まる最小のnRequiredSlotsがあるかどうかを確認します。ある場合は続行します...
  2. すべてのバッグを空にします-アイテムをプレースホルダー(リストなど)に入れます
  3. 必要なアイテムをそれが収まる非常に最後のスロット/場所に追加し、水平方向の形状であることを確認します
  4. 最初の減少アルゴリズムを使用して、残りのアイテムを追加します
  5. 追加中に、動的プログラミング(メモ化)を使用して、追加するインデックス(次の使用可能なスロットのインデックス)を記憶します
  6. すべての追加が成功した場合は、必要なアイテムに合わせて、なんとかしてバッグを大小のアイテムに分類できました。
  7. すべてのアイテムを追加できなかった場合、これは解決可能な状況ではなかったので、バッグを以前の状態に戻す必要があります
  8. これを行う1つの方法(私の心の表面から出てきた)は、この操作全体の前にバッグの状態をコピーすることです。失敗した場合は、以前の状態にスナップします。バッグを空にすると、各アイテムがどこにあったかを記憶するので、操作が失敗した場合、以前のインデックスでAddItem(item、index)を使用してそれらを元に戻します:)
  9. このプロセス全体には時間がかかる可能性があるため、負荷を別々のフレームに分割し、私の素敵な収量を使用することができます:)
  10. やった!\ m /(@〜9:00)

更新:

  1. 追加したすべてのアイテムのインデックスを格納する配列を作成しました。これにより、空きスロットを探して解放する必要がなくなります-大きなブースト。

  2. 最後のスロットに追加する必要はありません。実際にはそれがうまくいかない場合があります。必要なアイテムを他の残りのアイテムに追加して、並べ替えました。

ビデオからわかるように、少し最適化する必要があります。並べ替えは完全ではありません。フルビンパッキングを使用したいのですが、すでにパフォーマンスを重視しています。私は最適化の提案を受け入れます。ありがとうございます:)


どういたしまして!:) BlueRaja-箱詰めに言及してくれたDanny Pflughoeft、かさばるアイデアに@Stephen、動的プログラミング講義とすべての講義にRichard Bucklandに感謝します。
vexe 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.