Beispiel #1
0
        protected override void TrySolve(Board board, System.Threading.CancellationToken cancellationToken)
        {
            var rootBranch = new BoardBranch(board);

            var solverBlock = new TransformBlock <BoardBranch, BoardBranchSolveResult>(
                branch => branch.Solve(),
                new ExecutionDataflowBlockOptions
            {
                CancellationToken         = cancellationToken,
                BoundedCapacity           = 10,
                MaxDegreeOfParallelism    = 3,
                SingleProducerConstrained = true
            });

            var checker = new ActionBlock <BoardBranchSolveResult>(result =>
            {
                var branch = result.Branch;
                if (board.EmptyCellIndex == 4)
                {
                    Console.WriteLine(branch.ToString());
                }

                if (result.Solved)
                {
                    solverBlock.Complete();                     //always can solve, branch count of each step count is const
                }
                else
                {
                    foreach (var innerBranch in branch.GetBranches(GetCost))
                    {
                        solverBlock.Post(innerBranch);
                    }
                }
                result.Dispose();
                result = null;
            },
                                                                   new ExecutionDataflowBlockOptions
            {
                CancellationToken = cancellationToken
            });

            var checkerLink = solverBlock.LinkTo(checker);

            solverBlock.Completion.ContinueWith(t =>
            {
                checker.Complete();
                checkerLink.Dispose();
            });

            foreach (var branch1 in rootBranch.GetBranches(GetCost))
            {
                solverBlock.Post(branch1);
            }
            rootBranch.Dispose();
            rootBranch = null;

            checker.Completion.Wait();
        }
Beispiel #2
0
 public BoardBranchSolveResult(BoardBranch branch, bool solved)
 {
     if (branch == null)
     {
         throw new ArgumentNullException("branch");
     }
     this.branch = branch;
     this.solved = solved;
 }
Beispiel #3
0
 public void Dispose()
 {
     this.branch.Dispose();
     this.branch = null;
 }