Имя: Пароль:
LIFE
Юмор
OFF: Поиск паука-матки в лабиринте (Python)
🠗 (Волшебник 16.05.2025 09:27)
0 Волшебник
 
15.05.25
16:21
Учёным колонистов на другой планете удалось разработать дрона в виде паука, который не отличим от настоящего. У дрона есть МУТАГЕН, которым можно воздействовать на паука-матку, чтобы следующее поколение пауков стало дружелюбным к людям. Для этого нужно найти паука-матку в подземном лабиринте MxN. Для простоты предположим, что лабиринт двумерный прямоугольный с ортогональной тесселяцией размерами от 5 до 15 по каждому измерению. Гамма-сканирование показало, где именно находится матка (координаты цели известны), но структура лабиринта неизвестна. Дрон стартует из точки [0,0] - левый верхний угол. Зарядки дрона хватает на ограниченное количество шагов (задаётся).

Напишите функцию go() в программе ниже, чтобы дрон мог найти цель.
Алгоритм может быть не самым оптимальным.

Шаблон программы: https://disk.yandex.ru/d/pZUqV-rDenuSiQ
Для запуска можно использовать https://www.online-python.com/

Пример лабиринта ниже:
# — камень/стена
O — цель
. — маршрут дрона
1 СвинТуз
 
15.05.25
16:32
2 СвинТуз
 
15.05.25
16:33
лабиринт односвязный?
3 Волшебник
 
15.05.25
16:44
(2) многосвязный
4 СвинТуз
 
15.05.25
16:47
какое-то решение на С
boolean[][] maze = new boolean[width][height]; // The maze
boolean[][] wasHere = new boolean[width][height];
boolean[][] correctPath = new boolean[width][height]; // The solution to the maze
int startX, startY; // Starting X and Y values of maze
int endX, endY;     // Ending X and Y values of maze

public void solveMaze() {
    maze = generateMaze(); // Create Maze (false = path, true = wall)

    // Below assignment to false is redundant as Java assigns array elements to false by default, but it is included because other languages may not behave the same.
    for (int row = 0; row < maze.length; row++)  
        // Sets boolean Arrays to default values
        for (int col = 0; col < maze[row].length; col++){
            wasHere[row][col] = false;
            correctPath[row][col] = false;
        }
    boolean b = recursiveSolve(startX, startY);
    // Will leave you with a boolean array (correctPath)
    // with the path indicated by true values.
    // If b is false, there is no solution to the maze
}
public boolean recursiveSolve(int x, int y) {
    if (x == endX && y == endY) return true; // If you reached the end
    if (maze[x][y] || wasHere[x][y]) return false;
    // If you are on a wall or already were here
    wasHere[x][y] = true;
    if (x != 0) // Checks if not on left edge
        if (recursiveSolve(x-1, y)) { // Recalls method one to the left
            correctPath[x][y] = true; // Sets that path value to true;
            return true;
        }
    if (x != width - 1) // Checks if not on right edge
        if (recursiveSolve(x+1, y)) { // Recalls method one to the right
            correctPath[x][y] = true;
            return true;
        }
    if (y != 0)  // Checks if not on top edge
        if (recursiveSolve(x, y-1)) { // Recalls method one up
            correctPath[x][y] = true;
            return true;
        }
    if (y != height - 1) // Checks if not on bottom edge
        if (recursiveSolve(x, y+1)) { // Recalls method one down
            correctPath[x][y] = true;
            return true;
        }
    return false;
}
5 Волшебник
 
15.05.25
16:47
(4) Внимательнее прочитайте условие, там язык Python
6 СвинТуз
 
15.05.25
16:51
(5)
Это Ява
ну уж ... мы не на форуме поклонников Питона.
С Явы я пререведу если надо.
Но писать ну чужом языке. Это кто-то другой )))
7 Волшебник
 
15.05.25
16:53
(6) Переведите с Java на Python
8 СвинТуз
 
15.05.25
16:56
(7)
)))
я могу но лень.
9 СвинТуз
 
15.05.25
22:10
слишком много времени ни на что
10 СвинТуз
 
15.05.25
17:00
Наслаждайтесь.

https://uproger.com/reshenie-labirinta-s-pomoshhyu-obucheniya-s-podkrepleniem/

Настоящий 1С-ник должен быть туп, ленив и жаден если забыли.
С этим я могу работать.
11 СвинТуз
 
15.05.25
17:00
только лень.
12 sikuda
 
15.05.25
17:03
(8) Найти код в интеренете и не найти конвертора
https://products.codeporting.ai/ru/convert/java-to-python/
13 СвинТуз
 
15.05.25
17:04
(12)
я примерно о том же.
14 СвинТуз
 
15.05.25
17:05
(12)
Я его в принципе читаю, как код на большинстве языков.
Но переводить = без меня.
ну или найти конвертер. это все легко.
15 Волшебник
 
15.05.25
17:06
(10) Слишком сложно. Здесь достаточно алгоритма случайного движения мыши (Random Mouse Algorithm) даже без памяти.
Для ускорения сходимости можно добавить память пройденных клеток и сначала выбирать среди новых.
16 СвинТуз
 
15.05.25
17:08
(15)
Зачем мне тупому, ленивому и жадному?
Я не пишу на питоне. Не пишу игры.

Если припрет я раскопаю.
17 sikuda
 
15.05.25
17:16
(15) Это не по нашему. Мы любим алгоритмы:
Каждый ход это увеличение массива точек куда может прийти робот.
От каждой точки массива берем (влево, вверх, вправо, вниз) - проверяем на стенку и на уникальность в массиве.
Как только в этом массиве есть конечная точка заканчиваем
18 СвинТуз
 
