How to associate objects to the vertices of a graph?

3

I am studying about graph theory, more specifically about the vertices that are units representing a given node of a graph. However, there are still some questions about the vertices.

See this illustration graph in Python:

graph = {
  'A': ['B', 'C', 'D'],  
  'B': ['A'],
  'C': ['A', 'D'],
  'D': ['A', 'C']
}

Notice that it is a non-directed graph, the dictionary saves the path for each vertex.

My question is related to the vertex, if it is possible to make it represent an object or a class . And the object I would like my vertex to represent would be of the type of class Ambiente :

class Ambiente:
  def __init__(self, titulo, descricao, id):
    self.titulo = titulo
    self.descricao = descricao
    self.id = id

I tried to associate the index in the dictionary:

ambientes = {
  'A': Ambiente('Sala de maquinas', 
       "A sala contém várias maquinas industriais, todas parecem não funcionar por anos. O som que é emitido dela é fantasmagórico e causa um estado de panico e alerta, como se a qualquer momento alguma entidade fosse emergir daquela pilha de metal amaldiçoada. Há poucos ruídos, no entanto, não há sinal de vida alguma.", 
       'A'
  )
}

But I do not seem to be effective in this way, especially when I need to navigate the paths of the graph. So, I'd like my question to be answered below.

Question

How could I associate objects with the vertices of the graph?

    
asked by anonymous 14.08.2018 / 02:02

2 answers

2

See if this solution pleases you:

class Ambiente:
  def __init__(self, titulo, descricao, id):
    self.titulo = titulo
    self.descricao = descricao
    self.id = id

A = Ambiente('Sala de maquinas', 
       "A sala contém várias maquinas industriais e bla bla bla", 
       'A'
       )

B = Ambiente('Salão de Festas', 
       "Só fica quem sabe dançar, beber e se divertir!!", 
       'B'
       )

C = Ambiente('Banheiro', 
       "J-a escovou os dentes antes de dormir?", 
       'C'
       )

D = Ambiente('Jardim', 
       "Não coma muitos desses cogumelos ou você terá alucinações...", 
       'D'
       )

grafo = {
  A: [B, C, D],  
  B: [A],
  C: [A, D],
  D: [A, C]
}

Now we have a graph with objects of type Environment, not just strings. We can even do a function: (Edit: following Isac's suggestion)

def printa_grafo(grafo):
    print ("{")
    for key, value in grafo.items():
        print("  {}: [{}]".format(key.id, ', '.join(map(lambda x: x.id, value))))
    print ("}")

>>> printa_grafo(grafo)
{
  B: [A]
  D: [A, C]
  A: [B, C, D]
  C: [A, D]
}
    
14.08.2018 / 05:10
1

Good night, my friend.

At first you are trying to reference a non-istancized class,   What you can do in this respect is to get this class into a variable and then use that variable as the "value" of a key in that graph's dictionary.

more or less so

class Ambiente:
  def __init__(self, titulo, descricao, id):
    self.titulo = titulo
    self.descricao = descricao
    self.id = id

  def __str__(self):
        return "%s, %s, %s" % self.titulo,self.descricao,self.id

Instantiating the class:

  verticeAmbiente = Ambiente('Sala de maquinas', 
           "A sala contém várias maquinas industriais, todas parecem não funcionar por anos. O som que é emitido dela é fantasmagórico e causa um estado de panico e alerta, como se a qualquer momento alguma entidade fosse emergir daquela pilha de metal amaldiçoada. Há poucos ruídos, no entanto, não há sinal de vida alguma.", 
           'A')

After:

Ambiente = {'A': verticeAmbiente}

As the __str__ method inside the class has been implemented, it prints all object attributes passed in constructor .

If you want to see, it's just:

print(Ambiente['A'])

In "tese", (because I never needed it like this)

But I hope it helps.

reference link

    
14.08.2018 / 05:02