0

ビデオゲームのキャラクターのアイテムビルドを把握するために、javascript でアプリを作成しています。上位アイテムは約25個あり、一度に6個運ぶことができます。効果が大きく異なるので、単体ではあまり良くないように見えても、他のアイテムと組み合わせると非常に強力になると私は信じています。興味があれば詳しく説明します。

質問:

  1. 6 つのアイテムの異なる組み合わせすべてのリストを取得するにはどうすればよいですか? 組み合わせは何通りあるでしょう?25c6 (~134k) だけですか? または、重複を削除する必要がありますか? (すみません、しばらく数学の授業を休んでいました。)

  2. このようなものをJavascriptでどのように実装しますか? これを行うことができる数学ライブラリはすでにありますか? (具体的には、アイテムの可能なすべての組み合わせを繰り返します。)

  3. 考えられるすべての組み合わせのダメージを力ずくで計算し、最上位のアイテムの組み合わせを保存することは可能でしょうか? そうでない場合、強い組み合わせを見つけるためのより良いアルゴリズムはありますか?

みんなの入力に基づいた私のコードは次のとおりです。

function getAllCombinations(n, k, callback)
{
    var iterate = function(remaining, args)
    {   
        var len = args.length;
        for (var i = args[len - 1]; i < n; i++)
        {
            args.splice(len);
            args[len - 1] = i;
            if (remaining)
            {
                args.push(i);
                iterate(remaining - 1, args);
            }
            else
            {
                callback.apply(null, args);         
            }
        }        
    }
    iterate(k - 1, [0]);
}

var itemsCount = 25;
var itemSlots = 6;
getAllCombinations(itemsCount, itemSlots, function(a, b, c, d, e, f)
{   
    // calculateDamage(hero, arguments);
});
4

3 に答える 3

2

1) はい、ちょうど 25 です 6 を選択してください

2) これを 1 回だけ実行する必要がある場合は、ネストされたループを使用して実行できます。重要なのは、内側の各ループをゼロからではなく、外側のカウンターから開始することです。

for (int i = 0; i < 25; i++) {
    for (int j = i; j < 25; j++) { // note j=i not j=0
        // etc
        foo(i,j,k,l,m,n);
    }
}

25 と 6 の一般的な値の一般的な解決策が必要な場合、同様の効果を持つ再帰関数を書くのは難しくありません。

3) あなたの唯一の選択肢は力ずくだと思います。数分かかる場合がありますが、完了するはずです。Chrome では最速で、IE では使えないと思います。「ローカル検索手法」などの他のオプションは、スペースが特に連続していないため、機能しないようです。

于 2011-04-26T22:51:18.720 に答える
1

ショーン

それは私には大英博物館のアルゴリズムの仕事のように思えます... もちろん、チーズを使って.

簡単に言うと、特定のノード (全体的な優先度) をトラバースする「コスト」(またはあなたの場合は「利益」) は、このパスのすべての先行ノードと組み合わされたこのノードの関数になる可能性があることを意味します。特定のノードをトラバースすると、従来の「迷路」よりも計算コストが大幅に高くなります。従来の「迷路」では、各ノードのトラバーサル コストが固定されています (たとえば、道路の長さのように)...ただし、最大パスの長さはわずか 6 です。ノードでは、常に最良の結果にすばやく到達できるはずです (つまり、1 秒未満)。

ダブルアップを避けるために、既にノード A を含むパスにノード A を追加しないでください。

これを JavaScript で実装してはいけない理由はわかりませんが、独自のプライオリティ キューを実装する必要があると思います。構造なので、ウィキペディアから始めて頭を悩ませ、「まともな」javascript実装を見つけることができるかどうかをグーグルで調べたり、Javaの実装を移植することに失敗したりしました。

これは挑戦的な小さな問題です。あなたが何を思いついたのか、また途中で他の人が何を提案したのかを知りたいと思います. 最新情報を教えてください

そして、もう 1 つアドバイスがあります...ほとんどの場合、ゲームは最適な決定を下さないことが最善です。対戦相手の「単なる人間」は、「25 個のパワーから 6 個」の適切な (最適は言うまでもなく) 組み合わせを 1 秒未満で計算することは完全に不可能であり、偶然に最良の組み合わせを得る確率は 25 分の 1* であるためです。 24*23*22*21*20 = 127,512,000 ...特に、これらの「力」が「秘密の」方法で互いに活用している場合...秘密が公開されたとしても、計算を行うには「プログラマーの心」が必要です、「平均以上」の結果を達成するのに十分です。意味がわかりますか?

乾杯。キース。

于 2011-04-26T23:22:56.673 に答える
1
  1. はい、25C6 です (実際には ~177k です)

  2. の複製です。1...n (n は k を選択)n トランプのすべての可能な組み合わせを反復処理するにはどうすればよいですか?の間の k 個の整数の可能な組み合わせをすべてリストします。
    アイテムが 6 つしかないことがわかっている場合は、ネストされた for ループを 6 つだけ持つことができます (ただし、これは明らかにうまくスケーリングしません)。

  3. もちろん可能です - 177k の組み合わせは、典型的な PC で反復するのに 1 秒未満しかかかりません (Javascript を使用しているため、おそらく少し長くなりますが、1 秒か 2 秒以内です)。

于 2011-04-26T22:56:46.520 に答える