シミュレートされたアニーリングを実装するプログラムがあります。おそらく、オイラー数を (エネルギー - エネルギー ') 乗することが有用な理由を理解していないため、受け入れ確率に問題があります。
気温が非常に低い場合でも、確率は常に 1.0 (100%) を超えているため、実質的にランダム検索になります。受け入れ確率を sA の通常のレートに固定するにはどうすればよいですか (最初は悪い解決策を受け入れる可能性が高く、最後に低くなる可能性があります)。
メソッドコードは次のとおりです。
if (mutatedSolutionFitness > originalSolutionFitness) {
return 1.0;
} else {
System.out.println("Original solution fitness: "+originalSolutionFitness);
System.out.println("Mutated solution fitness: "+mutatedSolutionFitness);
System.out.println("Temperature: "+this.temperature);
final double chance = Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature);
System.out.println("Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): "+chance);
System.out.println();
return chance;
}
そして、ここに数回の出力があります:
Original solution fitness: 0.6666666666666666
Mutated solution fitness: 0.5555555555555556
Temperature: 999998.000001
Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): 1.0000001111113395
Original solution fitness: 0.6666666666666666
Mutated solution fitness: 0.6666666666666666
Temperature: 999997.000003
Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): 1.0
Original solution fitness: 0.6666666666666666
Mutated solution fitness: 0.6666666666666666
Temperature: 999996.000006
Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): 1.0
Original solution fitness: 0.6666666666666666
Mutated solution fitness: 0.5555555555555556
Temperature: 999995.00001
Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): 1.0000001111116728
Original solution fitness: 0.6666666666666666
Mutated solution fitness: 0.4444444444444444
Temperature: 999994.0000149999
Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): 1.0000002222235802
Original solution fitness: 0.6666666666666666
Mutated solution fitness: 0.5555555555555556
Temperature: 999993.0000209998
Math.exp((originalSolutionFitness - mutatedSolutionFitness) / this.temperature): 1.000000111111895