Что-то у меня сомнение, что этот вариант оптимальный. Я не знаю как проходит река(и), но если бы ее не было, 100% сначала надо в (46, 33), после (1, 1)
Читать полностью…import pandas as pd
from collections import deque
# Загрузка карты города
url = 'https://drive.google.com/uc?id=1-crPzL6qMinByPzsrEHhGn1EJ1MfD3GX'
try:
df = pd.read_csv(url, names=list(range(0, 100, 1)))
city_map_list = df.values.tolist()
except Exception as e:
print("Ошибка при загрузке карты:", e)
city_map_list = []
def bfs(start, goal, city_map):
queue = deque([start])
visited = set()
visited.add(start)
parent = {start: None}
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # right, down, left, up
while queue:
current = queue.popleft()
if current == goal:
break
for direction in directions:
neighbor = (current[0] + direction[0], current[1] + direction[1])
if (0 <= neighbor[0] < len(city_map) and
0 <= neighbor[1] < len(city_map[0]) and
city_map[neighbor[0]][neighbor[1]] == 1 and
neighbor not in visited):
visited.add(neighbor)
parent[neighbor] = current
queue.append(neighbor)
# Восстановление пути
if goal in parent:
path = []
step = goal
while step is not None:
path.append(step)
step = parent[step]
return path[::-1] # Возвращаем путь в правильном порядке
else:
return None # Путь не найден
def find_route(courier_location, orders_location, city_map):
route = []
current_position = courier_location
for order in orders_location:
if city_map[order[0]][order[1]] == 0:
print(f"Заказ {order} находится на непроходимой ячейке.")
continue
path = bfs(current_position, order, city_map)
if path:
route.extend(path[:-1]) # Добавляем все, кроме последнего элемента
current_position = order # Обновляем текущее местоположение курьера
else:
print(f"Нет пути к заказу {order}.")
route.append(current_position) # Добавляем последнюю точку (после всех доставок)
return route
# Пример использования
courier_location = (10, 10)
orders_location = [(1, 1), (92, 13), (46, 33)]
route = find_route(courier_location, orders_location, city_map_list)
# Вывод маршрута
for step in route:
print(step)
Алгоритмов много. Вон вам про BFS написали. Но как вариант можете и используя reinforcement learning запилить😂. А вообще в лоб можно просто через перебор сделать, сохраняя каждую ветвь, и удаляя их если есть совпадения в последнем узле, при длине >= сравниваемой.
Читать полностью…вопрос скорее к тем кто смог решить данную задачу, но если у кого-то есть решение я буду рад
Читать полностью…import pandas as pd
from collections import deque
url = 'https://drive.google.com/uc?id=1-crPzL6qMinByPzsrEHhGn1EJ1MfD3GX'
df = pd.read_csv(url, names=list(range(0, 100, 1)))
city_map_list = df.values.tolist()
courier_location = (10, 10) # Пример начальной позиции курьера
orders_location = [(1, 1), (92, 13), (46, 33)] # Пример заказов
def bfs(start, goal, city_map):
queue = deque([start])
visited = set()
visited.add(start)
parent = {start: None}
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # right, down, left, up
while queue:
current = queue.popleft()
if current == goal:
break
for direction in directions:
neighbor = (current[0] + direction[0], current[1] + direction[1])
if (0 <= neighbor[0] < len(city_map) and
0 <= neighbor[1] < len(city_map[0]) and
city_map[neighbor[0]][neighbor[1]] == 1 and
neighbor not in visited):
visited.add(neighbor)
parent[neighbor] = current
queue.append(neighbor)
# Восстановление пути
if goal in parent:
path = []
step = goal
while step is not None:
path.append(step)
step = parent[step]
return path[::-1] # Возвращаем путь в правильном порядке
else:
return None # Путь не найден
def find_route(courier_location, orders_location, city_map):
route = []
current_position = courier_location
for order in orders_location:
path = bfs(current_position, order, city_map)
if path:
route.extend(path[:-1]) # Добавляем все, кроме последнего элемента
current_position = order # Обновляем текущее местоположение курьера
else:
print(f"Нет пути к заказу {order}.")
route.append(current_position) # Добавляем последнюю точку (после всех доставок)
return route
# Пример использования
route = find_route(courier_location, orders_location, city_map_list)
# Вывод маршрута
print("Маршрут курьера:")
for step in route:
print(step)
# Проверка местоположения курьера после всех доставок
if route:
print(f"Курьер завершил на позиции: {route[-1]}")
else:
print("Курьер не смог завершить маршрут.")
Маршрут должен проходить только по земле, по воде ходить нельзя.
Курьеры могут перемещаться на один шаг из текущего района вправо, влево, вниз или вверх.
Маршрут должен быть сохранен в список, где каждый элемент, это tuple с координатами каждого шага курьера.
Курьер проходит один шаг за 10 минут и может доставлять заказы в любом порядке
(10, 10)
(10, 9)
(10, 8)
(10, 7)
(10, 6)
(10, 5)
(10, 4)
(10, 3)
(10, 2)
(10, 1)
(9, 1)
(8, 1)
(7, 1)
(6, 1)
(5, 1)
(4, 1)
(3, 1)
(2, 1)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(1, 5)
(1, 6)
(1, 7)
(1, 8)
(1, 9)
(1, 10)
(1, 11)
(1, 12)
(2, 12)
(3, 12)
(4, 12)
(5, 12)
(6, 12)
(7, 12)
(8, 12)
(9, 12)
(10, 12)
(11, 12)
(12, 12)
(13, 12)
(14, 12)
(15, 12)
(16, 12)
(17, 12)
(18, 12)
(19, 12)
(20, 12)
(21, 12)
(22, 12)
(23, 12)
(24, 12)
(25, 12)
(26, 12)
(27, 12)
(28, 12)
(29, 12)
(29, 13)
(30, 13)
(31, 13)
(32, 13)
(33, 13)
(34, 13)
(35, 13)
(36, 13)
(37, 13)
(38, 13)
(39, 13)
(40, 13)
(41, 13)
(42, 13)
(43, 13)
(44, 13)
(45, 13)
(46, 13)
(47, 13)
(48, 13)
(49, 13)
(50, 13)
(51, 13)
(52, 13)
(53, 13)
(54, 13)
(55, 13)
(56, 13)
(57, 13)
(58, 13)
(59, 13)
(60, 13)
(61, 13)
(62, 13)
(63, 13)
(64, 13)
(65, 13)
(66, 13)
(67, 13)
(68, 13)
(69, 13)
(70, 13)
(71, 13)
(72, 13)
(73, 13)
(74, 13)
(75, 13)
(76, 13)
(77, 13)
(78, 13)
(79, 13)
(80, 13)
(81, 13)
(82, 13)
(83, 13)
(84, 13)
(85, 13)
(86, 13)
(87, 13)
(88, 13)
(89, 13)
(90, 13)
(91, 13)
(92, 13)
(92, 14)
(92, 15)
(92, 16)
(92, 17)
(92, 18)
(92, 19)
(92, 20)
(92, 21)
(92, 22)
(92, 23)
(92, 24)
(92, 25)
(92, 26)
(92, 27)
(92, 28)
(92, 29)
(92, 30)
(92, 31)
(92, 32)
(92, 33)
(92, 34)
(92, 35)
(92, 36)
(92, 37)
(92, 38)
(92, 39)
(92, 40)
(92, 41)
(92, 42)
(91, 42)
(90, 42)
(89, 42)
(88, 42)
(87, 42)
(86, 42)
(85, 42)
(84, 42)
(83, 42)
(82, 42)
(81, 42)
(80, 42)
(79, 42)
(78, 42)
(77, 42)
(76, 42)
(75, 42)
(74, 42)
(73, 42)
(72, 42)
(71, 42)
(70, 42)
(69, 42)
(68, 42)
(67, 42)
(66, 42)
(65, 42)
(64, 42)
(63, 42)
(62, 42)
(61, 42)
(60, 42)
(59, 42)
(58, 42)
(57, 42)
(56, 42)
(55, 42)
(54, 42)
(53, 42)
(52, 42)
(51, 42)
(51, 41)
(51, 40)
(51, 39)
(51, 38)
(51, 37)
(51, 36)
(51, 35)
(51, 34)
(51, 33)
(50, 33)
(49, 33)
(48, 33)
(47, 33)
(46, 33)
я тож сперва делал список из тех квадратов где вода, но потом чтоб их исключить из трека курьера и тд и так далее, в итоге выходил костыль на костыле
Читать полностью…import copyЧитать полностью…
temporary_map = copy.deepcopy(city_map_list)
paths = []
route = []
temporary_map[courier_location[1]][courier_location[0]] = 0
if courier_location[1] - 1 >= 0 \
and temporary_map[courier_location[1] - 1][courier_location[0]] == 1:
paths.append([(courier_location[0], courier_location[1] - 1)])
temporary_map[courier_location[1] - 1][courier_location[0]] = 0
if courier_location[0] + 1 <= len(temporary_map[courier_location[1]]) - 1 \
and temporary_map[courier_location[1]][courier_location[0] + 1] == 1:
paths.append([(courier_location[0] + 1, courier_location[1])])
temporary_map[courier_location[1]][courier_location[0] + 1] = 0
if courier_location[1] + 1 <= len(temporary_map) - 1 \
and temporary_map[courier_location[1] + 1][courier_location[0]] == 1:
paths.append([(courier_location[0], courier_location[1] + 1)])
temporary_map[courier_location[1] + 1][courier_location[0]] = 0
if courier_location[0] - 1 >= 0 \
and temporary_map[courier_location[1]][courier_location[0] - 1] == 1:
paths.append([(courier_location[0] - 1, courier_location[1])])
temporary_map[courier_location[1]][courier_location[0] - 1] = 0
while len(orders_location) > 0:
temp_paths = paths.copy()
for path in temp_paths:
if path[-1] in orders_location:
route = path.copy()
orders_location.remove(path[-1])
paths = [route.copy()]
temporary_map = copy.deepcopy(city_map_list)
temporary_map[path[-1][1]][path[-1][0]] = 0
break
else:
if path[-1][1] - 1 >= 0 and temporary_map[path[-1][1] - 1][path[-1][0]] == 1:
temp_pass = path.copy()
temp_pass.append((path[-1][0], path[-1][1] - 1))
paths.append(temp_pass)
temporary_map[path[-1][1] - 1][path[-1][0]] = 0
if path[-1][0] + 1 <= (len(temporary_map[path[-1][1]]) - 1) and temporary_map[path[-1][1]][path[-1][0] + 1] == 1:
temp_pass = path.copy()
temp_pass.append((path[-1][0] + 1, path[-1][1]))
paths.append(temp_pass)
temporary_map[path[-1][1]][path[-1][0] + 1] = 0
if path[-1][1] + 1 <= (len(temporary_map) - 1) and temporary_map[path[-1][1] + 1][path[-1][0]] == 1:
temp_pass = path.copy()
temp_pass.append((path[-1][0], path[-1][1] + 1))
paths.append(temp_pass)
temporary_map[path[-1][1] + 1][path[-1][0]] = 0
if path[-1][0] - 1 >= 0 and temporary_map[path[-1][1]][path[-1][0] - 1] == 1:
temp_pass = path.copy()
temp_pass.append((path[-1][0] - 1, path[-1][1]))
paths.append(temp_pass)
temporary_map[path[-1][1]][path[-1][0] - 1] = 0
paths.remove(path)
print(route)
то есть данная ошибка _ Не все заказы были доставлены
Недоставленные заказы: [(27, 80), (26, 75), (43, 52), (42, 76)]
изза того, что путипересекаются?
Я реализовал такую идею: из точки курьера начинают расползаться во все стороны все возможные пути (чтоб их число не становилось астрономическим, им нельзя пересекаться). Как только один из путей утыкается в адрес доставки - он объявляется основным и процесс повторяется, пока не покроем все адреса.
Решение неоптимальное (общий путь не всегда кратчайший), но работает и код несложный.
Думаю, его можно усложнить для поиска наикратчайшего пути, но я тогда не стал заморачиваться.
В нашем городе есть большая река с 4-мя мостами. Карта города также закодирована при помощи списка из списков. Чтобы скачать карту на ваш компьютер, выполните следующий код:
import pandas as pd
url='https://drive.google.com/uc?id=1-crPzL6qMinByPzsrEHhGn1EJ1MfD3GX'
df = pd.read_csv(url, names=list(range(0, 100, 1)))
city_map_list = df.values.tolist()
Теперь в переменной city_map_list cписок из списков 100 на 100 — карта города. Недавно в городе запустилась служба доставки, но курьеры жалуются, что из-за сложной географии мостов и улиц тяжело найти дорогу. Поэтому нам нужно написать программу для навигатора.
Задача:
В переменных courier_location, orders_location city_map_list сохранены позиции курьера, координаты доставок и карта города.
courier_location — tuple из двух целых чисел.
Координаты стартового местоположения курьера в формате (x, y). Где x и y — это целые числа от 0 до 99.
Пример courier_location = (10, 10)
orders_location — список как минимум из одного tuple с координатами.
Координаты, по которым курьер должен доставить заказы. В списке хранится произвольное число tuple с координатами точек назначения, которые должен посетить курьер.
Пример orders_location = [(1, 1), (92, 13), (46, 33)]
city_map_list — список из списков 100 на 100, карта города, которую мы загрузили выше.
Вам известно местоположение курьера, набор координат мест назначения и карта города. Теперь нужно написать скрипт, который создаст переменную route и сохранит в нее маршрут, по которому должен пройти курьер, чтобы разнести все доставки. При формировании маршрута необходимо выполнить следующие условия:
Маршрут должен проходить только по земле, по воде ходить нельзя.
Курьеры могут перемещаться на один шаг из текущего района вправо, влево, вниз или вверх.
Маршрут должен быть сохранен в список, где каждый элемент, это tuple с координатами каждого шага курьера.
Курьер проходит один шаг за 10 минут и может доставлять заказы в любом порядке.
Пример:
Рассмотрим работу навигатора на нашем городе 5 на 5.
city_map_list = [
[1, 1, 0, 0, 1],
[1, 1, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]
]
courier_location = (2, 2) # стартовая позиция курьера
orders_location = [(4, 0), (0, 2), (4, 3)] # координаты для доставки трех товаров
route = [
(3, 2),
(4, 2),
(4, 1),
(4, 0), # адрес доставки
(4, 1),
(4, 2),
(3, 2),
(2, 2),
(1, 2),
(0, 2), # адрес доставки
(1, 2),
(2, 2),
(3, 2),
(4, 2),
(4, 3) # адрес доставки
]