Ejemplo n.º 1
0
    def test_can_add_to_empty_list(self):
        vertices = [Vertex(i, i * 2, i * 2) for i in range(4)]

        tour_list = []
        has_cycle = does_create_cycle(tour_list, Edge(vertices[2],
                                                      vertices[3]))
        self.assertEqual(has_cycle, False)
Ejemplo n.º 2
0
    def test_can_add_to_one_item_list_reverse_vertices(self):
        vertices = [Vertex(i, i * 2, i * 2) for i in range(4)]

        tour_list = [Edge(vertices[1], vertices[2])]
        has_cycle = does_create_cycle(tour_list, Edge(vertices[1],
                                                      vertices[0]))
        self.assertEqual(has_cycle, False)
Ejemplo n.º 3
0
    def test_merges_larger_edge_set(self):
        larger_inputs = [
            [0, 1, 1],
            [1, 2, 4],
            [2, 3, 6],
            [3, 1, 5],
            [4, 3, 4],
            [5, 6, 2],
            [6, 7, 2],
            [7, 9, 1],
            [8, 2, 2],
            [9, 0, 5],
            [10, 7, 2],
            [11, 3, 4],
            [12, 4, 8],
            [13, 6, 2],
            [14, 1, 3],
            [15, 4, 9],
        ]

        vertices = [Vertex(id, x, y) for id, x, y in larger_inputs]
        edge_list = create_edge_list(vertices)
        mergesort(edge_list, comparator=distance_comparator)

        prev_distance = 0
        for edge in edge_list:
            dist = edge.distance - prev_distance
            if dist < 0:
                raise Exception('Merge did not sort by distance asc')
Ejemplo n.º 4
0
    def test_real_use_case(self):
        inputs = [
            [
                0,
                1,
                1,
            ],
            [
                1,
                2,
                4,
            ],
            [
                2,
                3,
                6,
            ],
            [
                3,
                1,
                5,
            ],
            [
                4,
                3,
                4,
            ],
            [
                5,
                6,
                2,
            ],
            [
                6,
                7,
                2,
            ],
            [
                7,
                1,
                2,
            ],
        ]
        vertices = [Vertex(id, x, y) for id, x, y in inputs]

        tour_list = [
            Edge(vertices[0], vertices[7]),
            Edge(vertices[1], vertices[3]),
            Edge(vertices[1], vertices[4]),
            Edge(vertices[5], vertices[6]),
            Edge(vertices[2], vertices[3]),
        ]

        has_cycle = does_create_cycle(tour_list, Edge(vertices[2],
                                                      vertices[4]))
        self.assertEqual(has_cycle, True)
Ejemplo n.º 5
0
    def test_does_not_create_cycle(self):
        vertices = [Vertex(i, i * 2, i * 2) for i in range(4)]

        tour_list = [
            Edge(vertices[0], vertices[1]),
            Edge(vertices[1], vertices[2]),
        ]
        has_cycle = does_create_cycle(tour_list, Edge(vertices[2],
                                                      vertices[3]))
        self.assertEqual(has_cycle, False)
Ejemplo n.º 6
0
    def test_basic_edge_list(self):
        coords = [[1, 1], [2, 4], [3, 6], [1, 5], [3, 4], [6, 2]]
        cities = [
            Vertex(i, coord[0], coord[1]) for i, coord in enumerate(coords)
        ]

        edge_list = create_edge_list(cities)
        mergesort(edge_list, comparator=distance_comparator)

        tour_list, distance = create_tour(edge_list, len(cities))

        self.assertEqual(len(tour_list), 6)
        self.assertEqual(distance, 18)
        edge_vertices = [[edge.v1.id, edge.v2.id] for edge in tour_list]
        self.assertSequenceEqual(
            edge_vertices,
            [[1, 3], [1, 4], [2, 3], [0, 4], [0, 5], [2, 5]],
        )
Ejemplo n.º 7
0
    def test_edge_list(self):
        vertices = [Vertex(i, i * 2, i * 2) for i in range(4)]
        edge_list = create_edge_list(vertices)

        self.assertEqual(len(edge_list), 6)
        expected = [
            {
                'v1': 0,
                'v2': 1,
                'distance': 3
            },
            {
                'v1': 0,
                'v2': 2,
                'distance': 6
            },
            {
                'v1': 0,
                'v2': 3,
                'distance': 8
            },
            {
                'v1': 1,
                'v2': 2,
                'distance': 3
            },
            {
                'v1': 1,
                'v2': 3,
                'distance': 6
            },
            {
                'v1': 2,
                'v2': 3,
                'distance': 3
            },
        ]
        actual = [{
            'v1': edge.v1.id,
            'v2': edge.v2.id,
            'distance': edge.distance
        } for edge in edge_list]
        self.assertSequenceEqual(actual, expected)
