Как обеспечить максимальное время езды на пассажир как мягкое ограничение в VRP или Tools?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как обеспечить максимальное время езды на пассажир как мягкое ограничение в VRP или Tools?

Сообщение Anonymous »

Я работаю над проблемой маршрутизации транспортного средства с использованием Google или Tyools.
Контекст заключается в том, что каждый «клиент» (или пассажир) должен быть поднят и в конечном итоге доставлен в общее пункт назначения (например, школа утром или из школы до дома днем). < /p>
мне нужно, чтобы покончить с собой или, по крайней мере, поощрять, что: P> < /br />

(по крайней мере, по крайней мере, поощрение, что < />
. - (время забора клиента) ≤ maxridetime < /p>
Например, каждый пассажир не должен тратить более 60 минут на транспортное средство. (например, максимум 3 часа на шину). < /p>
То, с чем я борюсь, так это то, как выразить ограничение времени для загуста в пределах заезда в течение срока или на основе or-инструмента: < /p>
Это зависит от оба конец Cumul (на конечной маршруте), так и на appi-api-at ’at-stours’ ’pr /pr /pr /pr /pr /pr /pry-at’ at-stors. Мягкие/жесткие границы на отдельных кучевых VAR, но не непосредственно на разнице, например (End - Pickup).
Я хотел бы, чтобы решатель предпочитал решения, где у всех клиентов есть время езды ≤ 60 минут (мягкое ограничение, наказание нарушений), но я не уверен, какова стратегия лучшего моделирования. Штраф за (End-Pickup) непосредственно в или инструкциях? Спасибо! < /P>
data = self._create_data_model(route_id, is_am)
if not data:
print("Failed to create data model")
return None

print("Data model created successfully, starting OR-Tools solver...")

# Create routing manager and model
manager = pywrapcp.RoutingIndexManager(
len(data['duration_matrix']),
data['num_vehicles'],
data['starts'],
data['ends']
)
routing = pywrapcp.RoutingModel(manager)

# Create distance callback
def distance_callback(from_index, to_index):
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
return data['duration_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

# Add duration constraint (4 hours max)
dimension_name = 'Duration'
routing.AddDimension(
transit_callback_index,
0, # slack
data['route_duration'], # vehicle maximum travel time (4 hours)
True, # start cumul to zero
dimension_name
)

# Add capacity constraint
def demand_callback(from_index):
from_node = manager.IndexToNode(from_index)
return data['demands'][from_node]

demand_callback_index = routing.RegisterUnaryTransitCallback(demand_callback)
routing.AddDimensionWithVehicleCapacity(
demand_callback_index,
0,
data['vehicle_capacities'],
True,
'Capacity'
)

# Set search parameters with 1 hour time limit
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = (
routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC)
search_parameters.time_limit.seconds = 3600 # 1 hour solver time limit

print("Running OR-Tools solver with 1 hour time limit...")

start_time = datetime.now()
start_timestamp = time.time()

print(f"Optimization started at: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")

assignment = routing.SolveWithParameters(search_parameters)

# Record end time
end_time = datetime.now()
end_timestamp = time.time()

solve_duration = end_timestamp - start_timestamp

print(f"Optimization completed at: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Total solve time: {solve_duration:.2f} seconds ({solve_duration/60:.1f} minutes)")

if assignment:
print("Solution found! Saving results...")
solution = self._save_solution_to_json(data, manager, routing, assignment,
start_time, end_time, solve_duration)
return solution
else:
print("No solution found within 1 hour time limit")
# Still save timing info even if no solution
no_solution_data = {
'route_id': data['route_id'],
'district_id': data['district_id'],
'is_am': data['is_am'],
'status': 'no_solution_found',
'optimization_start_time': start_time.isoformat(),
'optimization_end_time': end_time.isoformat(),
'solve_duration_seconds': solve_duration,
'solve_duration_minutes': solve_duration/60,
'time_limit_seconds': 3600,
'max_route_duration_hours': data['route_duration']/3600
}

filename = f"route_no_solution_{data['route_id']}_{'AM' if data['is_am'] else 'PM'}.json"
with open(filename, 'w') as f:
json.dump(no_solution_data, f, indent=2)
print(f"No solution info saved to {filename}")

return None



Подробнее здесь: https://stackoverflow.com/questions/797 ... n-or-tools
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»