def findNewPath(self, startVertices, endVertices, newRoutes, matrixPshort, gamma, lohse, dk): """ This method finds the new paths for all OD pairs. The Dijkstra algorithm is applied for searching the shortest paths. """ newRoutes = 0 for start, startVertex in enumerate(startVertices): endSet = set() for end, endVertex in enumerate(endVertices): if startVertex._id != endVertex._id and matrixPshort[start][end] > 0.: endSet.add(endVertex) if dk == 'boost': D, P = dijkstraBoost(self._boostGraph, startVertex.boost) elif dk == 'plain': D, P = dijkstraPlain(startVertex, endSet) elif dk == 'extend': D, P = dijkstra(startVertex, endSet) for end, endVertex in enumerate(endVertices): if startVertex._id != endVertex._id and matrixPshort[start][end] > 0.: helpPath = [] helpPathSet = set() pathcost = D[endVertex] / 3600. ODPaths = self._paths[startVertex][endVertex] for path in ODPaths: path.currentshortest = False vertex = endVertex while vertex != startVertex: helpPath.append(P[vertex]) helpPathSet.add(P[vertex]) vertex = P[vertex]._from helpPath.reverse() newPath, smallDiffPath = self.checkSmallDiff( ODPaths, helpPath, helpPathSet, pathcost) if newPath: newpath = Path(startVertex, endVertex, helpPath) ODPaths.append(newpath) newpath.getPathLength() for route in ODPaths: route.updateSumOverlap(newpath, gamma) if len(ODPaths) > 1: for route in ODPaths[:-1]: newpath.updateSumOverlap(route, gamma) if lohse: newpath.pathhelpacttime = pathcost else: newpath.actpathtime = pathcost for edge in newpath.edges: newpath.freepathtime += edge.freeflowtime newRoutes += 1 elif not smallDiffPath: if lohse: path.pathhelpacttime = pathcost else: path.actpathtime = pathcost path.usedcounts += 1 path.currentshortest = True return newRoutes
def calcKPaths(self, verbose, kPaths, newRoutes, startVertices, endVertices, matrixPshort, gamma): if verbose: foutkpath = open('kpaths.xml', 'w') print("""<?xml version="1.0"?> <!-- generated on %s by $Id: network.py 20685 2016-05-10 10:08:20Z luecken $ --> <routes>""" % datetime.datetime.now(), file=foutkpath) for start, startVertex in enumerate(startVertices): for vertex in self.getNodes(): vertex.preds = [] vertex.wasUpdated = False startVertex.preds.append(Predecessor(None, None, 0)) updatedVertices = [startVertex] while len(updatedVertices) > 0: vertex = updatedVertices.pop(0) vertex.wasUpdated = False for edge in vertex.getOutgoing(): if edge._to != startVertex and edge._to.update(kPaths, edge): updatedVertices.append(edge._to) for end, endVertex in enumerate(endVertices): ODPaths = self._paths[startVertex][endVertex] if startVertex._id != endVertex._id and matrixPshort[start][end] != 0.: for startPred in endVertex.preds: temppath = [] temppathcost = 0. pred = startPred vertex = endVertex while vertex != startVertex: temppath.append(pred.edge) temppathcost += pred.edge.freeflowtime vertex = pred.edge._from pred = pred.pred if len(ODPaths) > 0: minpath = min( ODPaths, key=operator.attrgetter('freepathtime')) if minpath.freepathtime * 1.4 < temppathcost / 3600.: break temppath.reverse() newpath = Path(startVertex, endVertex, temppath) newpath.getPathLength() ODPaths.append(newpath) for route in ODPaths: route.updateSumOverlap(newpath, gamma) if len(ODPaths) > 1: for route in ODPaths[:-1]: newpath.updateSumOverlap(route, gamma) newpath.freepathtime = temppathcost / 3600. newpath.actpathtime = newpath.freepathtime newRoutes += 1 if verbose: foutkpath.write(' <path id="%s" source="%s" target="%s" pathcost="%s">\n' % ( newpath.label, newpath.source, newpath.target, newpath.actpathtime)) foutkpath.write(' <route>') for edge in newpath.edges[1:-1]: foutkpath.write('%s ' % edge.label) foutkpath.write('</route>\n') foutkpath.write(' </path>\n') if verbose: foutkpath.write('</routes>\n') foutkpath.close() return newRoutes