15.05.25
17:11
Интегралы по поверхности сложнее брать,
хотя если знать как то решить, например,
изгибные колебания круглой пьезокерамической пластины на трех опорах под воздействием тока довольно просто.
19 СвинТуз
 
15.05.25
17:12
(17)
Тут все гуру решат.
Вопрос времени. Даже на Питоне.
20 СвинТуз
 
15.05.25
17:16
Все пугают сопроматом. Вообще легко было.
Сложно было математический анализ на первой сессии.

ладно. Хорошего вечера всем.
21 СвинТуз
 
15.05.25
17:17
Алгоритм прост.
Найти шаблон на питоне и подогнать.
22 СвинТуз
 
15.05.25
17:19
(0)
Лет через 12.5 приходите с такими вопросами.
Наступит пенсия. Развлекусь с удовольствием.
Пока есть работа ))))
23 СвинТуз
 
15.05.25
17:40
Строго говоря это не лабиринт. Это плоскость с завалами.
Видимо "Алгоритм мыши" нужен. + стараться сокращать расстояние.

Когда-то давно была игра. "Time zero" был момент когда
монстры не могли выбрать путь к игроку.
Путь в таких случаях преграждал завал камней.
Мышь не могла выбрать в какую сторону путь короче.
Циклилась. Число камней было больше чем заданное как ограничение.(Уходила далеко от игрока.) И на следующем ходу она начинала сокращать расстояние идя обратно.
24 Garykom
 
гуру
15.05.25
17:53
банальный волновой алгоритм не?
25 Волшебник
 
15.05.25
18:38
(24) Это тоже избыточно. Здесь надо просто найти цель, а не найти кратчайший путь к цели.
26 Волшебник
 
15.05.25
22:07
Чё такие кислые? DeepSeek справился за 3 итерации.
Функция go() укладывается в 30 строчек.
27 Волшебник
 
15.05.25
22:31
Qwen справился ещё быстрее, но он был уже в контексте и в промте было сразу разрешено задействовать память мыши.
28 sikuda
 
16.05.25
08:33
(26) Основная ошибка людей полагать что Artificial intelligence сам думает и делает. Он просто перебирает варианты на которых научился и сложно их компонует.

Главная задача не написать алгоритм, главная чтобы как можно больше людей понимало как это работает.
И далее хорошая лекция про коллекции Python, сложности алгоритмов вставки и проверки совпадения...
29 Волшебник
 
16.05.25
09:45
Ладно, держите решение.

Программа целиком:
import random

def go(maze, m, n, target, start, max_steps):
	"""Ищет цель в лабиринте, возвращает список ячеек Path или None"""
	visited = set()
	path = [start]
	visited.add(start)

	directions = [(1, 0), (-1, 0), # X
				  (0, 1), (0, -1)] # Y

	current = start
	while current != target and len(path) <= max_steps:
		x, y = current

		neighbors = []
		unvisited_neighbors = []
		for (dx, dy) in directions:
			nx, ny = x + dx, y + dy
			if is_free(nx, ny, maze, m, n):
				neighbors.append((nx, ny))
				if (nx, ny) not in visited:
					unvisited_neighbors.append((nx, ny))
		
		if not neighbors: # тупик
			return None 
		elif unvisited_neighbors:
			# Если есть непосещённые, выбираем случайное из них
			next_cell = random.choice(unvisited_neighbors)
		else:
			# Иначе выбираем из всех доступных
			next_cell = random.choice(neighbors)

		current = next_cell
		visited.add(current)
		path.append(current)

	return path if (current == target) else None

def generate_maze(m, n, start, target, wall_prob):
	"""Генерирует лабиринт со случайными стенами, исключая стартовую и целевую ячейки."""
	maze = [[True for _ in range(n)] for _ in range(m)]
	for x in range(m):
		for y in range(n):
				if (x, y) != start and (x, y) != target:
					if random.random() < wall_prob:
						maze[x][y] = False
	return maze

def is_free(x, y, maze, m, n):
	"""Проверяет, является ли ячейка свободной (True)"""
	return 0 <= x < m and 0 <= y < n and maze[x][y]


def display_maze(maze, m, n, target, title="Maze", path=[]):
	"""Визуализирует карту с маршрутом."""
	print(f"\n--- {title} ---")
	for x in range(m):
		sign = ""
		for y in range(n):
			coord = (x, y)
			if coord == target:
				sign += " O"
			elif maze[x][y] == False:
				sign += " #"
			elif coord in path:
				sign += " ."
			else:
				sign += "  "
		print(sign)

# тело программы
if __name__ == "__main__":

	M, N = random.randint(5,15), random.randint(5,15) # Размеры лабиринта 
	start = (0, 0) # Начальная позиция 
	max_steps = 1000 # Максимальная дальность пути 
	target = (random.randint(0, M-1), random.randint(0, N-1))

	# Генерация лабиринта. True - ячейка пустая, False - камень/стена
	maze = generate_maze(M, N, start, target, wall_prob=0.2)

	# Отображение оригинального лабиринта
	display_maze(maze, M, N, target, "Maze")

	# запуск алгоритма поиска цели 
	path = go(maze, M, N, target, start, max_steps)

	if path:
		# Цель найдена. Отображение карты с маршрутом 
		display_maze(maze, M, N, target, "Path", path)
		print(f"\nЦель найдена за {len(path) - 1} шагов.")
	else:
		print(f"\nНе удалось найти цель.")

30 Волшебник
 
16.05.25
09:27
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой