Ejemplo n.º 1
0
 def __init__(self) :
     """ state """
     self._demandQ = []
     self.vehiclePhase = self.IDLE
     self.currentDemand = None
     
     # statistics
     self.demandLog = []
     #self.odometer_full = 0.
     #self.odometer_empty = 0.
     
     """ sim interface """
     # messaging interface
     self.signalWakeup = Signal()
     self.signalAssigned = Signal()
     self.signalPickup = Signal()         # emited when a demand is picked up
     self.signalDeliver = Signal()        # emited when a demand is delivered
     self.signalIdle = Signal()
     
     # state variables
     self.vehicle = Vehicle()
     # vehicle signal connections
     self.vehicle.signalArrived.connect( self.vehicleArrived )
Ejemplo n.º 2
0
class Taxi :
    """ vehicular agent whose tasks are pickup-and-delivery tasks """
    IDLE = 0
    EMPTY = 1
    FULL = 2
    
    class Demand :
        def __init__(self, orig, dest, arrivalTime=None ) :
            # task spec
            self.origin = orig
            self.destination = dest
            
            # statistics
            self.arrived = arrivalTime
            self.embarked = None
            self.delivered = None
            
            
    def __init__(self) :
        """ state """
        self._demandQ = []
        self.vehiclePhase = self.IDLE
        self.currentDemand = None
        
        # statistics
        self.demandLog = []
        #self.odometer_full = 0.
        #self.odometer_empty = 0.
        
        """ sim interface """
        # messaging interface
        self.signalWakeup = Signal()
        self.signalAssigned = Signal()
        self.signalPickup = Signal()         # emited when a demand is picked up
        self.signalDeliver = Signal()        # emited when a demand is delivered
        self.signalIdle = Signal()
        
        # state variables
        self.vehicle = Vehicle()
        # vehicle signal connections
        self.vehicle.signalArrived.connect( self.vehicleArrived )
        
        
    """ programmer interface """
    # vehicle pass-thrus
    def setLocation(self, location ) : self.vehicle.setLocation(location)
    def location(self) : return self.vehicle.location()
    def setSpeed(self, speed ) : self.vehicle.setSpeed(speed)
    def setPlanner(self, planningFunction ) : self.vehicle.setPlanner(planningFunction)
    
    # demand queue
    def _addDemand(self, demand ) :
        if DEBUG :
            time = self.sim.get_time()
            args = ( repr(self), time, repr(demand.origin), repr(demand.destination) )
            #print '%s, got demand at %f: (%s, %s)' % args
            
        self._demandQ.append( demand )
        self.demandLog.append( demand )
        
        
        
    """ simulation interface """
    def join_sim(self, sim ) :
        self.sim = sim
        
        # wake-up call
        msg = Message( self.signalWakeup, self.location() )
        self.sim.schedule( msg )
        
        self.vehicle.join_sim( sim )
        
    # slotoid
    def _tryschedule(self) :
        # if there are demands waiting, claim one
        if len( self._demandQ ) > 0 :
            if self.currentDemand is None :
                dem = self._demandQ[0]
                self.vehicle.queueWaypoint( dem.origin )
                self.currentDemand = dem
                self.vehiclePhase = self.EMPTY
            else :
                # we're already working on the first demand
                pass
            
        # otherwise, try to idle the taxi
        else :
            if not self.vehiclePhase == self.IDLE :
                msg = Message( self.signalIdle, self.location() )
                self.sim.schedule( msg )
                self.vehiclePhase = self.IDLE
                
    # slotoid
    def _activate(self) :
        if self.vehiclePhase == self.IDLE :
            self.vehiclePhase = self.EMPTY      # target should already be None
        self._tryschedule()
        
    """ simulation messaging interface """
    # slot
    def queueDemand(self, demand ) :
        self._addDemand( demand )
        self._activate()
        
    # slot
    def appendDemands(self, seq ) :
        for dem in seq : self._addDemand( dem )
        self._activate()
        
    # auto-slot? --- switch
    def vehicleArrived(self) :
        if self.vehiclePhase == self.EMPTY :
            self.arrivedOrigin()
        elif self.vehiclePhase == self.FULL :
            self.arrivedDestination()
        else :
            raise 'vehicle should not be moving'
        
    # slot-oid
    def arrivedOrigin(self) :
        demand = self._demandQ[0]
        time = self.sim.get_time()
        demand.embarked = time
        
        self.signalPickup()      # send signal, does this need to be scheduled?
        
        self.vehicle.queueWaypoint( demand.destination )
        self.vehiclePhase = self.FULL
    
    # slot-oid
    def arrivedDestination(self) :
        demand = self._demandQ.pop(0)
        time = self.sim.get_time()
        demand.delivered = time
        
        self.signalDeliver()     # send signal, does this need to be scheduled?
        
        self.currentDemand = None
        self._tryschedule()