コード例 #1
0
 void EnsureSwapAnalyzerExistence()
 {
     if (!BoardAnalysisPipeline.Any(a => a is SwapAnalyzer))
     {
         BoardAnalysisPipeline.Add(new SwapAnalyzer(FindCleanestWin, false));
     }
 }
コード例 #2
0
 public void AddBoardAnalyzer(IBoardAnalyzer analyzer)
 {
     BoardAnalysisPipeline.Add(analyzer);
 }
コード例 #3
0
        bool Analyze(List <Board> boards, Action <ThoughtProgress> progress = null)
        {
            int winLength = 0;

            foreach (var analyzer in BoardAnalysisPipeline.Where(a => !a.IsKnowledgeDependent))
            {
                var chunk = new List <Board>();
                boards.RemoveAll(b => analyzer.Analyze(Knowledge, b), (removed) =>
                {
                    chunk.Add(removed);

                    if (chunk.Count > 100)
                    {
                        if (progress != null)
                        {
                            progress(new ThoughtProgress()
                            {
                                BoardsRemoved = chunk.ToList(), WinLength = winLength
                            });
                        }

                        chunk.Clear();
                    }
                });

                if (chunk.Count > 0)
                {
                    if (progress != null)
                    {
                        progress(new ThoughtProgress()
                        {
                            BoardsRemoved = chunk.ToList(), WinLength = winLength
                        });
                    }
                }
            }

            var knowledgeDependentAnalyzers = BoardAnalysisPipeline.Where(a => a.IsKnowledgeDependent).ToList();

            while (boards.Count > 0)
            {
                winLength++;

                var count = boards.Count;

                foreach (var analyzer in knowledgeDependentAnalyzers)
                {
                    boards.RemoveAll(b => analyzer.Analyze(Knowledge, b), (removed) =>
                    {
                        if (progress != null)
                        {
                            progress(new ThoughtProgress()
                            {
                                BoardsRemoved = removed.EnList(), WinLength = winLength
                            });
                        }
                    });
                }

                if (boards.Count == count)
                {
                    foreach (var b in boards)
                    {
                        Knowledge[b.Template.Value][b.ColorCount].AddLoss(b);
                    }

                    var g = Knowledge.GraphKnowledge.Graph;

                    var nearlyColorable = Enumerable.Range(0, Knowledge.GraphKnowledge.LineGraph.N).All(e => boards.Any(b => ColoringAnalyzer.ColorableWithoutEdge(Knowledge, b, e)));
                    if (nearlyColorable)
                    {
                        FixerWonAllNearlyColorableBoards = false;
                        BreakerWonBoard = boards.FirstOrDefault(b => g.DegreeCondition(b) && ColoringAnalyzer.ColorableWithoutEdge(Knowledge, b, 0));
                        if (BreakerWonBoard == null)
                        {
                            BreakerWonBoard = boards.First(b => ColoringAnalyzer.ColorableWithoutEdge(Knowledge, b, 0));
                        }
                    }

                    return(false);
                }
            }

            return(true);
        }