Ejemplo n.º 8
0
    def test_longer_edge_list(self):
        larger_inputs = [
            [0, 1, 1],
            [1, 2, 4],
            [2, 3, 6],
            [3, 1, 5],
            [4, 3, 4],
            [5, 6, 2],
            [6, 7, 2],
            [7, 9, 1],
            [8, 2, 2],
            [9, 0, 5],
            [10, 7, 2],
            [11, 3, 4],
            [12, 4, 8],
            [13, 6, 2],
            [14, 1, 3],
            [15, 4, 9],
        ]

        vertices = [Vertex(id, x, y) for id, x, y in larger_inputs]
        edge_list = create_edge_list(vertices)
        actual = [[edge.v1.id, edge.v2.id] for edge in edge_list]
        expected = [
            [
                0,
                1,
            ],
            [
                0,
                2,
            ],
            [
                0,
                3,
            ],
            [
                0,
                4,
            ],
            [
                0,
                5,
            ],
            [
                0,
                6,
            ],
            [
                0,
                7,
            ],
            [
                0,
                8,
            ],
            [
                0,
                9,
            ],
            [
                0,
                10,
            ],
            [
                0,
                11,
            ],
            [
                0,
                12,
            ],
            [
                0,
                13,
            ],
            [
                0,
                14,
            ],
            [
                0,
                15,
            ],
            [
                1,
                2,
            ],
            [
                1,
                3,
            ],
            [
                1,
                4,
            ],
            [
                1,
                5,
            ],
            [
                1,
                6,
            ],
            [
                1,
                7,
            ],
            [
                1,
                8,
            ],
            [
                1,
                9,
            ],
            [
                1,
                10,
            ],
            [
                1,
                11,
            ],
            [
                1,
                12,
            ],
            [
                1,
                13,
            ],
            [
                1,
                14,
            ],
            [
                1,
                15,
            ],
            [
                2,
                3,
            ],
            [
                2,
                4,
            ],
            [
                2,
                5,
            ],
            [
                2,
                6,
            ],
            [
                2,
                7,
            ],
            [
                2,
                8,
            ],
            [
                2,
                9,
            ],
            [
                2,
                10,
            ],
            [
                2,
                11,
            ],
            [
                2,
                12,
            ],
            [
                2,
                13,
            ],
            [
                2,
                14,
            ],
            [
                2,
                15,
            ],
            [
                3,
                4,
            ],
            [
                3,
                5,
            ],
            [
                3,
                6,
            ],
            [
                3,
                7,
            ],
            [
                3,
                8,
            ],
            [
                3,
                9,
            ],
            [
                3,
                10,
            ],
            [
                3,
                11,
            ],
            [
                3,
                12,
            ],
            [
                3,
                13,
            ],
            [
                3,
                14,
            ],
            [
                3,
                15,
            ],
            [
                4,
                5,
            ],
            [
                4,
                6,
            ],
            [
                4,
                7,
            ],
            [
                4,
                8,
            ],
            [
                4,
                9,
            ],
            [
                4,
                10,
            ],
            [
                4,
                11,
            ],
            [
                4,
                12,
            ],
            [
                4,
                13,
            ],
            [
                4,
                14,
            ],
            [
                4,
                15,
            ],
            [
                5,
                6,
            ],
            [
                5,
                7,
            ],
            [
                5,
                8,
            ],
            [
                5,
                9,
            ],
            [
                5,
                10,
            ],
            [
                5,
                11,
            ],
            [
                5,
                12,
            ],
            [
                5,
                13,
            ],
            [
                5,
                14,
            ],
            [
                5,
                15,
            ],
            [
                6,
                7,
            ],
            [
                6,
                8,
            ],
            [
                6,
                9,
            ],
            [
                6,
                10,
            ],
            [
                6,
                11,
            ],
            [
                6,
                12,
            ],
            [
                6,
                13,
            ],
            [
                6,
                14,
            ],
            [
                6,
                15,
            ],
            [
                7,
                8,
            ],
            [
                7,
                9,
            ],
            [
                7,
                10,
            ],
            [
                7,
                11,
            ],
            [
                7,
                12,
            ],
            [
                7,
                13,
            ],
            [
                7,
                14,
            ],
            [
                7,
                15,
            ],
            [
                8,
                9,
            ],
            [
                8,
                10,
            ],
            [
                8,
                11,
            ],
            [
                8,
                12,
            ],
            [
                8,
                13,
            ],
            [
                8,
                14,
            ],
            [
                8,
                15,
            ],
            [
                9,
                10,
            ],
            [
                9,
                11,
            ],
            [
                9,
                12,
            ],
            [
                9,
                13,
            ],
            [
                9,
                14,
            ],
            [
                9,
                15,
            ],
            [
                10,
                11,
            ],
            [
                10,
                12,
            ],
            [
                10,
                13,
            ],
            [
                10,
                14,
            ],
            [
                10,
                15,
            ],
            [
                11,
                12,
            ],
            [
                11,
                13,
            ],
            [
                11,
                14,
            ],
            [
                11,
                15,
            ],
            [
                12,
                13,
            ],
            [
                12,
                14,
            ],
            [
                12,
                15,
            ],
            [
                13,
                14,
            ],
            [
                13,
                15,
            ],
            [
                14,
                15,
            ],
        ]
        self.assertEqual(len(edge_list), 120)
        self.assertSequenceEqual(actual, expected)