예제 #1
0
    public static ConcurrentBag <RandomPathResult> StartSearch <Gb, T>(Gb[] gbs, RandomSearchParameters <T> parameters) where Gb : GameBoy
        where T : Tile <T>
    {
        ConcurrentBag <RandomPathResult> ret = new ConcurrentBag <RandomPathResult>();

        int pathsFound = 0;

        bool[] threadsRunning = new bool[gbs.Length];

        for (int i = 0; i < gbs.Length; i++)
        {
            Thread t = new Thread(idx => {
                int threadIndex             = (int)idx;
                threadsRunning[threadIndex] = true;
                ParallelSearch(ret, gbs[threadIndex], parameters, ref pathsFound);
                threadsRunning[threadIndex] = false;
            });
            t.Start(i);
        }

        while (!threadsRunning.All(b => !b))
        {
            Thread.Sleep(10);
        }

        return(ret);
    }
예제 #2
0
    private static void ParallelSearch <Gb, T>(ConcurrentBag <RandomPathResult> list, Gb gb, RandomSearchParameters <T> parameters, ref int pathsFound) where Gb : GameBoy
        where T : Tile <T>
    {
        Random random    = new Random();
        int    igtFrames = parameters.StateList[0].Length;

        IGTResults[] results = new IGTResults[parameters.ClusterSize];
        int          statesIndex;
        int          successes;

        while (pathsFound < parameters.NumPathsToFind)
        {
            Action[] actions = GenerateRandomPath(random, parameters.StartEdgeSet, parameters.StartTile, parameters.EndTiles).ToArray();
            statesIndex = random.Next(parameters.StateList.Count - parameters.ClusterSize + 1);
            successes   = igtFrames * parameters.ClusterSize;

            for (int i = 0; i < parameters.ClusterSize && successes >= parameters.SS; i++)
            {
                results[i] = gb.IGTCheck(parameters.StateList[statesIndex + i], gb => parameters.ExecutionCallback(gb, actions), parameters.SS, successes);
                successes -= results[i].TotalFailures;
            }

            if (successes >= parameters.SS)
            {
                if (parameters.FoundCallback != null)
                {
                    parameters.FoundCallback(statesIndex, actions, successes);
                }
                if (parameters.NumPathsToFind > 0)
                {
                    Interlocked.Increment(ref pathsFound);
                    list.Add(new RandomPathResult {
                        StatesIndex = statesIndex,
                        Actions     = actions,
                        Results     = results,
                    });
                }
            }
        }
    }
예제 #3
0
 public static ConcurrentBag <RandomPathResult> StartSearch <Gb, T>(int numThreads, RandomSearchParameters <T> parameters) where Gb : GameBoy
     where T : Tile <T>
 {
     return(StartSearch(MultiThread.MakeThreads <Gb>(numThreads), parameters));
 }