質問

minecraft のようなゲームをデザインしているとします $ i_1、i_2、...、i_n \ in $ < / SPAN>と束のレシピ $ R_1、R_2、...、R_M \ in r $ 。レシピは関数です $ R :( i \ Times \ Mathbb {n})^ n \ requearrow i \ times \ mathbb {n} $ 、それはいくつかのアイテムを取ります負でない整数重みを持ち、別の項目の整数量を生成します。

例えば、 Minecraft のケーキのレシピは次のとおりです。

3ミルク+ 3小麦+ 2砂糖+ 1卵<スパンクラス="Math-Container"> $ \ rightarrow $ 1

...とトーチのレシピは次のとおりです。

1スティック+ 1石炭 $ \ rightarrow $ 4トーチ

いくつかのレシピが可逆的になる可能性があります。 9ダイヤモンド<スパンクラス="Math-Container"> $ \ LeftrightArrow $ 1ダイヤモンドブロック

レシピの組み合わせがある場合は、ゲームが不十分なアイテムを獲得するために繰り返し適用できます。これはバランスが悪く、これはプレーヤーによって悪用されます。 アイテムを節約するレシピでゲームを設計すること、またはおそらくいくつかのアイテムを失う(現実世界の熱力学エントロピー - トーストを簡単に燃やすことはできません)。

レシピのセットがあるかどうかを決定できる効率的なアルゴリズムは次のとおりです。

  • アイテムを節約しますか?
  • は、アイテムを非効率に失う?
  • アイテムをゲイン?

ゲームが不均衡な場合に問題のあるレシピを見つけることができる効率的なアルゴリズムはありますか?

私の最初の考えは、ここでグラフ構造/最大フローの問題があることですが、それは非常に複雑で、それがナップザック問題に似ています。あるいはそれはSATの問題として策定されるかもしれません - 私が現時点でそれをコーディングすることを検討するものですが、より効率的なものが存在するかもしれません。

行列 $ \ mathbf {r} ^ {m \ times n} $ のレシピをエンコードすることができ、ここで行はレシピと列に対応します。項目がレシピによって消費されている場合、列エントリはネガティブ、レシピによって生成された場合は正の場合はゼロになります。グラフサイクル検出のためのよく知られている行列法と同様に、 $ \ mathbf {r} $ \ mathbf {r} $ を高電力にして、各行の合計を取得して項目が表示されます。合計は上がり続け、バランスが取れた、または否定的に行く。しかし、私はこれが常に機能すると確信していません。

議論、コード、または推奨読み取りが非常に高く評価されています。

役に立ちましたか?

解決

これは線形計画法で解決可能であるべきです。

背景とセットアップ

状態ベクトルを持っている各項目の数の数のベクトルにすることができます。可能なアイテムが牛乳、小麦、砂糖、卵、ケーキ、ダイヤモンド、そしてルール

3ミルク+ 3小麦+ 2砂糖+ 1卵<スパンクラス="Math-Container"> $ \ rightarrow $ 1

は、 $( - 3、-3、-2、-1,1,0)$ を追加して状態ベクトルに影響します。そのため、 $ a_i $ $ i $ の変更ベクトルを表します。

商品を取得する

リニアプログラム

に実現可能な解決策がある場合には、バインドされずに項目を得る方法があると主張している。

$$ a_1 x_1 + \ dots + a_n x_n \ ge(0,0、\ dots、0)、x_1 \ ge 0、\ dots、x_n \ ge 0 $$

$ A_1 x_1 + \ dots + a_n x_n>(0,0、\ dots、0)$ 。ここでspan class="math-container"> $ \ ge $ は、PointWideではベクトルで定義されています(つまり、 $ u \ ge v $ iff $ u_i \ ge v_i $ すべての $ i $ の場合と同様に $> $ 。これは線形プログラムとして表すことができます。 $ A_1 x_1 + \ dots + a_n x_n $ の座標の合計を最大にします。したがって、線形プログラミングソルバーを使用して多項式時にそれを解くことができます。これは、一部の項目を拘束せずに得る方法があるかどうかをあなたに知らせてください。

クレームが正しいのはなぜですか?まあ、リニアプログラムに実現可能な解決策がある場合、それはバインドなしのいくつかの項目の数を拡大する方法を提供します。特に、各項目の数の非常に多数の各項目から始めてから、ルール1を適用する $ x_1 $ 時間、規則2 $ x_2 $ 回数など、 $ a_1 x_1 + \ dots + a_n x_n $ < / SPAN>は、少なくとも各成分の大きいものであり、少なくとも1つの構成要素において厳密に大きい。さらに、十分に多数のアイテムから始めたら、ルールを適用する中間ステップで「否定的に」することはありません。この線形プログラムに対する解決策がある場合、合理的な解決策は整数内の解をもたらす(適切な定数に乗算する)。

逆に、一括しない項目の数を拡大する方法がある場合は、線形プログラムに対する解決策があります。 $ x_i $ カウントルールの数 $ i $ がそのメソッドで適用され、これによりリニアプログラムに対する有効な解決策が得られます。

アイテムを失う

私は同等のものがあると信じています:線形プログラムへの実行可能な解決策が存在する場合、バインドされずにアイテムを失う方法があります

$$ a_1 x_1 + \ dots + a_n x_n \ le(0,0、\ dots、0)、x_1 \ ge 0、\ dots、x_n \ ge 0 $$

$ A_1 x_1 + \ dots + a_n x_n <(0,0、\ dots、0)$ 。私がこれを慎重にチェックしていないので私の推論をチェックする必要があります。

保存

最後に、拘束せずにアイテムを縛らずにアイテムを獲得する方法がない場合は、その価値が保存されていると思います。

他のヒント

あなたの問題は、 $ \ mathbb r ^ {m \ times n} $ マトリックスからの行ベクトルの線形組み合わせがあるかどうかを尋ねることと同等です。係数正と合計(a)すべての要素が $ \ ge 0 $ 、(b)少なくとも1つの要素は $> 0 $

(演算の order が関係ない場合には:いくつかの順序で実行すると、いくつかのアイテムの数量がゼロを下回ると、低水を探すことができます。 - マークして、少なくとも各項目の多くが開始することがあるとします。)

これは線形計画法によって解決できると思います:各係数に対して変数を作る、出力ベクトル内の各要素の $ \ ge 0 $ の制約を追加します(それぞれそれぞれ要素は、各係数変数に対する係数変数と一定の係数のドット積です)、さらに $ \ ge 0 $ 制約、および最大化するように機能を設定します。すべての要素の合計それを境界にするには、係数変数の合計をいくつかの定数に設定します。 1.解決値の値が $> 0 $ の場合は、保存されない!

小数値は問題ではありません。それらは合理的でなければなりませんので、純粋な整数の解決策を得るために、すべての分母によって常に掛けることができます。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top