Scala solution for the localization Problem Set 1
package com.swisscom.scala.cs373 abstract class State case class Red extends State case class Green extends State object Ps1 extends App { val colors = List( List(Red(), Green(), Green(), Red(), Red()), List(Red(), Red(), Green(), Red(), Red()), List(Red(), Red(), Green(), Green(), Red()), List(Red(), Red(), Red(), Red(), Red())) val measurements = List(Green(), Green(),Green(),Green(),Green()) val motions = List((0,0),(0,1),(1,0),(1,0),(0,1)) val sensor_right = 0.7 val p_move = 0.8 def show(p:Seq[Seq[Double]]) = p.foreach(println) def sense(w: Seq[Seq[Double]], m: State) = { val tmp = for (r <- 0 until w.size) yield for (c <- 0 until w(r).size) yield if (colors(r)(c) == m) w(r)(c) * sensor_right else w(r)(c) * (1 - sensor_right) val sum = tmp.foldLeft(0.)(_ + _.sum) tmp.map(_.map(_ / sum)) } def move(w: Seq[Seq[Double]], m: Tuple2[Int,Int]): Seq[Seq[Double]] = { return ( for (r <- 0 until w.size) yield for (c <- 0 until w(r).size) yield p_move * w((w.size + r - m._1) % w.size)((w(r).size + c - m._2) % w(r).size) + (1-p_move) * w(r)(c) ) } var p: Seq[Seq[Double]] = { val cnt = colors.size * colors(0).size for (r <- 0 until colors.size) yield for (c <- 0 until colors(r).size) yield 1d/cnt } for (i <- 0 until measurements.size) { p = move(p, motions(i)) p = sense(p, measurements(i)) } show(p) }









