与えられたアルゴリズムは1つのパッキングを見つけます。通常は非常に優れていますが、必ずしも最適ではないため、問題は解決しません。
NP完全問題の場合、それらを解決するアルゴリズムは通常、再帰的に記述するのが最も簡単です(反復的な記述は、ほとんどの場合、再帰によって隠されているすべての簿記を明示的にします)。ビンパッキングの場合、最小数のビン(オブジェクトサイズの合計をビンサイズで割った上ガウス関数ですが、1から始めることもできます)から始めて、ビンへのオブジェクトの割り当てのすべての組み合わせを試し、そのような割り当てごとに確認します。それが合法であること(ビンコンテンツサイズの合計<=各ビンのビンサイズ)、合法である場合は受け入れ(または見つかった割り当ての出力)を返すか、割り当てが見つからなかった場合はビンの数を増やします。
構造を求めましたが、ここに1つのアイデアがあります。各ビンは、含まれているオブジェクト(リストまたは配列)を何らかの形で記述している必要があり、すべてのビンのリスト(または配列)が必要です。これらの非常に単純な構造では、再帰アルゴリズムは次のようになります。可能なすべての割り当てを試すには、オブジェクトごとにループを実行して、使用可能な各ビンに割り当てようとします。すべてのオブジェクトが割り当てられるのを待ってから合法性を確認するか、(マイナーな最適化として)次のオブジェクトに進む前に、オブジェクトが収まるビンにのみオブジェクトを割り当てます(これは、最後のオブジェクトが割り当てられたときに終了する再帰です)。割り当て済み)、そのようなビンが見つからない場合は前のオブジェクトに戻るか、(最初のオブジェクトの場合)ビンの数を増やしてから再試行します。
お役に立てれば。