アリさんのケーキ探し ―― コード

作ったコードは以下のようなもの。
3つの部分に分けた。
シートのセルを変数にしたし、繰り返しもfor-nextではなく、while-Loopにしたので、ほとんどDimは使わなかった。
この方がすっきりしている。

Sub step1()

Dim Gran, Gran2

Range("b17") = Range("b20")
Range("b18") = Range("b21")

Gran = Rnd()
Range("d6") = Gran

' Greedy で行くか、冒険で行くか、その結果、どの方向に行くかを決める
' 行く方向はf6に表示
If Gran >= Range("b13") Then
    Range("f6") = "Greedy"
    Range("b14") = Range("c12").Offset(Range("b16"), 6)
    
    Else
    Range("f6") = "冒険"
    ' 現在の状態で、移動可能な方向の数
    Range("g6") = Range("q1").Offset(Range("b16"), 4)
    ' 乱数を使い、何番目の方向に行くかを決定
    Range("h5") = Rnd()
    Range("h6") = Int(Range("h5") * Range("g6") + 1)
    Range("b14") = Range("q1").Offset(Range("b16"), Range("h6"))
    
End If
    
' 行く方向によって、次状態の行、列を更新
If Range("b14") = 1 Then
    Range("b21") = Range("b18") + 1
ElseIf Range("b14") = 2 Then
    Range("b20") = Range("b17") - 1
ElseIf Range("b14") = 3 Then
    Range("b21") = Range("b18") - 1
ElseIf Range("b14") = 4 Then
    Range("b20") = Range("b17") + 1
End If


' 行った方向によってQ値を修正
' 次の状態の報酬
Range("k13") = Range("f1").Offset(Range("b20"), Range("b21"))
' 次の状態の魅力度(割引、学習前)
Range("k15") = Range("b9") * Range("c12").Offset(Range("b19"), 5) + Range("k13")
' 現状態のQ値
Range("k17") = Range("c12").Offset(Range("b16"), Range("b14"))
' 現状態から次状態への新Q 値
Range("k19") = Range("k17") + Range("b10") * (Range("k15") - Range("k17"))
' 新Q値をQ値表へ
Range("c12").Offset(Range("b16"), Range("b14")) = Range("k19")

Range("a12:k21").Copy Cells(Range("e8"), Range("e10"))

Range("e10") = Range("e10") + 14

End Sub


Sub episode1()

Range("l2:o10").Copy Range("d13:g21")
Range("b15") = 1
Range("b20") = 1
Range("b21") = 1
Range("e10") = 14

Do While Range("b15") < 25

step1

If Range("b19") = 9 Then
    Range("a12:k21").Copy Cells(Range("e8"), 1)
    Range("d13:g21").Copy Range("l2:o10")
    Exit Do
End If

Range("b15") = Range("b15") + 1

Loop

End Sub


Sub ant()

Range("e8") = 24
Range("b13") = 1
Range("b12") = 1

Do While Range("b12") < 51

episode1

Range("e10") = Range("e10") + 1
Range("b13") = Range("b13") - 0.02
Range("e8") = Range("e8") + 12
Range("b12") = Range("b12") + 1

Loop

End Sub

初期のQ値は乱数で置いたけど、これを別の乱数にしてもほぼ同じ結果が得られた。次に進む前に、もう少し遊んでみたい。