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]>: > 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 import Net > > from sumolib.net import NetReader > > from sumolib.net import Lane > > from sumolib.net import Edge > > from sumolib.net import Node > > from sumolib.net import Connection > > from 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 = n > > >> class Graph_mat: > > vertices = {} > > edges = [] > > edge_indices = {} > > >> def add_vertex(self, vertex): > > if isinstance(vertex, Vertex) and vertex.name not in self.vertices: > > self.vertices[vertex.name] = vertex > > for row in self.edges: > > row.append(0) > > self.edges.append([0] * (len(self.edges)+1)) > > self.edge_indices[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] > 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
