progs/cube.scala
author Christian Urban <christian.urban@kcl.ac.uk>
Thu, 08 Dec 2022 17:53:08 +0000
changeset 449 44f88dd66463
parent 414 78cb8e9a9d17
child 460 f5c0749858fd
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
414
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     1
// 2 x 2 x 2 Rubik's Cube
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     2
//========================
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     3
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     4
// more memory for the JVM
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     5
//
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     6
// JAVA_OPTS="-Xmx2g" scala
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
// for measuring memory usage
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    10
val mb = 1024*1024
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
val runtime = Runtime.getRuntime
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    12
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
def memory() = {
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    14
  println(s"  ** Used Memory:  ${(runtime.totalMemory - runtime.freeMemory) / mb}")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    15
  println(s"  ** Free Memory:  ${runtime.freeMemory / mb}")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    16
  println(s"  ** Total Memory: ${runtime.totalMemory / mb}")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    17
  println(s"  ** Max Memory:   ${runtime.maxMemory / mb}")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    18
}
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    19
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    20
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    21
abstract class Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    22
case object White extends Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    23
case object Yellow extends Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    24
case object Orange extends Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    25
case object Red extends Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    26
case object Green extends Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    27
case object Blue extends Colour
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    28
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    29
// Faces
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    30
//    -------
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    31
//   |c11 c12|
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    32
//   |c21 c22|
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    33
//    -------  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
case class Face(c11: Colour, c12: Colour,
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    35
                c21: Colour, c22: Colour)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    36
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
// Cubes
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    39
//     +--+
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    40
//     |f2|
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
//  +--+  +--+
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    42
//  |f5 f1 f6|
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
//  +--+  +--+
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
//     |f3|
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    45
//     |f4|
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    46
//     +--+ 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    47
case class Cube(f1: Face, f2: Face, f3: Face,
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
                f4: Face, f5: Face, f6: Face)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    49
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    50
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
// starting cube
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    52
val init = 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    53
    Cube(Face(White, Green, White, White), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    54
         Face(Blue, Yellow, Orange, Red), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    55
         Face(Red, Blue, Red, Blue),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    56
         Face(White, Yellow, Red, Orange),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    57
         Face(Yellow, Green, Blue, Green),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    58
         Face(Yellow, Green, Orange, Orange))
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    59
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    60
// solved cube
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    61
val solved = 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    62
    Cube(Face(Yellow, Yellow, Yellow, Yellow), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    63
         Face(Orange, Orange, Orange, Orange), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    64
         Face(Red, Red, Red, Red),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    65
         Face(White, White, White, White),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    66
         Face(Blue, Blue, Blue, Blue),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    67
         Face(Green, Green, Green, Green))  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    68
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    69
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    70
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    71
// actions
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    72
def up(c: Cube) : Cube =
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    73
    Cube(Face(c.f1.c11, c.f3.c12, c.f1.c21, c.f3.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    74
         Face(c.f2.c11, c.f1.c12, c.f2.c21, c.f1.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    75
         Face(c.f3.c11, c.f4.c12, c.f3.c21, c.f4.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    76
         Face(c.f4.c11, c.f2.c12, c.f4.c21, c.f2.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    77
         Face(c.f5.c11, c.f5.c12, c.f5.c21, c.f5.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    78
         Face(c.f6.c21, c.f6.c11, c.f6.c22, c.f6.c12))
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    79
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    80
def clock(c: Cube) : Cube =
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    81
    Cube(Face(c.f1.c21, c.f1.c11, c.f1.c22, c.f1.c12),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    82
         Face(c.f2.c11, c.f2.c12, c.f5.c22, c.f5.c12),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    83
         Face(c.f6.c21, c.f6.c11, c.f3.c21, c.f3.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    84
         Face(c.f4.c11, c.f4.c12, c.f4.c21, c.f4.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    85
         Face(c.f5.c11, c.f3.c11, c.f5.c21, c.f3.c12),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    86
         Face(c.f2.c21, c.f6.c12, c.f2.c22, c.f6.c22))
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    87
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    88
def right(c: Cube) : Cube =
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    89
    Cube(Face(c.f5.c11, c.f5.c12, c.f1.c21, c.f1.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    90
         Face(c.f2.c12, c.f2.c22, c.f2.c11, c.f2.c21),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    91
         Face(c.f3.c11, c.f3.c12, c.f3.c21, c.f3.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    92
         Face(c.f4.c11, c.f4.c12, c.f6.c12, c.f6.c11),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    93
         Face(c.f4.c22, c.f4.c21, c.f5.c21, c.f5.c22),
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    94
         Face(c.f1.c11, c.f1.c12, c.f6.c21, c.f6.c22))         
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    95
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    96
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    97
// simple bf-search without solution, just true
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    98
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    99
def actions(c: Cube) : List[Cube] = 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   100
  List(up(c), clock(c), right(c)) 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   101
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   102
def search(cs: List[Cube], d: Int) : Boolean = { 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   103
  println(s"Depth: $d    Cands: ${cs.length}")  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   104
  //memory()
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   105
  if (cs.exists(solved == _)) true
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   106
  else search(cs.flatMap(actions), d + 1)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   107
}  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   108
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   109
search(List(init), 0)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   110
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   111
// Set version
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   112
def actions_set(c: Cube) : Set[Cube] =
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   113
  Set(up(c), clock(c), right(c))
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   114
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   115
def search_set(cs: Set[Cube], d: Int) : Boolean = {
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   116
  println(s"Depth: $d candidates: ${cs.size}")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   117
  //memory()
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   118
  if (cs.contains(solved)) true
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   119
  else search_set(cs.flatMap(actions_set), d + 1)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   120
}  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   121
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   122
search_set(Set(init), 0)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   123
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   124
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   125
// For generating list of actions
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   126
abstract class Action
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   127
case object Up extends Action
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   128
case object Right extends Action
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   129
case object Clock extends Action
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   130
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   131
type Actions = List[Action]
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   132
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   133
// List version generating a list of actions
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   134
def actions_list(c: Cube, act: Actions) : List[(Cube, Actions)] = 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   135
  List((up(c), Up::act), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   136
       (clock(c), Clock::act), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   137
       (right(c), Right::act)) 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   138
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   139
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   140
def search_list(cs: List[(Cube, Actions)], d: Int) : (Cube, Actions) = { 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   141
  println(s"Depth: $d    Cands: ${cs.length}")  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   142
  val res = cs.find(_._1 == solved)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   143
  if (res.isDefined) res.get
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   144
  else search_list(cs.flatMap{case (c, as) => actions_list(c, as) }, d + 1)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   145
}  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   146
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   147
search_list(List((init, Nil)), 0)._2.reverse.mkString("\n") 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   148
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   149
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   150
// Map version generating a list of actions
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   151
def actions_map(c: Cube, as: Actions) : Map[Cube, Actions] = 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   152
  Map(up(c) -> (Up::as), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   153
      clock(c) -> (Clock::as), 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   154
      right(c) -> (Right::as)) 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   155
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   156
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   157
def search_map(cs: Map[Cube, Actions], d: Int) : Actions = { 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   158
  println(s"Depth: $d    Cands: ${cs.keySet.size}")  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   159
  val res = cs.keySet.find(_ == solved)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   160
  if (res.isDefined) cs(res.get)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   161
  else search_map(cs.flatMap{case (c, as) => actions_list(c, as) }, d + 1)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   162
}  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   163
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   164
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   165
search_map(Map(init -> Nil), 0).reverse.mkString("\n")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   166
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   167
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   168
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   169
// Bidirectional breadth-first search
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   170
def bsearch(cs: Map[Cube, Actions], 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   171
            bs: Map[Cube, Actions], d: Int) : Actions = { 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   172
  println(s"Depth: $d    Cands: ${cs.keySet.size}/${bs.keySet.size}") 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   173
  val res = cs.keySet intersect bs.keySet 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   174
  if (!res.isEmpty) (cs(res.head).reverse ::: bs(res.head))
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   175
  else bsearch(cs.flatMap{case (c, as) => actions_map(c, as) }, 
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   176
               bs.flatMap{case (c, as) => actions_map(c, as) }, d + 1)
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   177
}  
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   178
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   179
bsearch(Map(init ->  Nil), Map(solved -> Nil), 0).mkString("\n")
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   180
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   181
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   182
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   183
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   184
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   185
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   186
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   187
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   188
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   189
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   190
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   191
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   192
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   193
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   194
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   195
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   196
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   197
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   198
78cb8e9a9d17 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   199