Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PDPTW with Start/End Nodes Crashes (python) #3782

Closed
hj1234 opened this issue May 12, 2023 · 1 comment
Closed

PDPTW with Start/End Nodes Crashes (python) #3782

hj1234 opened this issue May 12, 2023 · 1 comment
Assignees
Labels
Help Needed Modeling/Usage problem Lang: Python Python wrapper issue Solver: Routing Uses the Routing library and the original CP solver
Milestone

Comments

@hj1234
Copy link

hj1234 commented May 12, 2023

What version of OR-Tools and what language are you using?
Version: main
Language: Python

Issue related to: #2167 (but after python solution please!)

**Which solver are you using Routing Solver

What did you do?

Ran the following code (adapted from the tutorials in the docs):

"""Vehicles Routing Problem (VRP) with Time Windows."""

from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp


def create_data_model():
    """Stores the data for the problem."""
    data = {}
    data['time_matrix'] = [[0, 1648, 2037, 2565, 3385, 2930, 2933, 3701, 3452, 3521, 3506], [1532, 0, 649, 1176, 2102, 1522, 1435, 2245, 2064, 2227, 2501], [2093, 859, 0, 659, 1694, 1354, 1027, 1796, 1547, 1708, 2622], [2464, 1230, 708, 0, 1260, 1135, 768, 1142, 1162, 1323, 2994], [3120, 2130, 1675, 1391, 0, 777, 852, 1350, 2189, 2350, 3961], [2694, 1435, 1180, 1191, 806, 0, 480, 1402, 1985, 2146, 3466], [2885, 1584, 1128, 829, 667, 539, 0, 901, 1560, 1721, 3415], [3545, 2311, 1788, 1279, 1277, 1459, 1148, 0, 914, 1074, 4074], [3407, 2173, 1650, 1327, 1987, 2021, 1538, 1088, 0, 161, 3906], [3432, 2266, 1744, 1441, 2102, 2136, 1653, 1202, 263, 0, 3753], [3345, 2459, 2282, 2810, 3845, 3505, 3178, 3946, 3697, 3645, 0]]
    data['time_windows'] = [
   (0, 32400),
 (14400, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400),
 (0, 32400)
    ]
    data['num_vehicles'] = 1
    data['depot'] = 0
    data['starts'] = [0]
    data['ends'] = [10]
    return data


def print_solution(data, manager, routing, solution):
    """Prints solution on console."""
    print(f'Objective: {solution.ObjectiveValue()}')
    time_dimension = routing.GetDimensionOrDie('Time')
    total_time = 0
    for vehicle_id in range(data['num_vehicles']):
        index = routing.Start(vehicle_id)
        plan_output = 'Route for vehicle {}:\n'.format(vehicle_id)
        while not routing.IsEnd(index):
            time_var = time_dimension.CumulVar(index)
            plan_output += '{0} Time({1},{2}) -> '.format(
                manager.IndexToNode(index), solution.Min(time_var),
                solution.Max(time_var))
            index = solution.Value(routing.NextVar(index))
        time_var = time_dimension.CumulVar(index)
        plan_output += '{0} Time({1},{2})\n'.format(manager.IndexToNode(index),
                                                    solution.Min(time_var),
                                                    solution.Max(time_var))
        plan_output += 'Time of the route: {}min\n'.format(
            solution.Min(time_var))
        print(plan_output)
        total_time += solution.Min(time_var)
    print('Total time of all routes: {}min'.format(total_time))


def main():
    """Solve the VRP with time windows."""
    # Instantiate the data problem.
    data = create_data_model()

    # Create the routing index manager.
    manager = pywrapcp.RoutingIndexManager(len(data['time_matrix']),
                                           data['num_vehicles'], data['starts'], data['ends'])

    # Create Routing Model.
    routing = pywrapcp.RoutingModel(manager)


    # Create and register a transit callback.
    def time_callback(from_index, to_index):
        """Returns the travel time between the two nodes."""
        # Convert from routing variable Index to time matrix NodeIndex.
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return data['time_matrix'][from_node][to_node]

    transit_callback_index = routing.RegisterTransitCallback(time_callback)

    # Define cost of each arc.
    routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

    # Add Time Windows constraint.
    time = 'Time'
    routing.AddDimension(
        transit_callback_index,
        43200,  # allow waiting time
        43200,  # maximum time per vehicle
        False,  # Don't force start cumul to zero.
        time)
    time_dimension = routing.GetDimensionOrDie(time)
    # Add time window constraints for each location except depot.
    for location_idx, time_window in enumerate(data['time_windows']):
        if location_idx == data['depot']:
            continue
        index = manager.NodeToIndex(location_idx)
        time_dimension.CumulVar(index).SetRange(time_window[0], time_window[1])
    # Add time window constraints for each vehicle end node.
    depot_idx = data['depot']
    for vehicle_id in range(data['num_vehicles']):
        index = routing.Start(vehicle_id)
        time_dimension.CumulVar(index).SetRange(
            data['time_windows'][depot_idx][0],
            data['time_windows'][depot_idx][1])

    # Instantiate route start and end times to produce feasible times.
    for i in range(data['num_vehicles']):
        routing.AddVariableMinimizedByFinalizer(
            time_dimension.CumulVar(routing.Start(i)))
        routing.AddVariableMinimizedByFinalizer(
            time_dimension.CumulVar(routing.End(i)))

    # Setting first solution heuristic.
    search_parameters = pywrapcp.DefaultRoutingSearchParameters()
    search_parameters.first_solution_strategy = (
        routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC)

    # Solve the problem.
    solution = routing.SolveWithParameters(search_parameters)

    # Print solution on console.
    if solution:
        print_solution(data, manager, routing, solution)


if __name__ == '__main__':
    main()

What did you expect to see
Optimised route with constraints

What did you see instead?
Kernel crashes

@lperron
Copy link
Collaborator

lperron commented May 12, 2023

Most likely a bug in the model. Moving to discussions.

@google google locked and limited conversation to collaborators May 12, 2023
@lperron lperron converted this issue into discussion #3783 May 12, 2023
@Mizux Mizux self-assigned this May 14, 2023
@Mizux Mizux added this to the v9.7 milestone May 14, 2023
@Mizux Mizux added Help Needed Modeling/Usage problem Lang: Python Python wrapper issue Solver: Routing Uses the Routing library and the original CP solver labels May 14, 2023

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
Help Needed Modeling/Usage problem Lang: Python Python wrapper issue Solver: Routing Uses the Routing library and the original CP solver
Projects
None yet
Development

No branches or pull requests

3 participants