diff --git a/classes/org/scadcop/solver/decentralized/mgm2/SupervisorBehaviour.Scala b/classes/org/scadcop/solver/decentralized/mgm2/SupervisorBehaviour.Scala new file mode 100755 index 0000000000000000000000000000000000000000..e7371d9beb5556ee42df70ae5b85bc4640d44ec9 --- /dev/null +++ b/classes/org/scadcop/solver/decentralized/mgm2/SupervisorBehaviour.Scala @@ -0,0 +1,45 @@ +// Copyright (C) Maxime MORGE, Alex VIGNERON 2020 +package org.scadcop.solver.decentralized.mgm2 + +import org.scadcop.problem._ +import org.scadcop.solver.decentralized._ +import org.scadcop.solver.decentralized.agent._ + +import akka.actor.{FSM, Stash} + +/** + * Negotiation behaviour for an agent in the MGM2 algorithm + * See Maheswaran R.T., Pearce J.P., Tambe M. (2006) + * A Family of Graphical-Game-Based Algorithms for Distributed Constraint Optimization Problems. + * In: Scerri P., Vincent R., Mailler R. (eds) + * Coordination of Large-Scale Multiagent Systems. Springer, Boston, MA. + * @param variable which should be valuated + * @param neighbours the variables which are linked to the variables + * @param constraints which should be valuated + */ +class SupervisorBehaviour(variable: Variable, + neighbours : Set[Variable], + constraints: Set[Constraint]) + extends VariableAgent(variable, neighbours, constraints) + with FSM[MGM2State, MGM2Mind] + with Stash { + + debug = true + + + /** + * Initially the agent has no task in the bundle + */ + startWith(Init, new MGM2Mind()) + + when(Start){ + //when it receives a + case Event(Trigger, mind) => { + stay using mind + } + + } + + +} + diff --git a/doc/fsm/fullFSM.png b/doc/fsm/fullFSM.png new file mode 100755 index 0000000000000000000000000000000000000000..b29be54624b3e359bd1fdbb3f741178b454aa81a Binary files /dev/null and b/doc/fsm/fullFSM.png differ diff --git a/doc/fsm/uncommitted.png b/doc/fsm/uncommitted.png new file mode 100755 index 0000000000000000000000000000000000000000..842f6e17ffc136ac972ebca6a63f1857ea813ba0 Binary files /dev/null and b/doc/fsm/uncommitted.png differ diff --git a/doc/related/fsm_mgm_1.png b/doc/related/fsm_mgm_1.png new file mode 100755 index 0000000000000000000000000000000000000000..c2360a24d135c03c2ae0958b8125fe7fc1c848d7 Binary files /dev/null and b/doc/related/fsm_mgm_1.png differ diff --git a/src/main/scala/org/scadcop/dfs/DFS.scala b/src/main/scala/org/scadcop/dfs/DFS.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/example/DalekSurveillanceSystem.scala b/src/main/scala/org/scadcop/example/DalekSurveillanceSystem.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/example/RobeColouringExample.scala b/src/main/scala/org/scadcop/example/RobeColouringExample.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/example/ToyExample.scala b/src/main/scala/org/scadcop/example/ToyExample.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/problem/Constraint.scala b/src/main/scala/org/scadcop/problem/Constraint.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/problem/Context.scala b/src/main/scala/org/scadcop/problem/Context.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/problem/DCOP.scala b/src/main/scala/org/scadcop/problem/DCOP.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/problem/Value.scala b/src/main/scala/org/scadcop/problem/Value.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/problem/Variable.scala b/src/main/scala/org/scadcop/problem/Variable.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/Solver.scala b/src/main/scala/org/scadcop/solver/Solver.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/Algorithm.scala b/src/main/scala/org/scadcop/solver/decentralized/Algorithm.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/DecentralizedSolver.scala b/src/main/scala/org/scadcop/solver/decentralized/DecentralizedSolver.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/Directory.scala b/src/main/scala/org/scadcop/solver/decentralized/Directory.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/Message.scala b/src/main/scala/org/scadcop/solver/decentralized/Message.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/Metric.scala b/src/main/scala/org/scadcop/solver/decentralized/Metric.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/State.scala b/src/main/scala/org/scadcop/solver/decentralized/State.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/agent/Mind.scala b/src/main/scala/org/scadcop/solver/decentralized/agent/Mind.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/agent/VariableAgent.scala b/src/main/scala/org/scadcop/solver/decentralized/agent/VariableAgent.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/AgentBehaviour.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Message.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Message.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Mind.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2Mind.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2State.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/MGM2State.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/Move.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/Move.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/mgm2/Offer.scala b/src/main/scala/org/scadcop/solver/decentralized/mgm2/Offer.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala old mode 100644 new mode 100755 index 390fa3402cd354eb356f97a793dc5c2dfe305be6..2c221d11bc4c24613c0ca612b60f215915bb95db --- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala +++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/Supervisor.scala @@ -85,12 +85,6 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co new SupervisorStatus(readyVariables = status.readyVariables + variable, isFirstRound = status.isFirstRound) - //when it receives an InformValue from an early agent - case Event(InformValue(_), status) => { - stash - stay using status - } - //When all the agents become ready case Event(Ready, status) if status.nbReady == pb.size - 1 => val variable = directory.variableOf(sender) @@ -99,7 +93,6 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co if (trace) println(s"Supervisor -> $anyVariable : Trigger") directory.addressOf(anyVariable) ! Trigger } - unstashAll goto(RunningSupervisorState) using new SupervisorStatus(readyVariables = status.readyVariables + variable, isFirstRound = status.isFirstRound) @@ -116,25 +109,22 @@ class Supervisor(val pb : DCOP, val algorithm: Algorithm, val initialContext: Co stay using status // When an agent becomes inactive - case Event(InformValue(value), status) if status.informValCounter < pb.size - 1 => + 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 inactive") - var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables, + stay using new SupervisorStatus(readyVariables = status.readyVariables, inactiveVariables = status.inactiveVariables + variable, assignment = status.assignment.fix(variable,value), isFirstRound = status.isFirstRound) - updatedStatus.incrementInformValCounter() - stay using updatedStatus // When all the agent become inactive - case Event(InformValue(value), status) if status.informValCounter == pb.size - 1 => + 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") - var updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables, + val updatedStatus = new SupervisorStatus(readyVariables = status.readyVariables, inactiveVariables = status.inactiveVariables + variable, assignment = status.assignment.fix(variable,value), isFirstRound = false) - updatedStatus.incrementInformValCounter() if (! updatedStatus.isTerminated){// If the solving must be restart for another round pb.variables.foreach { anyVariable: Variable => diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorState.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala old mode 100644 new mode 100755 index 160acec0ad9d03e5c7c3bc65b8e67fc869d420ac..bc71821bd566acddcb3f8b94d167c8f85b40f58a --- a/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala +++ b/src/main/scala/org/scadcop/solver/decentralized/supervisor/SupervisorStatus.scala @@ -18,8 +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 isFirstRound : Boolean = true, - val informValCounter: Int = 0 + val isFirstRound : Boolean = true ){ /** @@ -43,26 +42,14 @@ class SupervisorStatus(val readyVariables: Set[Variable] = Set(), */ def isTerminated : Boolean = Supervisor.incrementCounter() > Supervisor.NB_ROUNDS - def incrementInformValCounter(): SupervisorStatus = { - new SupervisorStatus(readyVariables, - inactiveVariables, - killedVariables, - assignment, - metric, - isFirstRound, - informValCounter = informValCounter + 1 - ) - } - /*Returns the updated supervisor's status when resetting the context*/ def resetContext(): SupervisorStatus = { new SupervisorStatus(readyVariables, inactiveVariables = Set(), killedVariables, - assignment, + assignment = new Context(), metric, - isFirstRound, - informValCounter = 0 + isFirstRound ) } } diff --git a/src/main/scala/org/scadcop/util/Main.scala b/src/main/scala/org/scadcop/util/Main.scala old mode 100644 new mode 100755 diff --git a/src/main/scala/org/scadcop/util/MathUtils.scala b/src/main/scala/org/scadcop/util/MathUtils.scala old mode 100644 new mode 100755 diff --git a/src/test/scala/org/scadcop/problem/ObjectiveDalekSurveillanceSystemSpec.scala b/src/test/scala/org/scadcop/problem/ObjectiveDalekSurveillanceSystemSpec.scala old mode 100644 new mode 100755 diff --git a/src/test/scala/org/scadcop/problem/ObjectiveRobeColouringExampleSpec.scala b/src/test/scala/org/scadcop/problem/ObjectiveRobeColouringExampleSpec.scala old mode 100644 new mode 100755