from pythonds.graphs import PriorityQueue import sys class Vertex: def __init__(self, key): self.id = key self.connectedTo = {} self.dis = sys.maxsize self.pred = None def addNeighbor(self, nbr, weight=0): self.connectedTo[nbr] = weight def setDistance(self, distance): self.dis = distance def getDistance(self): return self.dis def getConnections(self): return self.connectedTo.keys() def getWeight(self, nbr): return self.connectedTo[nbr] def setPred(self, p): self.pred = p class Graph: def __init__(self): self.vertList = {} self.numVertices = 0 def addVertex(self, key): self.numVertices = self.numVertices + 1 newVertex = Vertex(key) self.vertList[key] = newVertex return newVertex def getVertex(self, n): if n in self.vertList: return self.vertList[n] else: return None def __contains__(self, n): return n in self.vertList def addEdge(self, f, t, cost=0): if f not in self.vertList: nv = self.addVertex(f) if t not in self.vertList: nv = self.addVertex(t) self.vertList[f].addNeighbor(self.vertList[t], cost) def getVertices(self): return self.vertList.keys() def __iter__(self): return iter(self.vertList.values()) def dijkstra(aGraph, start): pq = PriorityQueue() start.setDistance(0) pq.buildHeap([(v.getDistance(), v) for v in aGraph]) while not pq.isEmpty(): currentVert = pq.delMin() for nextVert in currentVert.getConnections(): newDist = currentVert.getDistance() + currentVert.getWeight(nextVert) if newDist < nextVert.getDistance(): nextVert.setDistance(newDist) nextVert.setPred(currentVert) pq.decreaseKey(nextVert, newDist) aGraph = Graph() aGraph.addEdge('1', '2', 2) aGraph.addEdge('1', '3', 1) aGraph.addEdge('1', '4', 5) aGraph.addEdge('1', '2', 2) aGraph.addEdge('3', '2', 2) aGraph.addEdge('3', '4', 3) aGraph.addEdge('2', '4', 3) aGraph.addEdge('3', '5', 1) aGraph.addEdge('5', '4', 1) aGraph.addEdge('5', '6', 1) aGraph.addEdge('4', '6', 5) n = input("请输入初始结点:") start = aGraph.getVertex(n) while True: operation = input("1.查询结点 2.退出程序") if operation == "1": m = input("请输入结点,查询该结点距离初始结点的最近的距离:") node = aGraph.getVertex(m) dijkstra(aGraph, start) print(node.getDistance()) elif operation == "2": break 分析代码
时间: 2024-02-14 12:32:59 浏览: 111
这段代码实现了图的最短路径算法,具体来说是 Dijkstra 算法。代码中定义了 Vertex 和 Graph 两个类,Vertex 表示图中的一个顶点,Graph 表示整个图。在 Graph 类中,包含了添加顶点、添加边、获取顶点等基本操作。在 dijkstra 函数中,使用优先队列(PriorityQueue)来实现 Dijkstra 算法,首先将起始顶点的距离设置为0,然后将所有顶点的距离和对应的顶点加入优先队列中,每次从队列中取出距离最小的顶点,更新其相邻顶点的距离和前驱顶点,最终得到起始顶点到其他顶点的最短路径。
在主函数中,通过输入初始结点和查询结点的操作来测试最短路径算法的正确性。输入初始结点后,可以多次查询其他结点到该初始结点的最短距离,直到选择退出程序操作。
相关问题
pythons.graphs中PriorityQueue函数是什么
在 Python 中,graphs 库中的 PriorityQueue 是一个优先级队列类,它是一个基于堆的数据结构,用于存储具有优先级的元素。它可以用于实现 Dijkstra 算法、Prim 算法和 A* 算法等。
PriorityQueue 通过两个方法实现优先级队列:put() 和 get()。put() 方法用于将元素插入队列中,而 get() 方法用于获取具有最高优先级的元素并将其从队列中删除。元素的优先级通常由元组的第一个元素表示。当第一个元素相同时,会使用第二个元素进行比较,以此类推。
下面是使用 PriorityQueue 实现 Dijkstra 算法的伪代码示例:
```
1. 初始化距离和前驱数组
2. 初始化 PriorityQueue,将起点加入队列中
3. while PriorityQueue 不为空:
4. 取出具有最高优先级的节点
5. 遍历该节点的所有邻居:
6. 如果该邻居节点未被访问过或者新的路径比旧路径更短:
7. 更新该邻居节点的距离和前驱
8. 将该邻居节点加入 PriorityQueue 中
9. 返回距离和前驱数组
```
在这个示例中,PriorityQueue 用于存储待访问的节点,并根据节点距离从小到大排序。每次取出具有最高优先级的节点进行更新,直到所有节点都被访问过为止。
import matplotlib.pyplot as plt import tensorflow as tf from tensorflow import keras import numpy as np #加载IMDB数据 imdb = keras.datasets.imdb (train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=100) print("训练记录数量:{},标签数量:{}".format(len(train_data),len(train_labels))) print(train_data[0]) #数据标准化 train_data = keras.preprocessing.sequence.pad_sequences(train_data,value=0,padding='post',maxlen=256) #text_data = keras.preprocessing.sequence.pad_sequences(train_data,value=0,padding='post',maxlen=256) text_data = keras.preprocessing.sequence.pad_sequences(test_data,value=0,padding='post',maxlen=256) print(train_data[0]) #构建模型 vocab_size = 10000 model = tf.keras.Sequential([tf.keras.layers.Embedding(vocab_size, 64), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)), tf.keras.layers.Dense(64,activation='relu'), tf.keras.layers.Dense(1) ]) model.summary() #配置并训练模型 model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']) x_val = train_data[:10000] partial_x_train = train_data[10000:] y_val = train_labels[:10000] partial_y_train = train_labels[10000:] history = model.fit(partial_x_train,partial_y_train,epochs=1,batch_size=512,validation_data=(x_val,y_val),verbose=1) #测试性能 results = model.evaluate(test_data, test_labels, verbose=2) print(results) #训练过程可视化 history_dict = history.history print(history_dict.keys()) def plot_graphs(history, string): plt.plot(history.history[string]) plt.plot(history.history['val_'+string]) plt.xlabel("Epochs") plt.ylabel(string) plt.legend([string,'val_'+string]) plt.show() plot_graphs(history,"accuracy") plot_graphs(history,"loss")
这段代码使用了IMDB电影评论数据集,通过对评论进行情感分析,将评论分为正面或负面两类。其中,数据标准化使用了keras.preprocessing.sequence.pad_sequences函数,将每条评论的长度都设置为256,模型使用了嵌入层、双向LSTM层和2个全连接层,其中嵌入层的大小为10000,LSTM层的大小为64,全连接层的大小为64和1。模型的优化器使用了Adam,损失函数使用了二元交叉熵,评价指标使用了准确率。并且,使用了matplotlib库,对模型的训练过程进行可视化。
阅读全文