2016-09-02 6 views
-2

「置換」は正確に正しい単語ですが、私はList〜40 Objectsというシナリオがあります。それぞれ異なるObjectは異なるvaluecostを持っています。オブジェクトの順列の最小コストを求める。どのようにメモリの問題を克服するには?

valueは1と5の間にあります。targetValueを超えるオブジェクトのリストを結合しようとしています。合計の合計がcostで、その組み合わせが返されます。この組み合わせには、Listにオブジェクトの1つの複製が含まれている可能性があります。

たとえば、私のオブジェクトのリストが{a、b、c、d}の場合、 となります。{a、a、a、a、a、a、a、a、a}です。但し、の順序はまたの問題であることに注意してください。 {a、a、b}は{a、b、a}とは異なる合計値を持つことがあります

現在、私は解決策を強要しようとしています。しかし、40!組み合わせ、私はすべての異なる "順列"を追跡しながらメモリが不足しています。

私はまだ精度のためにすべての組み合わせを実行することをお勧めしますが、計算を実行する時間が問題にはなりませんが、前にも述べたように、最大​​の問題はメモリです。

現在のコード:(incompleteListは初めから始まるオブジェクト)

while (incompleteList.size() > 0) 
{ 
    Container container = incompleteList.get(0); 
    for (myObject o : objectList) 
    { 
     Container newAdditionContainer = new Container(container);//copies the list of objects into a new container 
     newAdditionContainer.addMyObject(o); 
     if (newAdditionContainer.getTotalValue()) < targetValue) 
     { 
      incompleteList.add(newAdditionContainer); 
     } else { 
      completeList.add(newAdditionContainer); 
     } 
    } 
    incompleteList.remove(container); 
} //code then loops through completeList and grabs the container with the cheapest cost, 
//but in actuality that code hasn't been able to run yet. 

私はかなり確信している以上の仕事ができる、それが完了することができたならば(それはカントによるメモリへの);どのようにアルゴリズムを変更して最低コストを取得し、メモリ制限内にとどめることができますか?

+0

成熟前申請のお詫び私はdownvoteがあったものと仮定していますか? – DoubleDouble

+0

私はその仕事があまり明確ではないと思います。注文が重要なときに「コスト」と「価値」の合計はどのように計算されますか?それぞれのオブジェクトが 'cost'と' value'を持つように指定すると 'List'は' List 'となるのはなぜですか?あなたはこれらのオブジェクトを表現するための 'インターフェース'を発明することができるようです(btw私はdownvoteしませんでした) – garnulf

+0

私は謝罪します。計算に入る方程式は問題の範囲を超えていると思います。 'Container'クラスは含まれているオブジェクトの値を計算でき、' cost'はすべてのオブジェクト間に単純に追加されますが、実行時まで不明です。 – DoubleDouble

答えて

2

ListObjectで初期化されているPermIteratorを構築し、希望するpermutation lengthを作成します。 IterateIteratorlengthで始まり、完全になるまでiteration同じlengthすべてpermutationsが所望のvalueを超えているまで。常に実際のpermutationと現在の最高値permutationだけを保存します。これは、希望する値を超えており、最も低いコストです(permutation lengthとは独立しています)。 このようにしてpermutationsをすべてListに格納してメモリに保存することを避けます。明らかに40 Objectでこれはかなり長い時間がかかります。

1

何かを実行する前にすべての可能なデータを読み込もうとすると、メモリが不足することがよくあります。これは大きなファイルを読むときにも問題になります。

単純な解決策は、多くのものがある場合はすべての値を保存するのではなく、それらをクレート化して処理することです。

新しい並べ替えを作成するたびに呼び出すコールバックまたはラムダを使用することをお勧めします。この方法では、それらを保存する必要はありません。

注:40!あなたが時間を使い果たす可能性が高い順列。マイクロ秒あたり1つで2.5e34年かかるでしょう。惑星が残っているよりも長い。

関連する問題