diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala index 1382b836478e60a81f1861268eddfd71ed929e51..44368fdd714eca567b6d0ecfb0656a111fe75c93 100755 --- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala +++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala @@ -88,7 +88,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co val variable = directory.variableOf(sender) if (debug) println(s"Supervisor ($stateName): $variable is ready") stay using - new SupervisorStatus(readyVariables = status.readyVariables + variable, + new SupervisorStatus(readyVariables = status.readyVariables + variable, previousObj = status.previousObj, isFirstRound = status.isFirstRound) //When all the agents become ready @@ -100,7 +100,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co directory.addressOf(anyVariable) ! Trigger } goto(RunningSupervisorState) using - new SupervisorStatus(readyVariables = status.readyVariables + variable, + new SupervisorStatus(readyVariables = status.readyVariables + variable, previousObj = status.previousObj, isFirstRound = status.isFirstRound) } @@ -121,15 +121,17 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co stay using new SupervisorStatus(readyVariables = status.readyVariables, inactiveVariables = status.inactiveVariables + variable, assignment = status.assignment.fix(variable,value), + previousObj = status.previousObj, isFirstRound = status.isFirstRound) // When all the agent become inactive case Event(InformValue(value), status) if status.assignment.valuation.size == pb.size - 1 => val variable: Variable = directory.variableOf(sender) if (debug) println(s"Supervisor ($stateName): $variable is finally inactive") - val updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables, + var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables, inactiveVariables = status.inactiveVariables + variable, assignment = status.assignment.fix(variable,value), + previousObj = status.previousObj, isFirstRound = false) if (! updatedStatus.isTerminated){// If the solving must be restart for another round @@ -147,6 +149,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co directory.addressOf(anyVariable) ! Query } if (trace) println(s"Supervisor -> self : StopAlgo") + updatedStatus = updatedStatus.updateObjectiveValue(pb.objective(status.assignment)) self ! StopAlgo } goto(Deciding) using updatedStatus @@ -203,6 +206,7 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co killedVariables = status.killedVariables + variable, assignment = status.assignment, status.metric, + previousObj = status.previousObj, isFirstRound = status.isFirstRound) // When all the agent become inactive @@ -222,7 +226,9 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co inactiveVariables = status.inactiveVariables, killedVariables = status.killedVariables + variable, assignment = status.assignment, - metric, isFirstRound = status.isFirstRound) + metric, + previousObj = status.previousObj, + isFirstRound = status.isFirstRound) } /** diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala index bc71821bd566acddcb3f8b94d167c8f85b40f58a..bba85f19d896b98fd559383155a1a99d3694ec44 100755 --- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala +++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala @@ -18,6 +18,7 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(), val killedVariables: Set[Variable] = Set(), val assignment: Context = new Context(), val metric: Metric= collection.mutable.Map[String,Double](), + val previousObj: Double = 0.0, val isFirstRound : Boolean = true ){ @@ -49,9 +50,22 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(), killedVariables, assignment = new Context(), metric, + previousObj, isFirstRound ) } + + //Returns the updated status with new value of objective function + def updateObjectiveValue(newObj: Double): SupervisorStatus = { + new SupervisorStatus(readyVariables, + inactiveVariables, + killedVariables, + assignment, + metric, + previousObj = newObj, + isFirstRound + ) + } }