///// <summary> ///// rober find a naighbor without a cop and go there ///// </summary> private outputClass greedy_dumb_1vsMany(int copnumber) { copMove = true; int moves = 0; List<int> currentPath = new List<int>(); List<int> bestPath = new List<int>(); iterGreedyDumb = 0; while (!isCought(copnumber) && moves != maxMoves) { if (copMove) { moves++; cops_moves_greedy_dijkstra(copnumber, currentPath, bestPath); copMove = false; } else { int next = robber_moves_greedy_dumb(copnumber); if(next!=-1) robber.move(next, board); copMove = true; } } outputClass o = new outputClass(currentTest, classOfGraph, whoseWin(isCought(copnumber)), "greedy-dumb", copnumber, board.neighbor.Count, board.verticies, moves, maxMoves, iterGreedyDumb); if(!isAutoTest) outputGreedyDumb.Add(o); return o; }
/// <summary> /// 1 greedy robber vs 'copnumber' of greedy cops /// </summary> private outputClass greedy_dijkstra_1vs_many(int copnumber) { copMove = true; int moves = 0; List<int> currentPath = new List<int>(); List<int> bestPath = new List<int>(); iterGreedyDijkstra = 0; while (!isCought(copnumber) && moves != maxMoves) { if (copMove) { moves++; cops_moves_greedy_dijkstra(copnumber, currentPath, bestPath); copMove = false; } else { currentPath.Clear(); bestPath.Clear(); robber.move(robber_moves_greedy_dijkstra(copnumber, currentPath, bestPath), board); copMove = true; } } outputClass o = new outputClass(currentTest, classOfGraph, whoseWin(isCought(copnumber)), "greedy", copnumber, board.neighbor.Count, board.verticies, moves, maxMoves, iterGreedyDijkstra); if (!isAutoTest) { outputGreedyDijkstra.Add(o); } return o; }
/// <summary> /// Random beacon algorithm /// </summary> /// <param name="r">number of nodes to randomly choose</param> /// <param name="goOnTime">number of steps to follow one choosed path</param> private outputClass randomBeacon(int r, int goOnTime, int copnumber) { copMove = true; int moves = 0; List<int> currentPath = new List<int>(); List<int> bestPath = new List<int>(); List<int> robberPath = new List<int>(); int tmpTime = 1; iterRandomBeacon = 0; while (!isCought(copnumber) && moves != maxMoves) { if (copMove) { moves++; cops_moves_greedy_dijkstra(copnumber, currentPath, bestPath); copMove = false; } else { if ((tmpTime == goOnTime || tmpTime == 1 || robberPath.Count <= tmpTime)) { tmpTime = 1; robberPath = getBeaconNodes(r, copnumber); robber.move(robberPath[tmpTime], board); tmpTime++; } else { iterRandomBeacon++; robber.move(robberPath[tmpTime], board); tmpTime++; } copMove = true; } } outputClass o = new outputClass(currentTest, classOfGraph, whoseWin(isCought(copnumber)), "Beacon", copnumber, board.neighbor.Count, board.verticies, moves, maxMoves,iterRandomBeacon); if (!isAutoTest) { outputBeacon.Add(o); } return o; }
/// <summary> /// function of robber running away with alpha beta and cop chaising him with greedy algorithm /// </summary> /// <param name="searchDepth">depth of alpha beta</param> private outputClass alphaBetavsGreedy(int searchDepth, int copnumber) { Cop cop = cops[0]; copMove = true; int moves = 0; List<int> currentPath = new List<int>(); List<int> bestPath = new List<int>(); iterAlfaBeta = 0; ; while (!isCought(copnumber) && moves != maxMoves) { if (copMove) { moves++; cops_moves_greedy_dijkstra(1, currentPath, bestPath); copMove = false; } else { currentPath.Clear(); bestPath.Clear(); int tmpMove = alphabeta(robber.ocpupiedNode, searchDepth, -999, 999, true, cop.ocupiedNode, searchDepth); robber.move(tmpMove, board); copMove = true; } } outputClass o = new outputClass(currentTest, classOfGraph, whoseWin(isCought(copnumber)), "ABvsGreedy d=" + searchDepth.ToString(), copnumber, board.neighbor.Count, board.verticies, moves, maxMoves, iterAlfaBeta); if (!isAutoTest) { outputAlfaBeta.Add(o); } return o; }
/// <summary> /// cop with greedy algorithm and monte carlo tree search with propagation for robber /// </summary> private outputClass MCTS(int treeWidth, int searchDepth, int copnumber) { copMove = true; int moves = 0; List<int> currentPath = new List<int>(); List<int> bestPath = new List<int>(); Tree<Node<Data>> MCTSTree = null; int counter = 0; iterMCTS = 0; while (!isCought(copnumber) && moves != maxMoves) { if (copMove) { moves++; cops_moves_greedy_dijkstra(copnumber, currentPath, bestPath); copMove = false; } else { // if (MCTSTree == null || counter == 0) // { if(MCTSTree!=null) MCTSTree.Clear(); GC.Collect(); GC.WaitForPendingFinalizers(); counter = txbTreeDepth - 1; Data data = new Data(); for (int i = 0; i < copnumber; i++) { data.CopPos[i] = cops[i].ocupiedNode; } data.RobberPos = robber.ocpupiedNode; MCTSTree = new Tree<Node<Data>>(simulateGame(treeWidth, searchDepth, copnumber, new Node<Data>(null, data))); // MCTSTree.node = PropagateChildrenProbability(MCTSTree.node); robber.move(getBestTreeNode(MCTSTree, out MCTSTree), board); copMove = true; // } // else // { // iterMCTS++; // robber.move(getBestTreeNode(MCTSTree, out MCTSTree), board); // copMove = true; // counter--; // } } } outputClass o = new outputClass(currentTest, classOfGraph, whoseWin(isCought(copnumber)), "MCTS", copnumber, board.neighbor.Count, board.verticies, moves, maxMoves,iterMCTS); if (!isAutoTest) { outputMCTS.Add(o); } return o; }