Skip to content

Recuperar informações APA do Aimsun Next

O plugin kernel do Aimsun Next oferece classes para iterar sobre todos os caminhos armazenados em um arquivo de Atribuição de Caminho (.apa). A ideia é criar uma classe que derive da classe ForestCalculator e implemente a função doPath. É possível filtrar os caminhos antes de iterar sobre eles. Esse filtro pode ser feito usando a classe AnalysisFilter e configurando os filtros correspondentes. Por exemplo, você pode filtrar caminhos que passam por um conjunto de seções ou caminhos que entram por um conjunto de seções de entrada ou apenas caminhos relacionados a um intervalo de tempo especificado.

A função doPath recebe todos os caminhos para uma determinada chave de caminho (pathKey): - mInterval -> índice de intervalo de tempo - mVehicleIndex -> índice de tipo de veículo - mOriginIndex -> índice do centróide de origem - mOriginCon -> índice de conexão de origem - mDestinationIndex -> índice do centróide de destino - mDestinationCon -> índice de conexão de destino

E as informações do caminho dentro do parâmetro NSPTreeData. Essa classe contém a porcentagem da demanda atribuída ao caminho, bem como as informações do caminho e outras estatísticas como os veículos atribuídos e componentes de função.

Uma vez que a classe derivada da ForestCalculator seja implementada, este é o código para iterar sobre todos os caminhos:

#Filtro
customFilter=AnalysisFilter()
#Leitor de Caminho
#baseForest é o arquivo apa
pr=PathReader(baseForest, model, repIdName)
pr.init()
pr.calculate(customFilter)
pr.finishPaths()

Exemplo: Recuperar informações de atribuição de caminho

import os.path

