Exemplo n.º 1
0
class Bootstrap(object):
    def __init__(self, env):
        self.env = env

        # create simulation enviromment
        img = np.zeros((900, 800, 3), dtype=np.uint8)
        self.sim = Simulation(self.env, img)

    def processSimulation(self):
        # initialize Sioux Falls network
        siouxfalls = SiouxFalls(0.0025)

        # create Sioux Fall network by enumerating across all links
        for linkid, t0 in enumerate(siouxfalls.t0):

            # calculate length of link with sqrt((x1 - x2)^2 + (y1 - y2)^2)
            length = np.sqrt(
                np.power(siouxfalls.x1[linkid] - siouxfalls.x2[linkid], 2)
              + np.power(siouxfalls.y1[linkid] - siouxfalls.y2[linkid], 2)) / 600.
            mu = siouxfalls.mu[linkid]

            # assign nodeID to each link if check pass in node list
            for i, node in enumerate(siouxfalls.nodes):
                if linkid+1 in node:
                    nodeID = i

            # assign turn ratio to each link
            turns = {}
            for j, turn in enumerate(siouxfalls.turns[linkid]):
                turns[j + 1] = turn

            # assign exit probability from last item in turn list ([-1])
            turns['exit'] = turns.pop(list(turns.keys())[-1])

            # generate coordinates of each link (for visualization)
            pt1 = (np.float32(siouxfalls.x1[linkid] / 600.),
                   np.float32(siouxfalls.y1[linkid] / 600.))

            pt2 = (np.float32(siouxfalls.x2[linkid] / 600.),
                   np.float32(siouxfalls.y2[linkid] / 600.))

            c = (pt1, pt2)

            # draw link on map
            self.sim.networkLines.append(c)

            # add link to sim.network
            self.sim.network.addLink(linkID=linkid+1, turns=turns,
                                type='link',  length=length,
                                t0=t0, MU=mu, nodeID=nodeID,
                                coordinates=c)

            # initialize car generation
            self.env.process(self.sim.source(
                10, LAMBDA=siouxfalls.flambda[linkid], linkid=linkid+1))

        yield self.env.timeout(1)
Exemplo n.º 2
0
def main():
    #################################
    # initialize discrete event env #
    #################################
    env = simpy.Environment()  # use instant simulation
    # env = simpy.rt.RealtimeEnvironment(factor=1.)  # use real time simulation

    # initialize Sioux Falls network
    siouxfalls = SiouxFalls(0.0025)

    # create simulation enviromment
    img = np.zeros((900, 800, 3), dtype=np.uint8)
    sim = Simulation(env, img)

    # create Sioux Fall network by enumerating across all links
    for linkid, t0 in enumerate(siouxfalls.t0):

        # calculate length of link with sqrt((x1 - x2)^2 + (y1 - y2)^2)
        length = np.sqrt(
            np.power(siouxfalls.x1[linkid] - siouxfalls.x2[linkid], 2) +
            np.power(siouxfalls.y1[linkid] - siouxfalls.y2[linkid], 2)) / 600.
        mu = siouxfalls.mu[linkid]

        # assign nodeID to each link if check pass in node list
        for i, node in enumerate(siouxfalls.nodes):
            if linkid + 1 in node:
                nodeID = i

        # assign turn ratio to each link
        turns = {}
        for j, turn in enumerate(siouxfalls.turns[linkid]):
            turns[j + 1] = turn

        # assign exit probability from last item in turn list ([-1])
        turns['exit'] = turns.pop(list(turns.keys())[-1])

        # generate coordinates of each link (for visualization)
        pt1 = (np.float32(siouxfalls.x1[linkid] / 600.),
               np.float32(siouxfalls.y1[linkid] / 600.))

        pt2 = (np.float32(siouxfalls.x2[linkid] / 600.),
               np.float32(siouxfalls.y2[linkid] / 600.))

        c = (pt1, pt2)

        # draw link on map
        sim.networkLines.append(c)

        # add link to sim.network
        sim.network.addLink(linkID=linkid + 1,
                            turns=turns,
                            type='link',
                            length=length,
                            t0=t0,
                            MU=mu,
                            nodeID=nodeID,
                            coordinates=c)

        # initialize car generation
        env.process(
            sim.source(10,
                       LAMBDA=siouxfalls.flambda[linkid],
                       linkid=linkid + 1))

    # draw initial network
    for i in sim.networkLines:
        cv2.line(sim.img, i[0], i[1], (255, 255, 255), 3)

    for linkid in sim.network.links:
        loc = (0.25 * np.asarray(sim.network.links[linkid]['coordinates'][1]) +
               0.75 * np.asarray(sim.network.links[linkid]['coordinates'][0]))

        cv2.putText(sim.img, str(linkid), tuple(loc), cv2.FONT_HERSHEY_SIMPLEX,
                    0.5, (255, 255, 255))

    name = 'Sioux Falls Network'
    cv2.imshow(name, sim.img)

    # start visualization update process
    env.process(sim.visualization(frequency=0.2, name=name))

    # wait for keypress to start simulation
    print('press space to start')
    k = cv2.waitKey(0)
    if k == 27:
        sys.exit()

    # run simulation
    env.run()

    ######################################
    # simulation statistics and graphing #
    ######################################
    df = pd.DataFrame(
        sorted(sim.data, key=lambda x: x[3]),
        columns=['carID', 'link', 'event', 'time', 'queue', 't_queue'])
    print(df)

    # cars statistics
    totalTravelTime = (df[['carID', 'time']].groupby(['carID']).max() -
                       df[['carID', 'time']].groupby(['carID']).min())
    totalTravelTime.columns = ['totalTravelTime']

    totalSegments = df.loc[df['event'] == 'arrival'][['carID', 'link']]
    totalSegments = totalSegments.groupby(['carID']).count()
    totalSegments.columns = ['totalSegments']

    meanWaitTime = df.loc[df['event'] == 'departure'][['carID', 't_queue']]
    meanWaitTime = meanWaitTime.groupby(['carID']).mean()
    meanWaitTime.columns = ['meanWaitTime']

    carStatistics = pd.concat([totalTravelTime, totalSegments, meanWaitTime],
                              axis=1)

    # links statistics
    stats.meanQueueLength(plt, df)

    plt.figure(2)

    for link in sim.network.links.keys():
        df2 = df.loc[(df['link'] == link) & (df['event'] != 'entry')]

        if df2.empty is False and df2['t_queue'].sum() > 0.:
            plt.plot(df2[['time']], df2[['queue']], label='link %s' % link)

    plt.title('Queueing Simulation')
    plt.ylabel('queue length')
    plt.xlabel('time (s)')
    plt.legend()
    plt.show()

    print('Press any key to exit')
    cv2.waitKey(0)