1

私は一種の2次元の組み合わせアルゴリズムを探しています..それが正しい言い回しである場合。私はPHPの経験は豊富ですが、アルゴリズムや高度な数学の経験はありませんので、ご容赦ください。

別の要素のセットと組み合わせて、後で分析できるようにすべての可能な組み合わせを計算したい要素のセットがあります。セット内の要素の数は決して変更されません。両方のセットには常に5つの要素があります。

$set1= array('A', 'B', 'C', 'D', 'E');
$set2= array('One', 'Two', 'Three', 'Four', 'Five');

これが正しい言い回しかどうかはわかりませんが、セット2のアイテムに分割されたセット1のアイテムのすべての組み合わせを確認したいと思います。両方のセットのすべての要素は、可能性ごとに1回だけ使用する必要があり、セット1の要素はセット2の要素内でグループ化できるため、次のような結果の配列が得られます(例としていくつかのランダムな値)。

$possibilities= array(
  0 => array(
    'One' => array('A'),
    'Two' => array('B'),
    'Three' => array('C'),
    'Four' => array('D'),
    'Five' => array('E'),
  ),
  1 => array(
    'One' => array('A', 'B', 'C'),
    'Two' => array('D'),
    'Three' => array('E'),
    'Four' => array(),
    'Five' => array(),
  ),
  2 => array(
    'One' => array('C'),
    'Two' => array(),
    'Three' => array('A'),
    'Four' => array('B'),
    'Five' => array('D', 'E'),
  ),
  3 => array(
    'One' => array(),
    'Two' => array(),
    'Three' => array('A', 'B', 'C', 'D', 'E'),
    'Four' => array(),
    'Five' => array(),
  ),
);

など。そのような値。これに関するあらゆる種類のフィードバックを歓迎します。特に、次の点に注意してください。

  • PHPでこのようなものをコーディングする方法は?再帰関数を介して?デカルト積アルゴリズムを使用しますか?
  • いくつの組み合わせが可能ですか?5 ^ 10?
  • 前のポイントに応じて:Webアプリ内でこのデータをリアルタイムで操作することは可能ですか?おそらく事前に計算を行う必要があると思われるよりも1,000万の組み合わせがある場合は、結果の分析を保存して、ライブアプリの実行中にそれを処理しますか?
  • いくつかの制限があります(例:セット2のアイテム「1」、「2」、「3」には常にセット1のアイテムが少なくとも1つ必要です)が、その後の分析中に不要な組み合わせが削除されるため、それをに含める必要はありません。その時点でこれらを組み込むことによって計算時間を短縮できない限り、組み合わせアルゴリズム?

私の質問はあまり明確ではないかもしれないので、もっと多くの、またはより良い情報を提供する必要があるかどうか尋ねてください。

前もって感謝します


2012年2月28日更新

インターネットで見つけたべき集合とデカルト積関数のPHP実装を試しました(この種のものは、自分でコーディングするのは少し遠いです)。したがって、このコードを実行すると、次のようになります。

$powerset= powerSet(array('A', 'B', 'C'));
$cartesian = cartesian(array(
    'Set1' => $powerset,
    'Set2' => array('One', 'Two', 'Three')
));

これは、powerSet関数が$powersetに入れるものです。

