def __constroiGrafo(self):
        # construindo o grafo Matriz de Incidencia (MxN)
        self.grafo = [[0 for i in range(self.qtdVertices + 1)]
                      for i in range(self.qtdArestas)]

        for i in range(2, len(self.linhasAqr) - 1):
            linha = i - 2
            # print(self.linhasAqr[i])
            a, b = map(int, self.linhasAqr[i].split("--"))
            self.grafo[linha][a] = 1
            self.grafo[linha][b] = 1
            cor = None
            self.grafo[linha][self.qtdVertices] = cor
            self.listAresta.append(Aresta(a, b, cor))
            vA = Vertice(a)
            vB = Vertice(b)
            if a not in self.verticesChaves:
                self.listVertice[a] = vA
                self.verticesChaves.append(a)
            if b not in self.verticesChaves:
                self.listVertice[b] = vB
                self.verticesChaves.append(b)

            self.listVertice[a].insereVizinho(b, cor)
            self.listVertice[b].insereVizinho(a, cor)
예제 #2
0
 def adicionaVertice(self, name):
     if not self.existVert(name):
         v1 = Vertice()
         v1.name = name
         self.vertices[v1.name] = v1
     else:
         print("Vertice {} já existe!".format(name))
예제 #3
0
 def adjacentes(self, name):
     verticesCopy = {}
     for x in self.vertices[name].subVertices:
         v = Vertice()
         v.name = self.vertices[x].name
         verticesCopy[v.name] = v
     return verticesCopy
예제 #4
0
 def copyVertices(self):
     verticesCopy = {}
     for x in self.vertices:
         v = Vertice()
         v.name = self.vertices[x].name
         verticesCopy[v.name] = v
     return verticesCopy
예제 #5
0
 def umVertice(self):
     v = Vertice()
     index = randint(0, self.ordem() - 1)
     for x in self.vertices:
         if index == 0:
             v.name = self.vertices[x].name
             return v
         index -= 1
     return v
예제 #6
0
 def cargarDesdeMatriz(self, Matriz, Demanda):
     #for fila in range(0, len(Matriz)):
     #    self._V.append(Vertice(fila+1, Demanda[fila]))    #V=[1,3,4] A=[(1,3)(3,4)] => sol 1->3->4->5->2
     for fila in range(0, len(Matriz)):
         self._V.append(Vertice(fila+1, Demanda[fila]))    #V=[1,3,4] A=[(1,3)(3,4)] => sol 1->3->4->5->2
         for columna in range(0, len(Matriz[fila])):
             aux = Arista(Vertice(fila+1, Demanda[fila]),Vertice(columna+1, Demanda[columna]),(Matriz[fila][columna]))
             aux.setId(fila, columna, len(Matriz))
             self._A.append(aux)
예제 #7
0
    def cargaVertices(self, secuencia, sinVerticeInicial):
        V = []

        if (sinVerticeInicial):
            for x in secuencia:
                V.append(Vertice(int(x) + 1, self._demanda[x]))
        else:
            for x in secuencia:
                V.append(Vertice(int(x), self._demanda[x - 1]))

        return V
예제 #8
0
 def geraVertices(self, listaVertices, numeroDeVertices):
     vertices = {}  # cria lista para armazenar todos os vertices
     for i in range(numeroDeVertices):
         vertices[i] = Vertice(
             i, listaVertices[i]
         )  # inicializa cada vertice com seu respectivo indice e valor, e adiciona o mesmo na lista
     return vertices  # retorna a lista de vertices
예제 #9
0
    def lerGrafoDoArquivoGr(arquivo: str, bipartido: bool):
        f = open(arquivo, "r", encoding='utf-8')
        linhas = f.readlines()
        f.close()

        grafo = None
        for i in range(0, len(linhas)):
            valores = linhas[i].split(" ")
            if valores[0] == "p":
                numVertices = int(valores[2])
                vertices = list(
                    map(lambda v: Vertice(v, str(v)),
                        range(1, numVertices + 1)))
                if valores[1] == "max":
                    grafo = GrafoDirigido(vertices)
                elif valores[1] == "edge":
                    if bipartido:
                        grafo = GrafoBipartido(vertices)
                    else:
                        grafo = GrafoNaoDirigido(vertices)
            elif valores[0] == "a" or valores[0] == "e":
                v1 = grafo.vertices[int(valores[1]) - 1]
                v2 = grafo.vertices[int(valores[2]) - 1]
                peso = 1
                if (len(valores) >= 4):
                    peso = float(valores[3])
                grafo.adicionarRelacao(v1, v2, peso)

        if bipartido:
            grafo.lerParticoes()

        return grafo
