public void OptimizeTurns_ShouldTakeIntoAccountFixedTurns()
        {
            var weights = new float[][]
            {
                new float[] { 0, 1, 2, 3, 4, 5, 6 },
                new float[] { 6, 0, 1, 2, 3, 4, 5 },
                new float[] { 5, 6, 0, 1, 2, 3, 4 },
                new float[] { 4, 5, 6, 0, 1, 2, 3 },
                new float[] { 3, 4, 5, 6, 0, 1, 2 },
                new float[] { 2, 3, 4, 5, 6, 0, 1 },
                new float[] { 1, 2, 3, 4, 5, 6, 0 }
            };

            var turns = DirectedSequenceRouter.CalculateOptimimal(weights, 10, null);
        }
        public void OptimizeTurns_ShouldUseTurnsWhenItsCheaper()
        {
            var weights = new []
            {
                new float[] { 0, 1, 100, 2, 1, 1, 1, 1 },
                new float[] { 1, 0, 2, 100, 1, 1, 1, 1 },
                new float[] { 1, 1, 0, 1, 1, 200, 1, 1 },
                new float[] { 1, 1, 1, 0, 200, 1, 1, 1 },
                new float[] { 1, 1, 1, 1, 0, 1, 1, 2 },
                new float[] { 1, 1, 1, 1, 1, 0, 2, 1 },
                new float[] { 1, 1, 1, 1, 1, 1, 0, 1 },
                new float[] { 1, 1, 1, 1, 1, 1, 1, 0 }
            };

            var turns = DirectedSequenceRouter.CalculateOptimimal(weights, 10, null);

            Assert.IsNotNull(turns);
            Assert.AreEqual(new[] { 0, 7, 11, 15 }, turns);
        }
        public void OptimizeTurns_ShouldLeaveOutBrokenConnections()
        {
            var weights = new []
            {
                new float[] { 0, 1, float.MaxValue, float.MaxValue, 1, 1, 1, 1 },
                new float[] { 1, 0, float.MaxValue, float.MaxValue, 1, 1, 1, 1 },
                new float[] { 1, 1, 0, 1, 1, 2, 1, 1 },
                new float[] { 1, 1, 1, 0, 2, 1, 1, 1 },
                new float[] { 1, 1, 1, 1, 0, 1, 1, 2 },
                new float[] { 1, 1, 1, 1, 1, 0, 2, 1 },
                new float[] { 1, 1, 1, 1, 1, 1, 0, 1 },
                new float[] { 1, 1, 1, 1, 1, 1, 1, 0 }
            };

            var turns = DirectedSequenceRouter.CalculateOptimimal(weights, 10, null);

            Assert.IsNotNull(turns);
            Assert.AreEqual(new[] { 0, 8, 12 }, turns);
        }
        public void OptimizeTurns_ShouldPreferNonTurns()
        {
            var weights = new []
            {
                new float[] { 0, 1, 1, 2, 1, 1, 1, 1 },
                new float[] { 1, 0, 2, 1, 1, 1, 1, 1 },
                new float[] { 1, 1, 0, 1, 1, 2, 1, 1 },
                new float[] { 1, 1, 1, 0, 2, 1, 1, 1 },
                new float[] { 1, 1, 1, 1, 0, 1, 1, 2 },
                new float[] { 1, 1, 1, 1, 1, 0, 2, 1 },
                new float[] { 1, 1, 1, 1, 1, 1, 0, 1 },
                new float[] { 1, 1, 1, 1, 1, 1, 1, 0 }
            };

            var turns = DirectedSequenceRouter.CalculateOptimimal(weights, 10, null);

            Assert.IsNotNull(turns);
            Assert.AreEqual(new[] { 0, 4, 8, 12 }, turns);
        }