Array (
      [0] => Array ()
      [1] => Array (
        [0] => A
      )
      [2] => Array (
        [0] => B
      )
      [3] => Array (
        [0] => B
        [1] => A
      )
      ...

そして、これはデカルト関数が返すものです:

Array (
      [0] => Array (
        [Set1] => Array ()
        [Set2] => One
      )
      [1] => Array (
        [Set1] => Array (
          [0] => A
        )
        [Set2] => One
      )
      [2] => Array (
        [Set1] => Array (
          [0] => B
        )
        [Set2] => One
      )
      [3] => Array (
        [Set1] => Array (
          [0] => B
          [1] => A
        )
        [Set2] => One
      )
      ...

ですから、それは私が望んでいたことを実行しますが、最も難しい部分ではありません。組み合わせを「個別に」考慮し、Set1をSet2内に配布せず、すべてのSet1アイテムが3つのSet2アイテムすべてで使用されるようにします。

  • これら2つの関数の使用を誤解していますか?パワーセットとデカルト積を組み合わせて結果を出す方法について、私は正しく理解していないと思います。デカルト()関数内でpowerSet()関数を呼び出す必要がありますか?
  • たぶん、それらの特定のPHP関数は私の目的を正確に果たしていないのでしょうか?私はここでそれらを見つけました:

別の更新:プログラミング参照なしで問題を修正する

この問題は、私が戦略ゲーム用に作成している分析ツールに関連しています。ツールを使用するたびに、プレイヤーはユニットの大規模なコレクションから5つの異なるユニットを選択できます。これらのユニットは、さまざまな方法で他の(静的)エンティティ(これらを「プール」と呼びましょう)と組み合わせることができます。ユニットには、特定のプールと組み合わせると、プレイヤーの戦略を改善する場合と改善しない場合がある特性があります。例えば:

  • ユニットAはプール1にいるのが好きですが、プール2にいるのは嫌いです
  • ユニットAもそこにいる場合を除いて、ユニットBはプール1にいることを嫌います
  • 等..

このツールの目的は、どのユニットがどのプールに入るのかという最適な組み合わせを見つけることです。ルールは次のとおりです。

  • 約50のコレクションから常に5つの異なるユニットが選択されています。これらのユニットはすべて異なる特性を持っています。
  • 常に同じ5つのプールがあります。それらには異なる特性がありますが、プールはより大きなコレクションから選択されるのではなく、常に同じです。
  • 各プールには、0から5までの複数のユニットを含めることができます。
  • 各ユニットは1つのプールにのみ存在できます。

入力は次のとおりです。

  • 5つの可変単位のリスト:A、B、C、D、E
  • 5つの静的プールのリスト:Pool1、Pool2、Pool3、Pool4、Pool5

出力は、前述のルールに基づいて、これら2つのリスト間のすべての可能な組み合わせである必要があります。いくつかの例:

組み合わせ1

  • プール1:A
  • プール2:B
  • プール3:C
  • プール4:D
  • プール5:E

組み合わせ2

  • プール1:A、B、C
  • プール2:D
  • プール3:E
  • プール4:
  • プール5:

組み合わせ3

  • プール1:C
  • プール2:
  • プール3:A
  • プール4:B
  • プール5:D、E

組み合わせ4

  • プール1:
  • プール2:
  • プール3:A、B、C、D、E
  • プール4:
  • プール5:

等...

だから私がしたいのは:

  1. 存在するユニットとプールのすべての可能な組み合わせを取ります。
  2. それらを調べて、ユニットとプールの間の相乗効果に基づいて、組み合わせに「戦略値」を割り当てます。
  3. 「戦略的価値」が最も高い上位10の組み合わせを取り上げます

手順2と3は問題ありません。私が抱えている問題は、プール内のユニットのすべての可能な組み合わせを生成することです。

うまくいけば、これは問題のより明確な説明です

4

2 に答える 2

1

わかりました。これで、あなたが何をしたいのかがわかったと思います。ユニットのコレクションは、ユニットのセットの累乗セットの要素ではなく、(ほぼ) ユニットのセットのパーティションの要素です。厳密に言えば、空のセットはセットのパーティションのセットのメンバーではないため、「ほぼ」と書きます。あなたの問題は、5つのユニットのセットのすべてのパーティションを計算することだと思います。そのパーティションには、最大で 5 つの要素 (それぞれにユニットの 1 つが含まれます) があります。あなたの問題では、それ自体が5つのメンバーを持たないユニットのセットのパーティションは、空のセットのオカレンスでパディングする必要があります。

次に、これらのパーティションをプールの順序にマップする必要があります。最初の組み合わせは、次のようにプールをユニット セットのパーティションの要素にマップします{1->{A}, 2->{B}, 3->{C}, 4->{D}, 5->{E}}。プールをユニット セットの同じパーティションにマップする他の組み合わせも必要な場合 (たとえば、プールの{2->{A}, 3->{B}, 4->{C}, 5->{D}, 1->{E}}すべての順列を計算し、それぞれをユニット セットの同じパーティションにマップする必要があります。

完了するまで繰り返します。

于 2012-02-27T13:28:30.217 に答える
0

kd-tree またはツリーマップ アルゴリズムを使用できます。この種のアルゴリズムは、最も近い隣接点、最も近いポイントのペア、または空間のアドレス指定、空間のタイリングを見つけるのに適しています。

于 2012-02-28T10:42:37.507 に答える