class PathReader(ForestCalculator):
    def __init__(self, forest, model, name):
        self.forest = forest
        self.model = model
        self.name = name
        self.geo = forest.getGeometry()
        self.nbLines = 1;
        super(ForestCalculator, self).__init__(forest, model, ForestCalculator.eOnlyAvailablePaths)

    def init(self):
        info= QFileInfo(self.model.getDocumentFileName())
        filename = os.path.join(info.absolutePath(),self.name+'_paths.csv')
        self.file = open(filename, 'w')
        if self.file!=None:
            self.file.write("intervalo;veículo;origem;destino;tipo;caminho;probabilidade;veículos gerados;veículos chegados;custo;distância;tempo de viagem;velocidade;componente de função
")
            self.file.flush()
        else:
            print("Não foi possível abrir o arquivo %s"%filename)

    def doPath(self,pathKey, treeData, connections,aux):
        if self.file!=None:
            #print('entro')
            originId = self.geo.getOriginCentroid(pathKey.mOriginIndex)
            destId = self.geo.getDestinationCentroid(pathKey.mDestinationIndex)
            self.file.write("%d;%d;%d;%d;"%(pathKey.mInterval, pathKey.mVehicleIndex, originId, destId))
            typepath = treeData.pathType()
            typelist = ['Nenhum', 'RC', 'PAR', 'ODR', 'TRJ','P2P']
            self.file.write("%s;"%typelist[typepath])
            p = treeData.getPath(self.forest)
            sections = self.forest.getPathSections(self.geo.getSection(treeData.entrancePosition), p, pathKey.mVehicleIndex )
            s='-'.join(map(str, sections))
            self.file.write("%s"%s)
            comp = treeData.getComponents()
            self.file.write(";%f"%comp[1])
            self.file.write(";%f"%comp[0])
            self.file.write(";%f"%comp[2])

            costs =  self.geo.getPathCost( pathKey.mOriginIndex, pathKey.mDestinationIndex, connections, pathKey.mVehicleIndex, pathKey.mInterval )
            cost = costs.mCost
            self.file.write(";%f"%cost)

            distance = costs.mDistance
            self.file.write(";%f"%distance)

            if comp[2]==0.0:
                travel_time = 0.0
            else:
                travel_time = comp[3]/comp[2]

            self.file.write(";%f"%travel_time)

            if travel_time==0.0:
                speed = 0.0*3.6
            else:
                speed = distance*3.6/travel_time

            self.file.write(";%f"%speed)

            components = costs.mCostComponents
            if len(components)>0:
                for component in components:
                    self.file.write(";%f"%component)
            #c = ';'.join(map(str, comp))

            #self.file.write("%s"%c)
            self.file.write("
")
            self.nbLines =self.nbLines+1
            if self.nbLines%1000==0:
                self.file.flush()

    def finishPaths(self):
        if self.file!=None:
            self.file.close()


replicacion1626=model.getCatalog().find( 1626 )
if (replicacion1626.getSimulationStatus() == GKGenericExperiment.eLoaded ):

    #Floresta
    baseForest=replicacion1626.getPathsForest()

    #Filtro
    customFilter=AnalysisFilter()
    #O filtro não pode ser aplicado se for passado para o leitor sem condições. portanto, essa parte pode ser pulada.
    intervals=[0]
    customFilter.setIntervals(intervals)
    userClass=0
    customFilter.setUserClass(userClass)
    originCentroids=[1586]
    customFilter.setOriginCentroids(originCentroids)
    destinationCentroids=[1589]
    customFilter.setDestinationCentroids(destinationCentroids)

    #Nome
    repIdName='Replicação'+str(replicacion1626.getId())
    #Leitor de Caminho
    pr=PathReader(baseForest, model, repIdName)
    pr.init()
    pr.calculate(customFilter)
    pr.finishPaths()
else:   
    print( 'A replicação %s ainda não foi simulada.' %repIdName)

print( 'info no arquivo: %s_paths.csv.' %repIdName)

% Recuperar informações APA de Transporte Público estático do Aimsun Next

Analogamente ao kernel do Aimsun Next, o plugin Macro PT oferece classes para iterar sobre todos os caminhos armazenados em um arquivo de Atribuição de Caminho gerado a partir de uma Atribuição de Transporte Público. A ideia é criar uma classe que derive da classe PTForestCalculator e implemente a função doPTODPair. É possível filtrar os caminhos antes de iterar sobre eles. Esse filtro pode ser feito usando a classe PTForestFilter e configurando os filtros correspondentes. Por exemplo, você pode filtrar caminhos que passam por um conjunto de seções ou linhas ou apenas caminhos relacionados a uma classe de usuário especificada.

A função doPTODPair recebe uma instância de PTODPair contendo todas as informações relacionadas à demanda, os caminhos e suas porcentagens.

Uma vez que a classe derivada da ForestCalculator seja implementada, este é o código para iterar sobre todos os caminhos:

#Filtro
filter=PTForestFilter()
#Leitor de Caminho
#floresta é o arquivo apa
pr=PathReader(forest, filter, model, repIdName)
pr.visit(forest)

Exemplo: Recuperar informações de custos de atribuição de caminho

import os.path

class PTPathReader(PTForestCalculator):

def __init__(self, forest, filter, model, name ):
    self.file = None
    self.model = model
    self.name = name
    self.forest = forest
    super(PTForestCalculator, self).__init__(forest, filter, model, False)

def init(self):
    info= QFileInfo(self.model.getDocumentFileName())
    filename = os.path.join(info.absolutePath(),self.name+'_paths.csv')
    self.file = open(filename, 'w')
    if self.file!=None:
        self.file.write("usuário;origem;destino;volume;custo;tempo;distância;
")
        self.file.flush()
    else:
        print("Não foi possível abrir o arquivo %s"%filename)

def doPTODPair(self,ptODpair):

    if self.file!=None:

        userId = self.forest.getUsers()[ ptODpair.user() ]
        originId = self.forest.getOriginCentroidId( ptODpair.origin() )
        destinationId = self.forest.getDestinationCentroidId( ptODpair.destination() )

        for strategy in ptODpair.strategies():

            for path in strategy.paths():

                self.file.write("%d;"% userId )
                self.file.write("%d;"% originId )
                self.file.write("%d;"% destinationId )
                self.file.write("%f;"%( path.factor()*ptODpair.volume() ) )
                self.file.write("%f;"%path.cost())
                self.file.write("%f;"%path.inVehicleTime())
                self.file.write("%f;"%path.inVehicleDistance())
                self.file.write("
")

        self.file.flush()

def postProcess(self):
    if self.file!=None:
        self.file.close()

EXEMPLO DE USO

experiment=model.getCatalog().findByName("Experimento de Atribuição de Transporte Público") # DEFINA O ID DA REPETIÇÃO AQUI forest=experiment.getForest()

Filtro

filter = PTForestFilter() filter.setUserClass( model.getCatalog().findByName("Usuários de Transporte Público - Trabalho").getId() ) destinationCentroids=[model.getCatalog().findByName("Shopping West").getId()] # DEFINA OS CENTRÓIDES DE DESTINO AQUI filter.setDestinationCentroids(destinationCentroids)

PTPathReader

pr=PTPathReader(forest, filter, model, experiment.getName()) pr.visit(forest)

print("Concluído")