-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
AgentDP.scala
73 lines (59 loc) · 2.11 KB
/
AgentDP.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package grid
import grid.Grid.{Action, ActionValues, World}
import util.Matrix
object AgentDP {
private def calculateActionValue(row: Int, col: Int, agent: ActionValues)(implicit world: World): Double = {
val allActions = agent.actionValues(row, col).flatten
val cellReward = world.reward(row, col)
val average = allActions.map(_.value).sum / allActions.size
cellReward + average
}
private def lookAheadMutateActionValue(row: Int, col: Int, agent: ActionValues)(implicit world: World): Unit =
world.matrix.get(row, col) match {
case Grid.Terminal =>
//terminal does not require mutation.
case Grid.Cell =>
val actionValue = calculateActionValue(row, col, agent)
agent.updateMutable(row, col, actionValue)
}
def exploreLookAhead(agent: ActionValues)(implicit world: World): Unit =
agent.values.foreach {
case (row, col) =>
lookAheadMutateActionValue(row, col, agent)
}
def explore(agent: ActionValues, iterations: Int)(implicit world: World): Unit =
(1 to iterations) foreach {
_ =>
exploreLookAhead(agent)
println(agent.values.toString() + "\n")
}
def directionsMatrix(agent: ActionValues)(implicit world: World): Matrix[Option[Action[Double]]] =
Matrix.create[Option[Action[Double]]](agent.values.rows, agent.values.cols) {
case (row, col) =>
world.matrix.get(row, col) match {
case Grid.Terminal =>
None
case Grid.Cell =>
val optimalDirection = agent.actionValues(row, col).flatten.max
Some(optimalDirection)
}
}
def main(args: Array[String]): Unit = {
implicit val world: Grid.World =
Grid.World(
rows = 11,
cols = 11,
terminals = Seq((0, 0), (10, 10))
)
val agent = ActionValues(Matrix.create[Double](world.rows, world.cols, 0.0))
explore(
agent = agent,
iterations = 100
)
val directionMatrixString =
directionsMatrix(agent)
//if None then icon is home.
.toStringCustom(_.map(_.icon).getOrElse("⌂"))
println(directionMatrixString)
}
}