def sim_init( self ) : """ simulation setup """ # construct the simulation blocks sim = Simulation() self.sim = sim if False : script = sample_demands( self.horizon, self.rategraph, self.roadnet ) source = ScriptSource( script ) print 'obtained %d demands' % len( source.script ) debug_input() else : source = RoadnetDemandSource( self.roadnet, self.rategraph ) self.source = source source.join_sim( sim ) # policy setup #import setiptah.roadgeometry.probability as roadprob #roadmap = roadprob.sampleroadnet() #U = roadprob.UniformDist( roadmap ) #samplepoint = U.sample # instantiate the gate gate = GatedTaxiDispatch() gate.setScheduler( RoadmapFHKScheduler( self.roadnet ) ) self.gate = gate # source -> gate # fleet setup vehicles = {} self.vehicles = vehicles # fleet parameters from setiptah.roadgeometry.roadmap_paths import RoadmapPlanner planner = RoadmapPlanner( self.roadnet ) roads = [ road for _,__,road in self.roadnet.edges(data=True) ] road = random.choice( roads ) ORIGIN = ROAD.RoadAddress(road,0.) # just... somewhere for i in range( self.numveh ) : taxi = Taxi() taxi.setPlanner( planner ) randpoint = roadprob.sampleaddress( self.roadnet, 'length' ) taxi.setLocation( randpoint ) taxi.setSpeed( 1. ) taxi.join_sim( sim ) gateIF = gate.newInterface() gate.add( gateIF ) vehicles[taxi] = gateIF gateIF.output.connect( taxi.appendDemands ) taxi.signalWakeup.connect( gateIF.input ) taxi.signalIdle.connect( gateIF.input ) gate.join_sim( sim ) # record number of unassigned demands self.tape = [] def record_unassigned() : # first, count the demands waiting in the gate unassg = len( self.gate._demandQ ) #+ len( self.dispatch.demands ) # then, count the demands in vehicle queues (minus possibly 1 being worked on) for veh in self.vehicles : temp = len( veh._demandQ ) temp = max( temp, 1 ) - 1 unassg += temp # recorder the number self.tape.append( unassg ) recorder = UniformClock( 1. ) recorder.join_sim( sim ) recorder.output.connect( record_unassigned ) self.recorder = recorder # report demand arrivals to several places self.DEMANDS = [] def record_arrival( dem ) : self.DEMANDS.append( dem ) def give_to_dispatch( dem ) : #p, q = dem taxidem = Taxi.Demand( *dem ) self.gate.queueDemand( taxidem ) source_out = source.source() #source_out.connect( counting.increment ) source_out.connect( record_arrival ) source_out.connect( give_to_dispatch ) #source.source().connect( give_to_dispatch ) self.timer = data() self.timer.last_time = sim.time def say( dem ) : p, q = dem new_time = self.sim.time elapsed = new_time - self.timer.last_time print 'tick, %f: %s, %s' % ( elapsed, repr(p), repr(q) ) self.timer.last_time = new_time source_out.connect( say ) def gimme( *args, **kwargs ) : print "need a batch!!" # creates an interface from gate to interactive dispatcher #gate_if = gate.spawn_interface() #self.gate_if = gate_if #dispatch.request_batch.connect( gate.requestRelease ) #dispatch.request_batch.connect( gimme ) #gate.output.connect( dispatch.batch_arrived ) #gate_if.batch_out.connect( dispatch.batch_arrived ) def hello( *args, **kwargs ) : print 'vehicle is ready!'
def sim_init( self ) : """ simulation setup """ # construct the simulation blocks sim = Simulation() self.sim = sim if False : script = sample_demands( self.horizon, self.rategraph, self.roadnet ) source = ScriptSource( script ) print 'obtained %d demands' % len( source.script ) debug_input() else : source = RoadnetDemandSource( self.roadnet, self.rategraph ) self.source = source source.join_sim( sim ) gate = GatedQueue() # because nearest neighbor "cheats" if the arrival rate is too high self.gate = gate gate.join_sim( sim ) dispatch = BatchNNeighDispatcher() self.dispatch = dispatch dispatch.set_environment( roadnet ) dispatch.join_sim( sim ) """ add some demands to jump-start the simulation """ preload = 0 distr = {} for road1, road2, rate_data in normrategraph.edges_iter( data=True ) : distr[(road1,road2)] = rate_data.get( 'rate', 0. ) bonus_demands = [ roadprob.samplepair( roadnet, distr ) for i in range(preload) ] for p, q in bonus_demands : gate.demand_arrived( (p,q) ) """ end cheats """ vehicles = {} self.vehicles = vehicles for k in range( self.numveh ) : veh = Vehicle() ; vehicles[ veh ] = None veh.set_environment( self.distance ) veh.set_speed( self.vehspeed ) randpoint = roadprob.sampleaddress( roadnet, 'length' ) veh.set_location( randpoint ) veh.join_sim( sim ) # record number of unassigned demands self.tape = [] def record_unassigned() : unassg = len( self.gate._queue ) + len( self.dispatch.demands ) self.tape.append( unassg ) recorder = UniformClock( 1. ) recorder.join_sim( sim ) recorder.output.connect( record_unassigned ) self.recorder = recorder # report demand arrivals to several places self.DEMANDS = [] def record_arrival( dem ) : self.DEMANDS.append( dem ) def give_to_dispatch( dem ) : p, q = dem loc = p #dispatch.demand_arrived( dem, loc ) self.gate.arrival( dem ) source_out = source.source() #source_out.connect( counting.increment ) source_out.connect( give_to_dispatch ) source_out.connect( record_arrival ) #source.source().connect( give_to_dispatch ) self.timer = data() self.timer.last_time = sim.time def say( dem ) : p, q = dem new_time = self.sim.time elapsed = new_time - self.timer.last_time print 'tick, %f: %s, %s' % ( elapsed, repr(p), repr(q) ) self.timer.last_time = new_time source_out.connect( say ) def gimme( *args, **kwargs ) : print "need a batch!!" # creates an interface from gate to interactive dispatcher #gate_if = gate.spawn_interface() #self.gate_if = gate_if dispatch.request_batch.connect( gate.requestRelease ) dispatch.request_batch.connect( gimme ) gate.output.connect( dispatch.batch_arrived ) #gate_if.batch_out.connect( dispatch.batch_arrived ) def hello( *args, **kwargs ) : print 'vehicle is ready!' # vehicle signal connections for veh in vehicles : vehconn = dispatch.spawn_interface() ; vehicles[veh] = vehconn veh.ready.connect( vehconn.request_in ) veh.ready.connect( hello ) #veh.ready.connect( vehconn.request_in ) vehconn.demand_out.connect( veh.receive_demand )