diff --git a/homework3/.idea/misc.xml b/homework3/.idea/misc.xml index 6de7068..173fcc4 100644 --- a/homework3/.idea/misc.xml +++ b/homework3/.idea/misc.xml @@ -3,4 +3,5 @@ + \ No newline at end of file diff --git a/homework4/.idea/.gitignore b/homework4/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/homework4/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/homework4/.idea/MarsCodeWorkspaceAppSettings.xml b/homework4/.idea/MarsCodeWorkspaceAppSettings.xml new file mode 100644 index 0000000..05ed8ba --- /dev/null +++ b/homework4/.idea/MarsCodeWorkspaceAppSettings.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/homework4/.idea/homework4.iml b/homework4/.idea/homework4.iml new file mode 100644 index 0000000..2051088 --- /dev/null +++ b/homework4/.idea/homework4.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/homework4/.idea/inspectionProfiles/profiles_settings.xml b/homework4/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/homework4/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/homework4/.idea/misc.xml b/homework4/.idea/misc.xml new file mode 100644 index 0000000..6de7068 --- /dev/null +++ b/homework4/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/homework4/.idea/modules.xml b/homework4/.idea/modules.xml new file mode 100644 index 0000000..1fc4577 --- /dev/null +++ b/homework4/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/homework4/.idea/vcs.xml b/homework4/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/homework4/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/homework4/main.py b/homework4/main.py new file mode 100644 index 0000000..fbc4903 --- /dev/null +++ b/homework4/main.py @@ -0,0 +1,201 @@ +# 导入NumPy库,用于处理多维数组 +import numpy as np + + +# 定义一个表示点的类 +class Point: + """ + 表示二维平面上的一个点,包含坐标和一个评估函数值 f。 + """ + + def __init__(self, x, y): + # 初始化点的 x 坐标 + self.x = x + # 初始化点的 y 坐标 + self.y = y + # 初始化评估函数值 f 为 0 + self.f = 0 + + # 设置点的评估函数值 f + def setF(self, f): + self.f = f + + # 定义点的相等比较方法 + def __eq__(self, other): + # 当两个点的 x 和 y 坐标都相等时,认为这两个点相等 + return self.x == other.x and self.y == other.y + + # 计算当前点到终点的曼哈顿距离加上固定值 1,作为评估函数值 + def getFunctionValue(self, end): + # 计算曼哈顿距离 + dist = abs(self.x - end.x) + abs(self.y - end.y) + # 返回评估函数值 + return dist + 1 + + +# 定义一个表示状态的类 +class State: + """ + 表示地图的状态,包含地图状态、当前点和终点。 + """ + + def __init__(self, state, current_point=Point(0, 0), end_point=Point(0, 0)): + # 初始化地图状态 + self.state = state + # 初始化当前点 + self.cP = current_point + # 初始化终点 + self.eP = end_point + + # 定义状态的相等比较方法 + def __eq__(self, other): + # 当两个状态的当前点相等时,认为这两个状态相等 + return self.cP == other.cP + + # 设置状态的评估函数值 f + def setF(self, f): + self.f = f + + # 设置当前点的坐标 + def setCurrentPoint(self, x, y): + self.cP.x = x + self.cP.y = y + + # 获取当前点的坐标 + def getCurPoint(self): + return self.cP.x, self.cP.y + + +# 确定下一步的方法 +def nextStep(map, openTable, closeTable, wrongTable): + # 存储下一步可能的点 + subPoints = [] + # 获取地图的边界 + boarder = len(map.state) - 1 + # 获取当前所在的点 + x, y = map.getCurPoint() + # 往左走 + if y > 0 and map.state[x][y - 1] == 0: + # 创建新的点 + p = Point(x, y - 1) + # 检查点是否不在关闭列表和错误列表中 + if p not in closeTable and p not in wrongTable: + # 添加到开放列表 + openTable.append(p) + # 获取 F 函数值并设置 + p.setF(p.getFunctionValue(map.eP)) + # 添加到可能的下一步点列表 + subPoints.append(p) + # 往上走 + if x > 0 and map.state[x - 1][y] == 0: + # 创建新的点 + p = Point(x - 1, y) + # 检查点是否不在关闭列表和错误列表中 + if p not in closeTable and p not in wrongTable: + # 添加到开放列表 + openTable.append(p) + # 获取 F 函数值并设置 + p.setF(p.getFunctionValue(map.eP)) + # 添加到可能的下一步点列表 + subPoints.append(p) + # 往下走 + if x < boarder and map.state[x + 1][y] == 0: + # 创建新的点 + p = Point(x + 1, y) + # 检查点是否不在关闭列表和错误列表中 + if p not in closeTable and p not in wrongTable: + # 添加到开放列表 + openTable.append(p) + # 获取 F 函数值并设置 + p.setF(p.getFunctionValue(map.eP)) + # 添加到可能的下一步点列表 + subPoints.append(p) + # 往右走 + if y < boarder and map.state[x][y + 1] == 0: + # 创建新的点 + p = Point(x, y + 1) + # 检查点是否不在关闭列表和错误列表中 + if p not in closeTable and p not in wrongTable: + # 添加到开放列表 + openTable.append(p) + # 获取 F 函数值并设置 + p.setF(p.getFunctionValue(map.eP)) + # 添加到可能的下一步点列表 + subPoints.append(p) + # 根据 F 值排序,获取 F 值最小的点 + subPoints.sort(key=compareF) + if len(subPoints) < 1: + # 防止走到死路无法回头情况 + wrongTable.append(Point(map.cP.x, map.cP.y)) + closeTable.remove(map.cP) + # 获取上一个点作为下一步 + next_point = closeTable[-1] + map.cP.x, map.cP.y = next_point.x, next_point.y + else: + # 获取 F 值最小的点作为下一步 + next_point = subPoints[0] + map.cP.x, map.cP.y = next_point.x, next_point.y + # 将下一步点添加到关闭列表 + closeTable.append(next_point) + # 从开放列表中移除下一步点 + openTable.remove(next_point) + # 展示最终路径信息 + # 合并起点和关闭列表作为最终路径 + # 调用 solve 函数开始寻找路径 + # 创建地图状态对象 + # 初始化最终路径,包含起点 + # 定义终点 + # 定义起点 + # 定义地图状态 + # 错误列表,存储走错的点 + # 关闭列表,存储已探索的点 + # 开放列表,存储待探索的点 + + +# 用于排序的比较函数,返回点的 F 值 +# 开始循环,直到当前点到达终点 + + +# 迭代走下一步 +def solve(map, openTable, closeTable, wrongTable): + # start the loop + while not map.cP == map.eP: + nextStep(map, openTable, closeTable, wrongTable) + + +def compareF(p): + return p.f + + +# 展示最后结果 +def showInfo(map, path): + for i in range(len(map.state)): + for j in range(len(map.state)): + if Point(i, j) in path: + # 正确路径用‘*’表示 + print('*', end=' ') + else: + print(map.state[i, j], end=' ') + print("\n") + return + + +if __name__ == '__main__': + # openList + openTable = [] + # closeList + closeTable = [] + # 走错路返回用的 + wrongTable = [] + state = np.array([[0, 0, 0, 0, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 1], [0, 1, 0, 0, 0], [0, 0, 0, 1, 0]]) + # 起点终点 + start_point = Point(0, 0) + end_point = Point(4, 4) + # 最终路径 + path = [start_point] + Map = State(state, Point(0, 0), end_point) + solve(Map, openTable, closeTable, wrongTable) + print('Best Way:') + path = path + closeTable + showInfo(Map, path) + print("Total steps is %d" % (len(path) - 1))