私は、シミュレーテッド アニーリング アルゴリズムについて学んでいる途中で、サンプル アルゴリズムをどのように変更して 0-1 ナップザック問題を解決するかについていくつか質問があります。
CP でこの素晴らしいコードを見つけました。
http://www.codeproject.com/KB/recipes/simulatedAnnealingTSP.aspx
私はそれが今どのように機能するかを理解していると確信しています(私が懸念している限り、ボルツマン条件全体を除いて、私は黒魔術ですが、局所最適を回避することについて理解しており、明らかにこれはまさにそれを行います)。これを再設計して、0-1 ナップザックの「っぽい」問題を解決したいと思います。基本的に、私は 5,000 個のオブジェクトの 1 つを 10 個の袋に入れ、未使用のスペースが最小になるように最適化する必要があります。ソリューションに割り当てる実際の「スコア」はもう少し複雑ですが、アルゴリズムとは関係ありません。
これは簡単そうです。これは、Anneal() 関数が基本的に同じであることを意味します。ニーズに合わせて GetNextArrangement() 関数を実装する必要があります。TSM の問題では、パスに沿って 2 つのランダムなノードを交換するだけです (つまり、反復ごとに非常に小さな変更を加えます)。
私の問題では、最初の繰り返しで、10 個のランダムなオブジェクトを選び、残りのスペースを調べます。次の反復では、10 個の新しいランダム オブジェクトを選択しますか? それとも、オブジェクトの半分または 1 つだけなど、いくつかのオブジェクトのみを交換するのが最善でしょうか? それとも、スワップアウトするオブジェクトの数は、温度に比例する必要がありますか? これらのどれも私には実行可能に思えますが、誰かが最善のアプローチについてアドバイスを持っているかどうか疑問に思っています (ただし、コードが機能したら、改善をいじることができます)。
ありがとう!
マイク