Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [sumo-user] Error In SumoLib Graph traversing

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 <bijal.varia88@xxxxxxxxx>:
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="", 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
sumo-user@xxxxxxxxxxx
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
sumo-user@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://www.eclipse.org/mailman/listinfo/sumo-user



Back to the top