私は、フィットネス (バッグ内のアイテムの値) を最大化する必要があるナップザックの問題を解決しようとして、シミュレートされたアニーリングに取り組んでいます。
float weight[5]={2, 3, 5, 4, 3}; // weight
float value[5]={10, 20, 15, 25, 5}; // value of corresponding item
float bagSize = 11.0;
厳密な計算により、最適解は {1,1,0.4,1,0} であることがわかっています。しかし、私はこの解決策を得ません。
ここでは、すべての長いコードを避けるために、疑似コードで私の C++ コードを説明します。
While (temperate > 1){
1) Generate random values between (0,1) to fill the 5 sized array for each item
2) Perform random swapping of values in the 5D array above.
3) Calculate the fitness and new weight
4) Save the best solution.
}
基本的に、これは私のコードです。私の質問
- スワップを実行するときのステップ 2 では、現在、配列の要素をスワップしています。それが正しいか?または、以前のソリューションを追跡し、現在の要素 (i) を以前のソリューション要素と交換する必要がありますか? (これは単なるアイデアです)。
- 配列で実際の値を使用する場合、実行中に以前のソリューションが最大境界に近づいたことをシステムに伝えるにはどうすればよいですか。これは、現在の実装では、システムが冷えるまで繰り返されるステップ 1 でランダム値を継続的に生成するためです。
最後に、私の実装に大きな間違いがあるかもしれません。この問題で助けてもらえれば本当に感謝しています