235 lines
9.2 KiB
Python
Executable File
235 lines
9.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Various calls to CP api from python to verify they work.
|
|
'''Test routing API'''
|
|
|
|
from functools import partial
|
|
|
|
import unittest
|
|
|
|
from ortools.constraint_solver import routing_enums_pb2
|
|
from ortools.constraint_solver import pywrapcp
|
|
|
|
|
|
def Distance(node_i, node_j):
|
|
return node_i + node_j
|
|
|
|
|
|
def TransitDistance(manager, i, j):
|
|
return Distance(manager.IndexToNode(i), manager.IndexToNode(j))
|
|
|
|
|
|
def One(unused_i, unused_j):
|
|
return 1
|
|
|
|
|
|
def Two(unused_i, unused_j):
|
|
return 1
|
|
|
|
|
|
def Three(unused_i, unused_j):
|
|
return 1
|
|
|
|
|
|
class Callback(object):
|
|
|
|
def __init__(self, model):
|
|
self.model = model
|
|
self.costs = []
|
|
|
|
def __call__(self):
|
|
self.costs.append(self.model.CostVar().Max())
|
|
|
|
|
|
class TestRoutingIndexManager(unittest.TestCase):
|
|
|
|
def test_ctor(self):
|
|
manager = pywrapcp.RoutingIndexManager(42, 3, 7)
|
|
self.assertIsNotNone(manager)
|
|
if __debug__:
|
|
print(f'class RoutingIndexManager: {dir(manager)}')
|
|
self.assertEqual(42, manager.GetNumberOfNodes())
|
|
self.assertEqual(3, manager.GetNumberOfVehicles())
|
|
self.assertEqual(42+3*2-1, manager.GetNumberOfIndices())
|
|
for i in range(manager.GetNumberOfVehicles()):
|
|
self.assertEqual(7, manager.IndexToNode(manager.GetStartIndex(i)))
|
|
self.assertEqual(7, manager.IndexToNode(manager.GetEndIndex(i)))
|
|
|
|
def test_ctor_multi_depot_same(self):
|
|
manager = pywrapcp.RoutingIndexManager(
|
|
42, 3, [0, 0, 0], [0, 0, 0])
|
|
self.assertIsNotNone(manager)
|
|
self.assertEqual(42, manager.GetNumberOfNodes())
|
|
self.assertEqual(3, manager.GetNumberOfVehicles())
|
|
self.assertEqual(42+3*2-1, manager.GetNumberOfIndices())
|
|
for i in range(manager.GetNumberOfVehicles()):
|
|
self.assertEqual(0, manager.IndexToNode(manager.GetStartIndex(i)))
|
|
self.assertEqual(0, manager.IndexToNode(manager.GetEndIndex(i)))
|
|
|
|
def test_ctor_multi_depot_all_diff(self):
|
|
manager = pywrapcp.RoutingIndexManager(
|
|
42, 3, [1, 2, 3], [4, 5, 6])
|
|
self.assertIsNotNone(manager)
|
|
self.assertEqual(42, manager.GetNumberOfNodes())
|
|
self.assertEqual(3, manager.GetNumberOfVehicles())
|
|
self.assertEqual(42, manager.GetNumberOfIndices())
|
|
for i in range(manager.GetNumberOfVehicles()):
|
|
self.assertEqual(i+1, manager.IndexToNode(manager.GetStartIndex(i)))
|
|
self.assertEqual(i+4, manager.IndexToNode(manager.GetEndIndex(i)))
|
|
|
|
|
|
class TestRoutingModel(unittest.TestCase):
|
|
|
|
def test_ctor(self):
|
|
manager = pywrapcp.RoutingIndexManager(42, 3, 7)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
if __debug__:
|
|
print(f'class RoutingModel: {dir(routing)}')
|
|
|
|
def test_solve(self):
|
|
manager = pywrapcp.RoutingIndexManager(42, 3, 7)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(0, assignment.ObjectiveValue())
|
|
|
|
def test_solve_multi_depot(self):
|
|
manager = pywrapcp.RoutingIndexManager(
|
|
42, 3, [1, 2, 3], [4, 5, 6])
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(0, assignment.ObjectiveValue())
|
|
|
|
|
|
def test_unary_transit_vector(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
vector = [i+1 for i in range(5)]
|
|
transit_id = routing.RegisterUnaryTransitVector(vector)
|
|
self.assertEqual(1, transit_id)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(15, assignment.ObjectiveValue())
|
|
|
|
def test_unary_transit_callback(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
transit_id = routing.RegisterUnaryTransitCallback(lambda from_index: 1)
|
|
self.assertEqual(1, transit_id)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(5, assignment.ObjectiveValue())
|
|
|
|
def test_transit_matrix(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
matrix = [[i+1 for i in range(5)] for j in range(5)]
|
|
transit_id = routing.RegisterTransitMatrix(matrix)
|
|
self.assertEqual(1, transit_id)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(15, assignment.ObjectiveValue())
|
|
|
|
def test_transit_callback(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
transit_id = routing.RegisterTransitCallback(lambda from_index, to_indx: 1)
|
|
self.assertEqual(1, transit_id)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(5, assignment.ObjectiveValue())
|
|
|
|
def test_vector_dimension(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
transit_id, success = routing.AddVectorDimension(
|
|
[i+1 for i in range(5)],
|
|
10, # capacity
|
|
True, # fix_start_cumul_to_zero
|
|
"DimensionName")
|
|
self.assertTrue(success)
|
|
self.assertEqual(transit_id, 1)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(16, assignment.ObjectiveValue())
|
|
|
|
def test_matrix_dimension(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
matrix = [[i+1 for i in range(5)] for j in range(5)]
|
|
transit_id, success = routing.AddMatrixDimension(
|
|
matrix,
|
|
10, # capacity
|
|
True, # fix_start_cumul_to_zero
|
|
"DimensionName")
|
|
self.assertTrue(success)
|
|
self.assertEqual(transit_id, 1)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(16, assignment.ObjectiveValue())
|
|
|
|
def test_matrix_dimension_2(self):
|
|
manager = pywrapcp.RoutingIndexManager(5, 2, 0)
|
|
self.assertIsNotNone(manager)
|
|
routing = pywrapcp.RoutingModel(manager)
|
|
self.assertIsNotNone(routing)
|
|
matrix = [[i+1 for i in range(5)] for j in range(5)]
|
|
transit_id, success = routing.AddMatrixDimension(
|
|
matrix,
|
|
10, # capacity
|
|
True, # fix_start_cumul_to_zero
|
|
"DimensionName")
|
|
self.assertTrue(success)
|
|
self.assertEqual(transit_id, 1)
|
|
transit2_id = routing.RegisterTransitMatrix(matrix)
|
|
self.assertEqual(transit2_id, 2)
|
|
routing.SetArcCostEvaluatorOfAllVehicles(transit2_id)
|
|
self.assertEqual(routing.ROUTING_NOT_SOLVED, routing.status())
|
|
assignment = routing.Solve()
|
|
self.assertEqual(routing.ROUTING_SUCCESS, routing.status())
|
|
self.assertIsNotNone(assignment)
|
|
self.assertEqual(16, assignment.ObjectiveValue())
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main(verbosity=2)
|