예제 #10
0
 def insertarV(self, valor):
     ''' Metodo para insertar un vertice dentro de la lista de
         Vertices
         Args:
             valor(objeto): el valor(informacion) contendra el vertice
     '''
     self.__Vertices.append( Vertice(valor) )
예제 #11
0
 def __extract_vertices(self, lines):
     from Vertice import Vertice
     clean_lines = self.__clean_lines(lines)
     vertices = {}
     for vertex in clean_lines:
         vertices[vertex[0]] = Vertice(vertex[1], vertex[2], vertex[3])
     return vertices
 def criarRedeResidual(grafo: GrafoDirigido):
     vertices = list(map(lambda v: Vertice(v.numero, v.rotulo), grafo.vertices))
     redeResidual = GrafoDirigido(vertices)
     for arco in grafo.relacoes.values():
         redeResidual.adicionarRelacao(arco.v1, arco.v2, arco.peso)
         redeResidual.adicionarRelacao(arco.v2, arco.v1, 0)
     return redeResidual
예제 #13
0
파일: Grafo.py 프로젝트: mthsnts/Grafo
 def newVertice(self, nome):  # cria um novo vertice
     for vt in self.vertices:
         if vt.nome == nome:
             print('Esse vértice já existe')
             return False
     else:
         v = Vertice(nome)
         self.vertices.append(v)
예제 #14
0
    def __criaVertice(self, u):

        # Verifica se o vértice u é novo (ou seja: nao foi encontrado
        # no grafo)
        if (self._obtemPosicao(u) == -1):
            vertice = Vertice(u)
            self.__lista.append(vertice)
            self.__posicoes[str(u)] = self.__lista.index(vertice)
    def inserirVerticesArtificiaisSeNecessario(grafo: GrafoDirigido):
        vertices = list(map(lambda v: Vertice(v.numero, v.rotulo), grafo.vertices))
        maiorNumVertice = max(map(lambda v: v.numero, vertices))
        novoGrafo = GrafoDirigido(vertices)

        for key in grafo.relacoes:
            if key not in novoGrafo.relacoes:
                arcoAtual = grafo.relacoes[key]
                novoGrafo.adicionarRelacao(arcoAtual.v1, arcoAtual.v2, arcoAtual.peso)

                idArcoRetorno = grafo.gerarIdRelacao(arcoAtual.v2, arcoAtual.v1)
                if idArcoRetorno in grafo.relacoes:
                    maiorNumVertice = maiorNumVertice + 1
                    vertice = Vertice(maiorNumVertice, "Artificial " + str(maiorNumVertice))
                    novoGrafo.vertices.append(vertice)
                    novoGrafo.adicionarRelacao(arcoAtual.v2, vertice.numero, arcoAtual.peso)
                    novoGrafo.adicionarRelacao(vertice.numero, arcoAtual.v1, arcoAtual.peso)

        return novoGrafo
예제 #16
0
    def solucionAlAzar(self):
        inicio = self._G.getVerticeInicio()
        indices_azar = random.sample( range(2,len(self._G.getV())+1), len(self._G.getV())-1)
        
        alAzar = []
        alAzar.append(inicio)
        for i in indices_azar:
            alAzar.append(Vertice(i,0))

        return alAzar
예제 #17
0
    def generateGraph(gDic):
        """
        根据图字典生成图
        :param gDic: 图字典
        :return: 图
        """
        graph = Graph()
        vDic = {}
        for srcId, dstDic in zip(gDic.keys(), gDic.values()):
            for dstId, srcToDstValue in zip(dstDic.keys(), dstDic.values()):
                srcValue, dstValue, weight = Graph.__transfromEdge__(
                    srcToDstValue)
                srcVertice = vDic.get(srcId, Vertice(srcValue, id=srcId))
                vDic[srcId] = srcVertice
                dstVertice = vDic.get(dstId, Vertice(dstValue, id=dstId))
                vDic[dstId] = dstVertice

                graph.addEdge(Edge(srcVertice, dstVertice, weight=weight))

        return graph
