Python A*

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#A star algorithm

def euclid_distance(startp, endp):
	"""Euclid distance"""
	return ((startp[0] - endp[0]) ** 2 + (startp[1] - endp[1]) ** 2) ** 0.500

def manhattan_distance(startp, endp):
	"""Manhattan distance"""
	return abs(startp[0] - endp[0]) + abs(startp[1] - endp[1])

def surround(point):
	"""Return the coordinations of surrounding points"""
	return [(point[0] + 1, point[1]), (point[0], point[1] + 1), (point[0] - 1, point[1]), (point[0], point[1] - 1)]

def filtering(points, barrier, closed_list):
	"""Filter points not in barrier"""
	return filter(lambda x: x not in barrier and x not in closed_list, points)

def astar(mapsize, barrier, startp, endp):
	"""param: mapsize: length and height of the map
			  barrier: coordination of barrier
	"""
	if endp in barrier or startp in barrier:
		print("No optimal path found, startp or endp is in barriers")
		return None
	g_mat = {}
	h_mat = {}
	f_mat = {}
	path = {}
	length, height = mapsize
	open_list = []
	closed_list = []
	optimal_path = []
	current = startp

	#------------------------step 1------------------------------
	closed_list.append(startp)

	#------------------------step 2------------------------------
	start_sur = list(filtering(surround(startp), barrier, closed_list))
	if (start_sur == []):
		print ("No optimal path found")
		return None
	g_mat = g_mat.fromkeys(start_sur, 1)
	for i in start_sur:
		h_mat[i] = manhattan_distance(i, endp)
		f_mat[i] = g_mat.get(i) + h_mat.get(i)
		path[i]  = startp
	open_list.extend(start_sur) #No use

	#------------------------step 3------------------------------
	while(True):
		if (open_list == None):
			print("No optimal path found")
			break
		if endp in closed_list:
			print("Optimal path found")
			path_point = endp
			while(path_point != startp):
				optimal_path.append(path_point)
				path_point = path.get(path_point)
			optimal_path.append(startp)
			return list(reversed(optimal_path))
		min_f = min(f_mat.values())
		target = [k for k in f_mat.keys() if (f_mat[k] == min_f)]
		last_target = target[-1]

		closed_list.append(last_target)
		del f_mat[last_target]

		#------------------------step 4------------------------------
		current = last_target
		cur_sur = filtering(surround(current), barrier, closed_list)
		for i in cur_sur:
			path[i] = current
			g_mat[i] = g_mat.get(last_target) + 1
			h_mat[i] = manhattan_distance(i, endp)
			f_mat[i] = g_mat.get(i) + h_mat.get(i)
			
op = astar((5,5), [(3, 2), (3, 4), (4, 3)], (3, 3), (3, 5))
print(op)