React directly to current percepts using condition-action rules. No memory of past states or planning for future actions.
Architecture Flow:
Sensors → Condition-Action Rules → Actuators
if condition_met(percept):
execute_action(action)
-
Fast response time
-
Simple implementation
-
Predictable behavior
-
No learning capability
-
Cannot handle partial observability
class SimpleReflexAgent:
def __init__(self, rules):
self.rules = rules
def act(self, percept):
for condition, action in self.rules:
if condition(percept):
return action
return None
# Example: Thermostat
rules = [
(lambda p: p['temp'] > 75, 'turn_on_ac'),
(lambda p: p['temp'] < 65, 'turn_on_heat'),
(lambda p: True, 'maintain')
]
agent = SimpleReflexAgent(rules)
action = agent.act({'temp': 78}) # → 'turn_on_ac'
Maintain internal state and world model to handle partially observable environments and make better decisions.
Architecture Flow:
Sensors → State Update → World Model → Rules → Actuators
state = update_state(state, action, percept)
action = rule_match(state, rules)
-
Handles partial observability
-
Maintains context
-
Better decision making
-
More complex implementation
-
Still no planning
class ModelBasedReflexAgent:
def __init__(self, rules, transition_model):
self.rules = rules
self.state = {}
self.transition_model = transition_model
self.last_action = None
def update_state(self, percept):
# Update internal state based on percept and last action
self.state = self.transition_model(
self.state, self.last_action, percept
)
def act(self, percept):
self.update_state(percept)
for condition, action in self.rules:
if condition(self.state):
self.last_action = action
return action
return None
# Example: Smart home system
def transition_model(state, action, percept):
return {
'room_occupied': percept.get('motion_detected', False),
'light_on': state.get('light_on', False),
'time_of_day': percept.get('time'),
'last_motion': percept.get('timestamp') if percept.get('motion_detected') else state.get('last_motion')
}