예제 #18
0
    def __init__(self, num_vertices, num_aristas):
        self.num_vertices = num_vertices
        self.num_aristas = num_aristas
        self.vertices = []
        self.aristas = []
        self.ordenado = False
        self.max_ts = 0

        for i in range(0, num_vertices):
            vertice = Vertice(i)
            self.vertices.append(vertice)
예제 #19
0
 def __lerVertices(linhas):
     numeroDeVertices = int(linhas[0].split(" ")[1])
     vertices = []
     for i in range(1, numeroDeVertices + 1):
         linha = linhas[i]
         posicaoEspaco = linha.index(" ")
         numeroVertice = int(linha[0:posicaoEspaco])
         posicaoInicioRotulo = posicaoEspaco + 2
         posicaoFimRotulo = len(linha) - 2
         rotulo = linha[posicaoInicioRotulo:posicaoFimRotulo]
         vertices.append(Vertice(numeroVertice, rotulo))
     return vertices
예제 #20
0
    def criarGrafoTransposto(self):
        vertices = list(
            map(lambda v: Vertice(v.numero, v.rotulo),
                self.vertices))  # para nao ficar na mesma posicao de memoria
        novoGrafo = GrafoDirigido(vertices)

        for key in self.relacoes:
            arcoAtual = self.relacoes[key]
            novoGrafo.adicionarRelacao(arcoAtual.v2, arcoAtual.v1,
                                       arcoAtual.peso)

        return novoGrafo
예제 #21
0
    def __init__(self, vertices=[], arestas=[], orientado=True, valorado=False):
        self.orientado = orientado
        self.vertices = []
        self.valorado = valorado
        id = 0
        for vertice in vertices:
            self.vertices.append(Vertice(id, vertice))
            id += 1

        self.arestas = []
        id = 0
        for aresta in arestas:
            self.addAresta(id, aresta[0], aresta[1], aresta[2] if self.valorado else 1)
            id += 1
예제 #22
0
    def __criaAresta(self, u, v, peso=1):
        pos1 = self._obtemPosicao(u)
        pos2 = self._obtemPosicao(v)

        if (pos1 >= 0 and pos2 >= 0):
            aux = self.__lista[pos1]  # Vértice auxiliar
            # Encontra o próximo elemento do vetor
            while (aux != None and aux._obtemProximo() != None):
                aux = aux._obtemProximo()
            # Cria um nó na lista de u contendo o vértice v
            aux._criaProximo(Vertice(self.__lista[pos2]._obtemNome(), peso))

            # Modifica o último para apontar para nulo
            prox = aux._obtemProximo()
            prox._modificaProximo(None)
예제 #23
0
    def solucionVecinosCercanos(self):
        inicio = self._G.getV()[0]
        matrizDist = self._G.getMatriz()

        recorrido = []
        visitados = []
        
        recorrido.append(inicio)    #Agrego el vertice inicial
        visitados.append(0)     #Agrego el vertice inicial
        masCercano=0
        for i in range(0,len(matrizDist)-1):
            masCercano = self.vecinoMasCercano(matrizDist,masCercano, visitados) #obtiene la posicion dela matriz del vecino mas cercano
            recorrido.append(Vertice(masCercano+1,0))
            visitados.append(masCercano)
            i

        return recorrido
예제 #24
0
    def cargaGrafoDesdeSec(self, secuencia):
        V = []
        self._A = []
        costo = 0
        demAcum = 0
        self._demandaAcumulada = []
        cap = 0

        #for x in secuencia:
        for i in range(0, len(secuencia)):
            x = secuencia[i]
            V.append(Vertice(int(x), self._demanda[x - 1]))

            if i > 0:
                Vfila = V[i - 1]
                Vcol = V[i]
                fila = Vfila.getValue() - 1
                col = Vcol.getValue() - 1
                dist = self.getMatriz()[fila][col]  #Referencias en la matriz
                new_edge = Arista(Vfila, Vcol, dist)
                new_edge.setId(fila, col, len(self._matrizDistancias))
                self._A.append(new_edge)
                demAcum += new_edge.getOrigen().getDemanda()
                self._demandaAcumulada.append(demAcum)
                costo += dist
                cap += Vfila.getDemanda()

        self.setV(V)
        Vfila = V[-1]
        Vcol = V[0]
        fila = Vfila.getValue() - 1
        col = 0
        dist = self.getMatriz()[fila][col]
        new_edge = Arista(Vfila, Vcol, dist)
        new_edge.setId(fila, col, len(self._matrizDistancias))
        self._A.append(new_edge)
        demAcum += new_edge.getOrigen().getDemanda()
        self._demandaAcumulada.append(demAcum)
        costo += dist
        cap += Vfila.getDemanda()
        self._costoAsociado = costo

        return cap
