Exemple #1
0
        public void CompareEqualValues()
        {
            var expected = NodeEqualityEnum.Equal;
            var actual   = NodeComparer <int> .Compare(1, 1);

            Assert.Equal(expected, actual);
        }
Exemple #2
0
        public void CompareGreaterThan()
        {
            var expected = NodeEqualityEnum.GreaterThan;
            var actual   = NodeComparer <int> .Compare(100, 20);

            Assert.Equal(expected, actual);
        }
Exemple #3
0
        protected override AlgorithmState <TFactor, TStep> Search(Node <TFactor, TStep> current, Node <TFactor, TStep> bound, ISet <TStep> visited)
        {
            /*
             * Important Note:
             * Only the status AlgorithmFlag.InProgress should be reported from this method
             * because either AlgorithmFlag.Found or AlgorithmFlag.NotFound should only occur once.
             */
            visited.Add(current.Step);

            if (Source.StepComparer.Equals(current.Step, Source.To))
            {
                return(new AlgorithmState <TFactor, TStep>(AlgorithmFlag.Found, current));
            }

            var nexts = Source.Expands(current.Step, current.Level, step => !visited.Contains(step)).ToArray();

            if (nexts.Length == 0)
            {
                return(new AlgorithmState <TFactor, TStep>(AlgorithmFlag.NotFound, current));
            }

            Array.ForEach(nexts, next => next.Previous = current);
            Array.Sort(nexts, NodeComparer);

            var sortAt = 0;
            var state  = default(AlgorithmState <TFactor, TStep>);

            while (nexts.Length - sortAt > 0)
            {
                var best = _observer.InProgress(nexts[sortAt], new ArraySegment <Node <TFactor, TStep> >(nexts, sortAt, nexts.Length - sortAt)); // nexts.First();

                Debug.WriteLine($"{current.Step}\t{current.Level} -> {best.Step}\t{best.Level}");

                if (NodeComparer.Compare(best, bound) > 0)
                {
                    return(new AlgorithmState <TFactor, TStep>(AlgorithmFlag.NotFound, best));
                }

                if (nexts.Length - sortAt < 2)
                {
                    state = Search(best, null, visited);
                }
                else
                {
                    state = Search(best, NodeComparer.Min(nexts[sortAt + 1], bound), visited);
                }

                switch (state.Flag)
                {
                case AlgorithmFlag.Found:
                    return(state);

                case AlgorithmFlag.NotFound:
                    sortAt++;     // nexts.RemoveAt(0);
                    break;
                }
            }
            return(AlgorithmState <TFactor, TStep> .NotFound);
        }
Exemple #4
0
        public void Compare()
        {
            var node1 = new Node {
                PredictedTotalCost = 1
            };
            var node2 = new Node {
                PredictedTotalCost = 2
            };
            var comparer = new NodeComparer();

            Assert.That(comparer.Compare(node1, node2), Is.Negative);
        }