Thanks for answer Harald & Jakob Actually I am trying to build adjecency matrix using this code.
Graph class has add vertex and add edge function. I have added first edges and then vertex. Plz help me to resolve the issue. Jakob I can solve this issue by myself,But for me python is little new. But as per your suggestion i have tried hard to solve issue by my self. But unfortunatly failed. Thanks for reply once again. On Sun 17 Mar, 2019, 3:48 AM , <[email protected]> wrote: > Send sumo-user mailing list submissions to > [email protected] > > To subscribe or unsubscribe via the World Wide Web, visit > https://www.eclipse.org/mailman/listinfo/sumo-user > or, via email, send a message with subject or body 'help' to > [email protected] > > You can reach the person managing the list at > [email protected] > > When replying, please edit your Subject line so it is more specific > than "Re: Contents of sumo-user digest..." > > > Today's Topics: > > 1. Re: Problem with changing lanes (Jakob Erdmann) > 2. Re: Error In SumoLib Graph traversing (Harald Schaefer) > > > ---------------------------------------------------------------------- > > Message: 1 > Date: Sat, 16 Mar 2019 17:45:03 +0100 > From: Jakob Erdmann <[email protected]> > To: Sumo project User discussions <[email protected]> > Subject: Re: [sumo-user] Problem with changing lanes > Message-ID: > < > cambucbxbsgb8tgkwd6vphw+qhp68j1hsoredi83nxeon063...@mail.gmail.com> > Content-Type: text/plain; charset="utf-8" > > Hello, > the issue is now fixed (https://github.com/eclipse/sumo/issues/5309). > Thanks for reporting. > > Regarding the effect of the duration: > The longer duration does not change the urgency of the lane change attempt. > Rather it controls the time after which the change attempt is aborted if > unsuccessful. > The urgency currently only has two levels (urgent and non-urgent) which can > be controlled using setLaneChangeMode > > https://sumo.dlr.de/wiki/TraCI/Change_Vehicle_State#lane_change_mode_.280xb6.29 > (bits 8 and 9 both set to 1) > > regards, > Jakob > > Am Fr., 15. M?rz 2019 um 18:00 Uhr schrieb H?bner, Karl < > [email protected]>: > > > Dear SUMO devs, > > > > > > > > I use changeLaneRelative(1, 3) for a vehicle for changing its lane to the > > left. If I would do this right before an edge with more lanes than my > > current edge, the vehicle would switch to the left as expected but right > > after driving onto the next edge it switches back again to the next right > > lane, since the lane index has changed. I attached an example script > > demonstrating this behavior. > > > > > > > > This is currently a huge problem for us, do you have any idea how to > solve > > this? > > > > > > > > Another problem I have with the changeLane-command is that with short > > durations the lane change tends to be more aggressive and distorts > upstream > > traffic. Therefore I thought I choose longer durations in the hope that > the > > lane change model has more time to do necessary safety checks. Is this > even > > the case? > > > > > > > > Thanks in advance and kind regards, > > > > Karl > > > > > > _______________________________________________ > > sumo-user mailing list > > [email protected] > > To change your delivery options, retrieve your password, or unsubscribe > > from this list, visit > > https://www.eclipse.org/mailman/listinfo/sumo-user > > > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: < > https://www.eclipse.org/mailman/private/sumo-user/attachments/20190316/6cb1606b/attachment.html > > > > ------------------------------ > > Message: 2 > Date: Sat, 16 Mar 2019 23:17:50 +0100 > From: Harald Schaefer <[email protected]> > To: [email protected] > Subject: Re: [sumo-user] Error In SumoLib Graph traversing > Message-ID: <[email protected]> > Content-Type: text/plain; charset="utf-8" > > Hello Bijal > > you asked for the len of a graph. > A graph consists of edges and nodes, I think you need to specify whether > you want to get the number of edges or nodes. > > Regards? Harald > > Am 16.03.19 um 15:39 schrieb Jakob Erdmann: > > The error does not come from sumo but from your own classes and I > > cannot help you with those. I advise you to find a programmer locally > > who can guide your efforts. > > regards, > > Jakob > > > > Am Sa., 16. M?rz 2019 um 13:30?Uhr schrieb Bijal > > <[email protected] <mailto:[email protected]>>: > > > > Dear Sir, > > > > I am trying to set graph for Ant colony algorithm implementation. > > But I am getting Error says :? > > > > Traceback (most recent call last): > > > > ? File "hay4_ACO.py", line 317, in <module> > > > > ? ? main() > > > > ? File "hay4_ACO.py", line 278, in main > > > > ? ? aco.set_graph(Objgraph_mat) > > > > ? File "hay4_ACO.py", line 111, in set_graph > > > > ? ? self.size = len(graph) > > > > AttributeError: Graph_mat instance has no attribute '__len__' > > > > > > > > Please help me to resolve this issue. I am new bee in this & Some > > how i have managed to get myself up to this. > > > > *Code Is :* > > * > > * > > > > > > import os, sys > > > > import optparse > > > > import subprocess > > > > import random > > > > from Queue import PriorityQueue > > > > import xml.sax > > > > from xml.sax import saxutils, parse, make_parser, handler > > > > from copy import copy > > > > from itertools import * > > > > > > SUMO_HOME = "/home/dhaval/sumo-1.0.0/" > > > > > > try: > > > > ? ? sys.path.append(os.path.join(SUMO_HOME, "tools")) > > > > ? ? # import the library > > > > ? ? import sumolib > > > > ? ? from sumolib import checkBinary > > > > ? ? from sumolib.net <http://sumolib.net> import Net > > > > ? ? from sumolib.net <http://sumolib.net> import NetReader > > > > ? ? from sumolib.net <http://sumolib.net> import Lane > > > > ? ? from sumolib.net <http://sumolib.net> import Edge > > > > ? ? from sumolib.net <http://sumolib.net> import Node > > > > ? ? from sumolib.net <http://sumolib.net> import Connection > > > > ? ? from sumolib.net <http://sumolib.net> import Roundabout > > > > ? ? ? ? > > > > except ImportError: > > > > ? ? sys.exit("please declare environment variable 'SUMO_HOME' > > as the root directory of your sumo installation (it should > > contain folders 'bin', 'tools' and 'docs')") > > > > > > import random > > > > graph = sumolib.net.readNet('Dijkstra1.net.xml') > > > > > > import traci > > > > # the port used for communicating with your sumo instance > > > > PORT = 8873 > > > > > > # implementation of an undirected graph using Adjacency > > Matrix, with weighted or unweighted edges > > > > class Vertex: > > > > def __init__(self, n): > > > > self.name <http://self.name> = n > > > > > > class Graph_mat: > > > > vertices = {} > > > > edges = [] > > > > edge_indices = {} > > > > > > def add_vertex(self, vertex): > > > > if isinstance(vertex, Vertex) and vertex.name > > <http://vertex.name> not in self.vertices: > > > > self.vertices[vertex.name <http://vertex.name>] = vertex > > > > for row in self.edges: > > > > row.append(0) > > > > self.edges.append([0] * (len(self.edges)+1)) > > > > self.edge_indices[vertex.name <http://vertex.name>] = > > len(self.edge_indices) > > > > return True > > > > else: > > > > return False > > > > > > def add_edge(self, u, v, weight=1): > > > > if u in self.vertices and v in self.vertices: > > > > self.edges[self.edge_indices[u]][self.edge_indices[v]] = weight > > > > self.edges[self.edge_indices[v]][self.edge_indices[u]] = weight > > > > return True > > > > else: > > > > return False > > > > def print_graph(self): > > > > for v, i in sorted(self.edge_indices.items()): > > > > print(v + ' ') > > > > for j in range(len(self.edges)): > > > > print(self.edges[i][j]) > > > > print(' ') > > > > > > class Ant(): > > > > > > ? ? def __init__(self): > > > > ? ? ? ? self.cost = 0 > > > > ? ? ? ? self.trace = [0] > > > > > > ? ? def start_travel(self): > > > > ? ? ? ? self.cost = 0 > > > > ? ? ? ? self.trace = [0] > > > > > > ? ? def add_vertex(self, _vertex, _cost): > > > > ? ? ? ? self.trace.append(_vertex) > > > > ? ? ? ? self.cost += _cost > > > > > > ? ? def get_position(self): > > > > ? ? ? ? return self.trace[-1] > > > > > > ? ? def get_cost(self): > > > > ? ? ? ? return self.cost > > > > > > ? ? def get_path(self): > > > > ? ? ? ? path = [] > > > > ? ? ? ? for i in range(len(self.trace) - 1): > > > > ? ? ? ? ? ? path.append((self.trace[i], self.trace[i + 1])) > > > > > > ? ? ? ? return path > > > > > > > > class ACOAlgorithm(): > > > > ? ? ''' > > > > ? ? Ant colony optimization algorithms to find shortest path > > > > ? ? ''' > > > > > > ? ? def __init__(self): > > > > ? ? ? ? self.evaporation_rate = 0.8 > > > > ? ? ? ? self.threshhold = 0.5 > > > > ? ? ? ? self.remain_path = 0 > > > > > > ? ? def set_graph(self, graph): > > > > ? ? ? ? self.size = len(graph) > > > > > > ? ? ? ? self.num_ant = 20*self.size ** 2 > > > > ? ? ? ? self.ant = [Ant() for _ in range(self.num_ant)] > > > > > > > > ? ? ? ? self.distance = graph > > > > ? ? ? ? self.pheromones = [[1.0]* self.size for _ in > > range(self.size)] > > > > > > ? ? ? ? max_distance = 0 > > > > ? ? ? ? for i in range(len(self.distance)): > > > > ? ? ? ? ? ? for j in range(len(self.distance[0])): > > > > ? ? ? ? ? ? ? ? if self.distance[i][j] > max_distance: > > > > ? ? ? ? ? ? ? ? ? ? max_distance = self.distance[i][j] > > > > > > ? ? ? ? for i in range(len(self.distance)): > > > > ? ? ? ? ? ? for j in range(len(self.distance[0])): > > > > ? ? ? ? ? ? ? ? if self.distance[i][j] > 0: > > > > ? ? ? ? ? ? ? ? ? ? self.distance[i][j] /= max_distance*1.0 > > > > ? ? ? ? ? ? ? ? else: > > > > ? ? ? ? ? ? ? ? ? ? self.pheromones[i][j] = -1.0 > > > > > > ? ? def process(self): > > > > ? ? ? ? while True: > > > > ? ? ? ? ? ? self._start_travel() > > > > ? ? ? ? ? ? self._find_edge() > > > > ? ? ? ? ? ? if self._finish_travel(): > > > > ? ? ? ? ? ? ? ? break > > > > > > ? ? ? ? for i in range(self.num_ant): > > > > ? ? ? ? ? ? if len(self.ant[i].trace) == self.size: > > > > ? ? ? ? ? ? ? ? print 'trace %s' % (self.ant[i].trace) > > > > ? ? ? ? ? ? ? ? break > > > > > > ? ? def _start_travel(self): > > > > ? ? ? ? for i in range(self.num_ant): > > > > ? ? ? ? ? ? self.ant[i].start_travel() > > > > > > ? ? def _find_edge(self): > > > > ? ? ? ? while not self._have_ant_completed(): > > > > ? ? ? ? ? ? for i in range(len(self.ant)): > > > > ? ? ? ? ? ? ? ? available_edge = 0 > > > > ? ? ? ? ? ? ? ? for e in range(self.size): > > > > ? ? ? ? ? ? ? ? ? ? if e not in self.ant[i].trace and > > self.pheromones[self.ant[i].get_position()][e] > 0: > > > > ? ? ? ? ? ? ? ? ? ? ? ? available_edge +=? (2.0 - > > > > self.distance[self.ant[i].get_position()][e])*self.pheromones[self.ant[i].get_position()][e] > > > > > > ? ? ? ? ? ? ? ? last_e = -1 > > > > ? ? ? ? ? ? ? ? prob_edge = 0 > > > > ? ? ? ? ? ? ? ? prob_random = random.uniform(0.0, 1.0) > > > > ? ? ? ? ? ? ? ? for e in range(self.size): > > > > ? ? ? ? ? ? ? ? ? ? if e not in self.ant[i].trace and > > self.pheromones[self.ant[i].get_position()][e] > 0: > > > > ? ? ? ? ? ? ? ? ? ? ? ? prob_edge += (2.0 - > > > > self.distance[self.ant[i].get_position()][e])*self.pheromones[self.ant[i].get_position()][e]/available_edge > > > > ? ? ? ? ? ? ? ? ? ? ? ? last_e = e > > > > ? ? ? ? ? ? ? ? ? ? ? ? if prob_edge >= prob_random: > > > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? break > > > > ? ? ? ? ? ? ? ? if last_e >= 0: > > > > ? ? ? ? ? ? ? ? ? ? self.ant[i].add_vertex(last_e, > > self.distance[self.ant[i].get_position()][last_e]) > > > > ? ? ? ? ? ? ? ? else: > > > > ? ? ? ? ? ? ? ? ? ? self.ant[i].start_travel() > > > > > > ? ? def _finish_travel(self): > > > > ? ? ? ? # find short path > > > > ? ? ? ? avg_cost = 0 > > > > ? ? ? ? ant_completed = 0 > > > > ? ? ? ? for i in range(len(self.ant)): > > > > ? ? ? ? ? ? if len(self.ant[i].trace) == self.size: > > > > ? ? ? ? ? ? ? ? avg_cost += self.ant[i].get_cost() > > > > ? ? ? ? ? ? ? ? ant_completed += 1 > > > > ? ? ? ? avg_cost /= ant_completed > > > > > > ? ? ? ? # update pheromones > > > > ? ? ? ? for i in range(len(self.pheromones)): > > > > ? ? ? ? ? ? for j in range(len(self.pheromones[0])): > > > > ? ? ? ? ? ? ? ? if self.pheromones[i][j] > 0: > > > > ? ? ? ? ? ? ? ? ? ? self.pheromones[i][j] *= (1 - > > self.evaporation_rate) > > > > > > ? ? ? ? for i in range(len(self.ant)): > > > > ? ? ? ? ? ? if self.ant[i].get_cost() < avg_cost: > > > > ? ? ? ? ? ? ? ? update_pheromones = self.ant[i].get_path() > > > > ? ? ? ? ? ? ? ? for x,y in update_pheromones: > > > > ? ? ? ? ? ? ? ? ? ? self.pheromones[x][y]? += > > avg_cost/self.ant[i].get_cost() > > > > > > ? ? ? ? # remove path has small pheromones > > > > ? ? ? ? if self.remain_path > 2*(self.size - 1): > > > > ? ? ? ? ? ? for i in range(len(self.pheromones)): > > > > ? ? ? ? ? ? ? ? for j in range(len(self.pheromones[0])): > > > > ? ? ? ? ? ? ? ? ? ? if self.pheromones[i][j] <= self.threshhold: > > > > ? ? ? ? ? ? ? ? ? ? ? ? self.pheromones[i][j] = -1.0 > > > > ? ? ? ? else: > > > > ? ? ? ? ? ? min_pheromones = 999999.99 > > > > ? ? ? ? ? ? for i in range(len(self.pheromones)): > > > > ? ? ? ? ? ? ? ? for j in range(len(self.pheromones[0])): > > > > ? ? ? ? ? ? ? ? ? ? if min_pheromones > self.pheromones[i][j] > > 0: > > > > ? ? ? ? ? ? ? ? ? ? ? ? min_pheromones = self.pheromones[i][j] > > > > > > ? ? ? ? ? ? for i in range(len(self.pheromones)): > > > > ? ? ? ? ? ? ? ? for j in range(len(self.pheromones[0])): > > > > ? ? ? ? ? ? ? ? ? ? if self.pheromones[i][j] <= min_pheromones: > > > > ? ? ? ? ? ? ? ? ? ? ? ? self.pheromones[i][j] = -1.0 > > > > > > ? ? ? ? # check exist only one path > > > > ? ? ? ? self.remain_path = 0 > > > > ? ? ? ? for i in range(len(self.pheromones)): > > > > ? ? ? ? ? ? for j in range(len(self.pheromones[0])): > > > > ? ? ? ? ? ? ? ? if self.pheromones[i][j] > 0: > > > > ? ? ? ? ? ? ? ? ? ? self.remain_path += 1 > > > > > > ? ? ? ? return self.remain_path < self.size > > > > > > ? ? def _have_ant_completed(self): > > > > ? ? ? ? for i in range(len(self.ant)): > > > > ? ? ? ? ? ? if len(self.ant[i].trace) == self.size: > > > > ? ? ? ? ? ? ? ? return True > > > > ? ? ? ? return False > > > > > > > > > > > > def AntColony(graph, start, end=None): > > > > ? ? ? ? D = {}# dictionary of final distances > > > > P = {}# dictionary of predecessors > > > > > > > > > > return (D,P) > > > > ? ? ? ?? > > > > def shortestPath(graph, start, end): > > > > """ > > > > Find a single shortest path from the given start vertex to the > > given end vertex. > > > > The input has the same conventions as Dijkstra(). > > > > The output is a list of the vertices in order along the > > shortest path. > > > > """ > > > > ? ? ? ? start = graph.getEdge(start) > > > > ? ? ? ? end = graph.getEdge(end) > > > > > > D,P = AntColony(graph, start, end) > > > > Path = [] > > > > > > #while 1: > > > > #Path.append(end) > > > > #if end == start: break > > > > #end = P[end] > > > > #Path.reverse() > > > > > > return Path > > > > > > def generate_routefile(): > > > > ? ? with open("dijkstra_000.rou.xml", "w") as routes: > > > > ? ? ? ? print >> routes, """<routes> > > > > ? ? ? ? <vType id="vehicle1" accel="0.8" decel="4.5" > > sigma="0.5" length="5" minGap="2.5" maxSpeed="16.67" > > guiShape="passenger"/> > > > > > > ? ? ? ? <route id="1" edges="1 3 5 9" /> </routes>""" > > > > def main(): > > > > ? ? traci.init(PORT) > > > > ? ? Objgraph_mat = Graph_mat() > > > > ? ? aco = ACOAlgorithm() > > > > ? ? for edge in graph.getEdges(): > > > > ? ? ? ? > > Objgraph_mat.add_vertex(Vertex(edge.getFromNode().getID())) > > > > ? ? ? ? Objgraph_mat.add_vertex(Vertex(edge.getToNode().getID())) > > > > > > > > ? ? for edge in graph.getEdges(): > > > > ? ? ? ? Objgraph_mat.add_edge(edge.getFromNode().getID(), > > edge.getToNode().getID()) > > > > > > ? ? Objgraph_mat.print_graph() > > > > > > ? ? aco.set_graph(Objgraph_mat) > > > > ? ? #aco.process() > > > > ? ? #route = shortestPath(graph, '1', '18') > > > > ? ? #for x in range(len(route)): > > > > ? ? ?#? ?print route[x], > > > > > > ? ? #edges = [str (edge.getID()) for edge in route] > > > > ? ? #create the new route for vehicle > > > > ? ? #traci.route.add("0", edges) > > > > ? ? #assign the new route for vehicle with id vehicle1 > > > > ? ? #traci.vehicle.add("vehicle0","0") > > > > ? ? for i in range(1000):? ? #? or whatever nulmber of steps > > you want to simulate > > > > ? ? ? ? traci.simulationStep() > > > > ? ? traci.close() > > > > ? ? sys.stdout.flush() > > > > ? ?? > > > > > > def get_options(): > > > > ? ? optParser = optparse.OptionParser() > > > > ? ? optParser.add_option("--nogui", action="store_true", > > default=False, help="run the commandline version of sumo") > > > > ? ? options, args = optParser.parse_args() > > > > ? ? return options > > > > > > > > # this is the main entry point of this script > > > > if __name__ == "__main__": > > > > ? ? options = get_options() > > > > ? ? # this script has been called from the command line. It > > will start sumo as a > > > > ? ? # server, then connect and run > > > > ? ? if options.nogui: > > > > ? ? ? ?sumoBinary = checkBinary('sumo') > > > > ? ? else: > > > > ? ? ? ?sumoBinary = checkBinary('sumo-gui') > > > > > > ? ? generate_routefile() > > > > > > ? ? # this is the normal way of using traci. sumo is started as a > > > > ? ? # subprocess and then the python script connects and runs > > > > ? ? sumoProcess = subprocess.Popen([sumoBinary, "-c", > > "dijkstra.sumo.cfg", "--tripinfo-output", "tripinfo.xml", > > "--remote-port", str(PORT)], stdout=sys.stdout, > stderr=sys.stderr) > > > > ? ? main() > > > > ? ? sumoProcess.wait() > > > > > > -- > > *:)* > > Bijal Varia > > _______________________________________________ > > sumo-user mailing list > > [email protected] <mailto:[email protected]> > > To change your delivery options, retrieve your password, or > > unsubscribe from this list, visit > > https://www.eclipse.org/mailman/listinfo/sumo-user > > > > > > _______________________________________________ > > sumo-user mailing list > > [email protected] > > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > > https://www.eclipse.org/mailman/listinfo/sumo-user > > > -------------- next part -------------- > An HTML attachment was scrubbed... > URL: < > https://www.eclipse.org/mailman/private/sumo-user/attachments/20190316/2c8f2251/attachment.html > > > > ------------------------------ > > _______________________________________________ > sumo-user mailing list > [email protected] > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://www.eclipse.org/mailman/listinfo/sumo-user > > > End of sumo-user Digest, Vol 21, Issue 64 > ***************************************** >
_______________________________________________ sumo-user mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/sumo-user