예제 #25
0
def BFS(grafo, s):
    listaAdj = grafo.adj
    vertices = []
    for i in range(0, grafo.ordem + 1):
        vertices.append(Vertice(i, 0, float("inf"), -1))
    vertices[s].cor = 1
    vertices[s].distancia = 0
    vertices[s].predecessor = -1

    fila = []
    fila.append(vertices[s])
    while len(fila) != 0:
        u = fila.pop(0)
        uAdj = listaAdj[u.numVertice]
        for x in uAdj:
            if vertices[x].cor == 0:
                vertices[x].cor = 1
                vertices[x].distancia = u.distancia + 1
                vertices[x].predecessor = u.numVertice
                fila.append(vertices[x])
        vertices[u.numVertice].cor = 2
    return vertices
예제 #26
0
 def addVertice(self, key, duracao):
     self.numVertices = self.numVertices + 1
     verticeAtual = Vertice(key, duracao)
     self.vertList[key] = verticeAtual
     return verticeAtual
예제 #27
0
def main():

    dot = gv.Graph(format='png')

    dot.node('A')
    dot.node('B')
    dot.node('C')
    dot.node('D')
    dot.node('E')

    dot.edge('A', 'B')
    dot.edge('A', 'C')
    dot.edge('A', 'E')
    dot.edge('B', 'C')
    dot.edge('C', 'D')
    dot.edge('C', 'E')
    dot.edge('D', 'E')

    print(dot.source)

    filename = dot.render(filename='img/g1')
    print(filename)

    a = Vertice('A')
    b = Vertice('B')
    c = Vertice('C')
    d = Vertice('D')
    e = Vertice('E')

    a.addVert(b)
    a.addVert(c)
    a.addVert(e)
    b.addVert(c)
    c.addVert(d)
    c.addVert(e)
    d.addVert(c)

    g = Grafo()
    print
    graph(g)
    print
    g.addVertice(a)
    g.addVertice(b)
    g.addVertice(c)
    g.addVertice(d)
    g.addVertice(e)
    g.addAresta(b, d)
    print
    print
    print(graph(g))
예제 #28
0
파일: Grafo.py 프로젝트: dinlib/tsp-grafos
 def addVertice(self, chave):
     self.numVertices += 1
     novoVertice = Vertice(chave)
     self.listaVertices[chave] = novoVertice
     return novoVertice
예제 #29
0
파일: test.py 프로젝트: z-liner/IAlgorithms
# -*- coding: utf-8 -*-

from Graph import Graph
from Vertice import Vertice
from Edge import Edge

# d = {"a": {"aa": 11}, "b": {"bb": 22}}
#
# l = []
# for d1 in d.values():
#     l += d1.values()
#
# print l

import random
vertices = [Vertice(v) for v in range(7)]
nodes = [vertices[i] for i in [random.randint(0, 6) for _ in range(14)]]

_edges = [Edge(nodes[i], nodes[i + 1]) for i in range(len(nodes) - 1)]

edges = []
for i in range(len(_edges) - 1):
    same = False
    for j in range(i + 1, len(_edges)):
        isSameSrc = _edges[i].srcVertice.id == _edges[j].srcVertice.id
        isSameDst = _edges[i].dstVertice.id == _edges[j].dstVertice.id
        if isSameDst and isSameSrc:
            same = True

    if not same:
        edges.append(_edges[i])
예제 #30
0
파일: Grafo.py 프로젝트: NataliaGhizi/grafo
 def novo_Vertice(self, identificador):
     self.lista_Vertices.append(Vertice(identificador))