public void init(APursuersPolicy pursuerJointPolicy, IEvadersPolicy evadersJointPolicy) { TotalDistancesToSink = 0; MinDistanceToSink = double.MaxValue; currentRound = 0; IsFinished = false; EliminatedRouters = new List <PointF>(); rand = new ThreadSafeRandom(); routersAlg = (AdvRoutingRouterPolicyBase)evadersJointPolicy; pursuersAlg = (AdvRoutingPursuersPolicyBase)pursuerJointPolicy; pursuerTurn = false; routerIdxToPoint = routersAlg.getInitialNetwork(); sink = routersAlg.sink; var allRoutersSet = new HashSet <PointF>(); routerPointToIdx = new Dictionary <PointF, int>(); o_C = new List <PointF>(); if (routerIdxToPoint.Count == 0) { finishGame(); InitialDistanceToSink = double.MaxValue; TotalDistancesToSink = double.MaxValue; transferredData = 0; return; } for (int r = 0; r < routerIdxToPoint.Count; ++r) { routerPointToIdx[routerIdxToPoint[r]] = r; allRoutersSet.Add(routerIdxToPoint[r]); } allRouters = new GoE.Utils.PointDataStructs.PointFSet(routerIdxToPoint); HashSet <PointF> connectedToSink = new HashSet <PointF>(); checkConnectivityRec(sink, allRoutersSet, connectedToSink); connectedToSink.Remove(sink); if (Params.singleSourceRouter) { InitialDetectedRouter = routersAlg.SourceRouter; } else { InitialDetectedRouter = connectedToSink.ToList().chooseRandomItem(rand.rand);//routerIdxToPoint[rand.Next(0, routerPointToIdx.Count)]; } InitialDistanceToSink = InitialDetectedRouter.subtruct(sink).distance(new PointF(0, 0)); pursuersAlg.setInitialDetectedRouter(InitialDetectedRouter); }
/// <summary> /// expects initialized policies /// </summary> public void init(APursuersPolicy ipursuerJointPolicy, IEvadersPolicy ievadersJointPolicy) { this.Pi_p = (AGoEPursuersPolicy)ipursuerJointPolicy; this.Pi_e = (AGoEEvadersPolicy)ievadersJointPolicy; state = new GameState(); remainingEvaders = gm.A_E.Count; pursuerTurn = true; myRand = new EvolutionaryStrategy.ThreadSafeRandom().rand; initGameState(); Pi_p.setGameState(t, O_c, O_d1.Union(O_d2)); IsFinished = false; sinks = gr.getNodesByType(NodeType.Sink); sinksSearch = new GoE.Utils.Algorithms.PointSet(sinks); AccumulatedEvadersReward = 0; if (transmitPoints == null || currentlyAllocatedTransmitPointsRE != gm.r_e) { // we don't count reward as written in the paper(in the game end), to improve performance //HashSet<Point> transmitPoints = new HashSet<Point>(); //GoE.Utils.AlgorithmUtils.PointSet transmitPoints; List <Point> dummytransmitPoints = new List <Point>(sinks.Count * (2 * gm.r_e * (gm.r_e + 1) + 1)); // tells from where an evader may transmit so the transmission reaches a sink foreach (var s in sinks) { var tmpTransmitPoints = gr.getNodesWithinDistance(s, gm.r_e); foreach (var p in tmpTransmitPoints) { //transmitPoints.Add(p); dummytransmitPoints.Add(p); } } currentlyAllocatedTransmitPointsRE = gm.r_e; transmitPoints = new PointSet(dummytransmitPoints); transmitPoints.removeDupliacates(); } dataInSink = new GoE.GameLogic.Utils.DataUnitVec(); dataInSink.Add(DataUnit.NIL); dataInSink.Add(DataUnit.NOISE); // we add NIL and noise so we don't count them as new units }