private DesireComponent GetDesire()
        {
            long            maxScore = 0;
            DesireComponent result = null;
            Component       a = null, b = null;
            var             mineComponents = componentManager.GetMineComponents();

            for (var i = 0; i < mineComponents.Length; ++i)
            {
                for (var j = 0; j < i; ++j)
                {
                    var length = componentManager.FindShortestPathLength(mineComponents[i], mineComponents[j]);
                    if (length < movesCount)
                    {
                        long score;
                        var  desireComponent = componentManager.FindShortestPath(mineComponents[i], mineComponents[j], out score);
                        if (score > maxScore)
                        {
                            maxScore = score;
                            result   = desireComponent;
                            a        = mineComponents[i];
                            b        = mineComponents[j];
                        }
                    }
                }
            }

            if (a != null)
            {
                result.Root = a.Score.SelfScore > b.Score.SelfScore ? a : b;
            }
            return(result);
        }
        public Edge Claim(GameState gameState)
        {
            componentManager.UpdateMap(gameState.Map);
            Edge edge;

            if (lambdasCount > 0)
            {
                edge = componentManager.GetMineEdge();
                --lambdasCount;
            }
            else
            {
                if (desire != null && (desire.Components.Count <= 1 || !componentManager.IsConnected(desire)))
                {
                    desire = GetDesire();
                }
                edge = desire == null
                    ? componentManager.GetMostExpensiveEdge()
                    : componentManager.GetFragileEdge(desire);
            }

            componentManager.ClaimEdge(edge.Source, edge.Target, desire);
            movesCount--;
            return(edge);
        }
예제 #3
0
 public void Init(Map map, int puntersCount, Punter punter)
 {
     scorer.Init(map);
     movesCount = (map.Edges.Length - punter.Id + puntersCount - 1) / puntersCount;
     componentManager.InitComponents(map, punter);
     desire = componentManager.FindGreedyFullComponent(movesCount + 1);
 }
        public Edge Claim(GameState gameState)
        {
            componentManager.UpdateMap(gameState.Map);
            Edge edge;

            if (lambdasCount > 0)
            {
                edge = componentManager.GetMineEdge();
                --lambdasCount;
            }
            else
            {
                if (desire != null && (desire.Components.Count <= 1 || !componentManager.IsConnected(desire)))
                {
                    desire = GetDesire();
                }
                if (desire == null)
                {
                    if (fullDesire == null || fullDesire.Components.Count <= 1 || !componentManager.IsConnected(fullDesire))
                    {
                        fullDesire = componentManager.FindGreedyFullComponent(10);
                    }

                    edge = componentManager.GetFragileEdge(fullDesire);
                }
                else
                {
                    edge = componentManager.GetFragileEdge(desire);
                }
            }

            componentManager.ClaimEdge(edge.Source, edge.Target, desire ?? fullDesire);
            movesCount--;
            return(edge);
        }
        public void Init(Map map, int puntersCount, Punter punter)
        {
            movesCount = (map.Edges.Length - punter.Id + puntersCount - 1) / puntersCount;
            scorer.Init(map);
            componentManager.InitComponents(map, punter);
            var mineCount = componentManager.GetMineComponents().Length;

            lambdasCount = Math.Max(Math.Min(movesCount / 20, 2 * mineCount), mineCount);
            desire       = new DesireComponent();
        }
예제 #6
0
        public Edge Claim(GameState gameState)
        {
            componentManager.UpdateMap(gameState.Map);

            if (!componentManager.IsConnected(desire))
            {
                desire = componentManager.FindGreedyFullComponent(movesCount + 1);
            }
            movesCount--;

            var edge = componentManager.GetFragileEdge(desire);

            componentManager.ClaimEdge(edge.Source, edge.Target, desire);
            return(edge);
        }