2016-06-30 2 views
1

私は2016年の選挙の結果を予測するモデルを作成しようとしています。私が必要とするアルゴリズムの1つは、最大270の選挙投票を加えることができる州のすべての可能な組み合わせを見つけることです。だから、セットアップは数字になるサブセットを見つける最速のアルゴリズムは何ですか?

const electoralVotesToWin = 270; 
const states = [ 
    { Name: "Virginia", ElectoralVotes: 13 }, 
    { Name: "North Carolina", ElectoralVotes: 15 }, 
    ... 
]; 

のようなもので、私の望ましい結果は、私はそれをよりよく説明する必要がある場合、私に教えてください

var stateCombos = [ 
    [ "Virginia", "North Carolina", ... ], 
    [ "Virginia", "North Carolina", ....], 
    ... 
]; 

のようなものです。

は状態のすべてのサブセットを見つけるブルートフォースアプローチよりも良くアルゴリズムはありますか?いずれにしても、ここで誰もエレガントでコンパクトですが、必ずしも効率的なソリューションではありませんか?

+3

これは古典的です0-1重量==サイズのナップザック問題。 https://en.wikipedia.org/wiki/Knapsack_problemを参照してください。 270の合計サイズとアイテム数<=状態数の場合、単純なDPは結果をすぐに提供するはずです。クオラについても同じ質問をした人もいます。https://www.quora.com/Is-there-a-way-to-print-out-all-solutions-to-the-0-1-Knapsack-problem-using -dynamic-programming-in-O-nC-time – lavin

+0

@ lavinのコメントに追加するには:投票が正確に270になる*州*のセットを見つける問題はNP困難ですが(そのような状態のセットこのリンクで与えられたDPアルゴリズムを使用して、この特定の問題に対する*解決策を見つけることができます。 *すべての解を見つけることは、DPマトリックスを逆にたどることで、解ごとのO(n)という意味では「速い」ものですが、それらの指数関数が存在する可能性があります。最大* 270以上のすべてのソリューションを検索する場合は、DP再発をわずかに変更する必要があります。 –

+0

@lavinは、与えられた限界を下回っている間に重量を最大にする1つの組み合わせを見つけるナップザックの問題ではありません - OPは、与えられた限界まで合計するすべての組み合わせを求めていますか? –

答えて

0

これはいくつかのさらなる生の試験を必要とするかもしれないが、(何残りがなくなるまで、あるいはこの実装で)標的に達するまで再帰関数の組み合わせを作成するために使用することができる。

function getStates(arr, rem){  
    var res = [], el; 
    while(arr.length){ 
     [el, ...arr] = arr;   
     if(el.ElectoralVotes >= rem) 
      res.push([el]); //total reached 
     else{ 
     for(var s of getStates(arr,rem - el.ElectoralVotes)) //try to reach total with remainder   
      res.push([el, ...s]); 
     } 
    } 
    return res; 
} 


var res= getStates(states, electoralVotesToWin); 

Test fiddle

はNB、例えば、これだけ名前が押され、単に要素がアレイに押し込まれる行を変更し、使用されたが、唯一の名前を取得するために元のオブジェクトをテストするため

fiddle

関連する問題