public void selectAction() { List <Node> visited = new List <Node>(); Node cur = this; // root visited.Add(cur); while (!(cur.isLeaf())) { cur = cur.select(); cur.virtualLoss -= 1; visited.Add(cur); if (cur is NondeterministicNode) { cur = ((NondeterministicNode)cur.select()).selected; visited.Add(cur); } } cur.expand(); double value = cur.rollOut(); int panjangSimulasi = (cur as DeterministicNode).s; foreach (Node node in visited) { node.updateStatus(value, panjangSimulasi); } Interlocked.CompareExchange(ref ((DeterministicNode)cur).isLock, Available, Taken); }
static void testParallelSrVl() { for (int xy = 0; xy < 1; xy++) { Console.WriteLine(xy + " uuuuuu"); time = new Stopwatch(); time.Start(); Board board = new Board(); board.flip(0, 0); SimpleTPVL.DeterministicNode.side = board.sideToMove; SimpleTPVL.DeterministicNode b = new SimpleTPVL.DeterministicNode(board.getBoardState(), null, Constant.NONE, Constant.NONE); double x = 0; int u = 0; List <SimpleTPVL.Node> visited = new List <SimpleTPVL.Node>(); SimpleTPVL.Node cur = b; visited.Add(cur); cur.expand(); //cur.updateStatus(cur.rollOut(cur)); object a = new object(); ParallelOptions po = new ParallelOptions(); po.MaxDegreeOfParallelism = 100; List <string> threadid = new List <string>(); Parallel.For(0, 4000, po, i => { //lock (a) //{ // bool found = false; // foreach (string y in threadid) // { // if (y == Thread.CurrentThread.ManagedThreadId.ToString()) // { // found = true; // break; // } // } // if (!found) // { // threadid.Add(Thread.CurrentThread.ManagedThreadId.ToString()); // } //} u++; Console.WriteLine(u); b.selectAction(); //lock (a) //{ // while (!(cur.isLeaf())) // { // cur = cur.select(); // visited.Add(cur); // if (cur is TP.NondeterministicNode) // { // if (((TP.NondeterministicNode)cur).selected != null) // { // cur = ((TP.NondeterministicNode)cur).selected; // } // else // { // cur = ((TP.NondeterministicNode)cur.select()).selected; // } // visited.Add(cur); // } // } // cur.expand(); //} //double value = cur.rollOut(cur); //foreach (TP.Node node in visited) //{ // node.updateStatus(value); //} //lock (a) //{ // x +=Node.s; //} }//; ); //foreach (string y in threadid) //{ // Console.WriteLine(y); //} //for (int i = 0; i < 2001; i++) //{ // Console.WriteLine(i); // b.selectAction(cur); // Console.WriteLine(i); // x += Node.s; //}//; time.Stop(); SimpleTP.Node.PGL = x / 500; Console.WriteLine("PGL:" + SimpleTP.Node.PGL); Console.WriteLine(time.Elapsed.TotalSeconds); } }