アリさんのケーキ探し ―― コード
作ったコードは以下のようなもの。
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値は乱数で置いたけど、これを別の乱数にしてもほぼ同じ結果が得られた。次に進む前に、もう少し遊んでみたい。