У меня есть общий, к сожалению, совершенно неопределенный c вопрос и 4 конкретных c вопроса. Если вам нравится отвечать только на конкретный c вопрос, go непосредственно на вопросы 2 - 5 :).
Я сейчас провожу некоторое время с инструментами, но, к сожалению, понимаю, что не так много. Моя цель состоит в том, чтобы использовать какой-либо метод или инструменты для моего кода ниже, и я не знаю, с чего начать, хотя я уже потратил как месяц уже с кодом.
Код в конце текста запрограммирован мной и делает следующее: создает объект класса самолета. Этот самолет затем перевозит «клиентов» из аэропорта в аэропорт.
Потребность в поездке, например, из Берлина (BE) в Мюнхен (MU) составляет 54 человека. Поскольку он пользуется наибольшим спросом среди всех направлений, самолет будет летать в Мюнхен, а оттуда летать в Дюссельдорф (DÜ), поскольку этот маршрут наиболее востребован среди всех направлений из Мюнхена. И так далее. В конце концов, самолет должен был перевезти всех в его любимое место назначения.
Теперь моя цель - использовать этот код здесь, чтобы позволить различным самолетам "летать" одновременно. https://developers.google.com/optimization/routing/vrp
Лучше всего будет что-то похожее на программу ниже. Существуют различные транспортные средства, используемые для VRP, и я попытался скопировать часть, где определены транспортные средства. Вся программа кажется мне неизменной, поскольку каждая функция так или иначе связана со всеми остальными функциями, и я не вижу, как правильно использовать метод из нее в моем коде.
"""Vehicles Routing Problem (VRP)."""
from __future__ import print_function
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['distance_matrix'] = [
[
0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502, 388, 354,
468, 776, 662
],
[
548, 0, 684, 308, 194, 502, 730, 354, 696, 742, 1084, 594, 480, 674,
1016, 868, 1210
],
[
776, 684, 0, 992, 878, 502, 274, 810, 468, 742, 400, 1278, 1164,
1130, 788, 1552, 754
],
[
696, 308, 992, 0, 114, 650, 878, 502, 844, 890, 1232, 514, 628, 822,
1164, 560, 1358
],
[
582, 194, 878, 114, 0, 536, 764, 388, 730, 776, 1118, 400, 514, 708,
1050, 674, 1244
],
[
274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 776, 662, 628,
514, 1050, 708
],
[
502, 730, 274, 878, 764, 228, 0, 536, 194, 468, 354, 1004, 890, 856,
514, 1278, 480
],
[
194, 354, 810, 502, 388, 308, 536, 0, 342, 388, 730, 468, 354, 320,
662, 742, 856
],
[
308, 696, 468, 844, 730, 194, 194, 342, 0, 274, 388, 810, 696, 662,
320, 1084, 514
],
[
194, 742, 742, 890, 776, 240, 468, 388, 274, 0, 342, 536, 422, 388,
274, 810, 468
],
[
536, 1084, 400, 1232, 1118, 582, 354, 730, 388, 342, 0, 878, 764,
730, 388, 1152, 354
],
[
502, 594, 1278, 514, 400, 776, 1004, 468, 810, 536, 878, 0, 114,
308, 650, 274, 844
],
[
388, 480, 1164, 628, 514, 662, 890, 354, 696, 422, 764, 114, 0, 194,
536, 388, 730
],
[
354, 674, 1130, 822, 708, 628, 856, 320, 662, 388, 730, 308, 194, 0,
342, 422, 536
],
[
468, 1016, 788, 1164, 1050, 514, 514, 662, 320, 274, 388, 650, 536,
342, 0, 764, 194
],
[
776, 868, 1552, 560, 674, 1050, 1278, 742, 1084, 810, 1152, 274,
388, 422, 764, 0, 798
],
[
662, 1210, 754, 1358, 1244, 708, 480, 856, 514, 468, 354, 844, 730,
536, 194, 798, 0
],
]
data['num_vehicles'] = 4
data['depot'] = 0
return data
def print_solution(data, manager, routing, solution):
"""Prints solution on console."""
max_route_distance = 0
for vehicle_id in range(data['num_vehicles']):
index = routing.Start(vehicle_id)
plan_output = 'Route for vehicle {}:\n'.format(vehicle_id)
route_distance = 0
while not routing.IsEnd(index):
plan_output += ' {} -> '.format(manager.IndexToNode(index))
previous_index = index
index = solution.Value(routing.NextVar(index))
route_distance += routing.GetArcCostForVehicle(
previous_index, index, vehicle_id)
plan_output += '{}\n'.format(manager.IndexToNode(index))
plan_output += 'Distance of the route: {}m\n'.format(route_distance)
print(plan_output)
max_route_distance = max(route_distance, max_route_distance)
print('Maximum of the route distances: {}m'.format(max_route_distance))
def main():
"""Solve the CVRP problem."""
# Instantiate the data problem.
data = create_data_model()
# Create the routing index manager.
manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']),
data['num_vehicles'], data['depot'])
# Create Routing Model.
routing = pywrapcp.RoutingModel(manager)
# Create and register a transit callback.
def distance_callback(from_index, to_index):
"""Returns the distance between the two nodes."""
# Convert from routing variable Index to distance matrix NodeIndex.
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
return data['distance_matrix'][from_node][to_node]
transit_callback_index = routing.RegisterTransitCallback(distance_callback)
# Define cost of each arc.
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
# Add Distance constraint.
dimension_name = 'Distance'
routing.AddDimension(
transit_callback_index,
0, # no slack
3000, # vehicle maximum travel distance
True, # start cumul to zero
dimension_name)
distance_dimension = routing.GetDimensionOrDie(dimension_name)
distance_dimension.SetGlobalSpanCostCoefficient(100)
# 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()
Пока что с определением моей точной проблемы = D. У меня есть различные вопросы об инструменте or, поэтому, если бы вы могли ответить, один из них уже может помочь:
1) У меня сложилось впечатление, что большая часть программы OR-Tools - это большой толстый черный ящик, который работает только для описанной проблемы. Как я могу элегантно извлечь функцию print_solution из программы OR-Tools, чтобы использовать ее для себя и иметь различные самолеты? Извините, что не уточнил c, но любая подсказка будет очень кстати. Каковы требования, что мне нужно, и могу ли я как-то реализовать это в своем коде?
2) В OR-коде есть функция: def distance_callback (from_index, to_index), но она нигде не вызывается. Как функция получает from_index и to_index?
3) Как фактически выводит plan_output в OR-коде?
plan_output += ' {} -> '.format(manager.IndexToNode(index)
Как это работает? Я ожидаю, что код будет выглядеть примерно так:
print ("{}, A computer science portal for geeks."
.format("GeeksforGeeks"))
4) Я понятия не имею, что здесь происходит:
index = solution.Value(routing.NextVar(index))
Как программа узнает, какая следующая переменная это просто сказать NextVar. Также как объект маршрутизации вызывается решением?
5) Я также не понимаю этого:
transit_callback_index = routing.RegisterTransitCallback(distance_callback)
Это проблема, о которой я говорил: distance_callback называется моими 3 разными методами, и никто не знает, что происходит между ними.
Извините за длинный пост. Дайте мне знать, как я могу улучшить мою публикацию. С уважением Бен
import numpy
import sys
import time
import datetime
data = {}
data["airports"] = ["BE", "BR", "DR", "DÜ", "HAM", "MU"]
data["distance_matrix"] = [
# BE BR DR DÜ HAM MU
# [0] [1] [2] [3] [4] [5]
[ 0, 315, 165, 477, 255, 200],# [0]BE
[ 315, 0, 404, 248, 95, 582],# [1]BR
[ 165, 404, 0, 485, 376, 359],# [2]DR
[ 477, 248, 485, 0, 338, 486],# [3]Dü
[ 255, 95, 376, 338, 0, 612],# [4]HAM
[ 504, 582, 359, 486, 612, 0] # [5]MU
]
data["travel_demand"] = [
# BE BR DR DÜ HAM MU
# [0] [1] [2] [3] [4] [5]
[00, 100, 20, 35, 70, 20],# [0]BE
[35, 0, 40, 48, 95, 82],# [1]BR
[15, 4, 0, 45, 24, 59],# [2]DR
[47, 70, 12, 0, 33, 86],# [3]Dü
[ 25, 9, 36, 38, 0, 12],# [4]HAM
[ 54, 58, 35, 87, 62, 0] # [5]MU
]
data["num_vehicles"] = 4
data['vehicle_speed'] = 250 #kmh
data["depot"] = 0
data["passenger_in_flight"] = 10
data["starttime"] = 0
data["traveltime"] = 0
data["maintenance"] = []
data["column_index"] = None
#for in range (20):
# data["Flughäfen"] = [1, 2, 3, 4, 5, 6]
def main():
vehicleA = airplane(data["travel_demand"], data["depot"], data["passenger_in_flight"], data["distance_matrix"], data['vehicle_speed'], data["airports"], data["starttime"], data["column_index"], data["num_vehicles"], data["traveltime"])
vehicleA.output()
class airplane():
def __init__(self, travel_demand, depot, passengers_in_flight, distance_matrix, vehicle_speed, airports, point_in_time, column_index, num_vehicles, traveltime):
self.travel_demand = travel_demand
self.depot = depot
self.passengers_in_flight = passengers_in_flight
self.distance_matrix = distance_matrix
self.vehicle_speed = vehicle_speed
self.airports = airports
self.point_in_time = point_in_time
self.column_index = column_index
self.num_vehicles = num_vehicles
self.traveltime = traveltime
def output(self):
for n in range(0, 300):
maxi = airplane.max_in_row(self)
self.point_in_time = self.point_in_time + maxi[3]
self.point_in_time = round(self.point_in_time, 4)
time = airplane.time_out(self)
hour = maxi[3]
print((maxi[0]), " --> " ,(maxi[1])," ; ", maxi[2]," ; ", maxi[3]," ; ", time)
if self.traveltime == self.point_in_time:
self.column_index = self.depot
print("return to base")
airplane.dem_list(self)
sys.exit()
else:
self.traveltime = self.point_in_time
# def time_maintenance(self):
# if self.point_in_time
def max_in_row(self):
dem = self.travel_demand # ["travel_demand"] # liste der einzelnen Flughäfen, wieviele dahin wollen
level = [] # von welcher spalte starten wir
for i in range(len(dem)):
if self.point_in_time == 0:
column_indexold = self.depot
else:
column_indexold = self.column_index # die reihe wird durchgegangen
level.append(dem[i][column_indexold]) # der liste level werden die werte der reihe hinzugefügt, die spalte bleibt gleich
self.column_index = level.index(max(level)) # der index des maxwertes wird übergeben (zeile wird bestimmt, spalte ist gegeben)
row_index = column_indexold
if dem[self.column_index][row_index] < 10:
rest_dem = 0
print("no feasible flightdestination, changing to other")
max_of_dem = []
for n in range(len(self.travel_demand)):
max_of_dem.append(max(self.travel_demand[n]))
print(max_of_dem)
row_max = max_of_dem.index(max(max_of_dem))
self.column_index = dem[row_max].index(max(dem[row_max]))
else:
rest_dem = max(level) - self.passengers_in_flight #der maxwert selbst wird übergeben
self.column_index = level.index(max(level))
self.travel_demand[self.column_index][column_indexold] = rest_dem
traveltime = int(self.distance_matrix[self.column_index][column_indexold])/int(self.vehicle_speed)
airport_last = self.airports[column_indexold]
airport_next = self.airports[self.column_index]
return(airport_last, airport_next, rest_dem, traveltime)
def time_out(self):
launch_date = datetime.datetime(2020, 1, 1, 10, 0, 0)
dt = datetime.timedelta(self.point_in_time/24)
s = (launch_date + dt)
return (s)
def dem_list(self):
airpt = []
for n in range(len(self.travel_demand)):
airpt.append(str(self.airports[n]))
print(airpt[0], " | " ,airpt[1]," | ", airpt[2]," | ", airpt[3]," | ", airpt[4]," | ",airpt[5])
for n in range(len(self.travel_demand)):
output_list =[]
#print(output_list)
for i in range(len(self.travel_demand)):
output_list.append(self.travel_demand[n][i])
output_list.append(str(self.airports[n]))
print(output_list[0], " | " ,output_list[1]," | ", output_list[2]," | ", output_list[3]," | ",output_list[4]," | ",output_list[5]," # ", output_list[6])
if __name__ == "__main__":
main()