4.1 规则系统简介:IF–THEN 格式
-
基本思路
规则系统由一组“如果 IF …,那么 THEN …”规则组成,智能体不断地:- 感知环境(获取输入数据)
- 规则匹配(检查哪些 IF 条件为真)
- 动作执行(对满足条件的规则执行对应的 THEN 操作)
-
规则结构
IF <条件表达式> THEN <动作或结论>
- 条件表达式:可包含多种感知变量,例如传感器读数、用户输入、环境状态等
- 动作:可以是输出一条信息、调用一个函数、改变环境或更新内部状态
-
规则引擎简易伪码
rules = [ (condition1, action1), (condition2, action2), … ] while True: percept = sense_environment() for cond, act in rules: if cond(percept): # 条件匹配 act(percept) # 执行动作 break # 如果只想触发第一个匹配,可 break
-
冲突解决
- 优先级:为规则分配优先级,先执行高优先级规则
- 随机选择:从所有匹配规则中随机选一个执行
- 最特殊化:选择条件最具体的规则
4.2 示例
示例 1:简单 FAQ 聊天机器人
# 规则库:关键词 → 回复
rules = {
"你好": "你好!有什么可以帮您?",
"价格": "我们的产品价格在 100–500 元之间,具体视型号而定。",
"折扣": "本月折扣高达 20%,详情请咨询客服。",
}
def faq_bot(user_input: str):
for keyword, reply in rules.items():
if keyword in user_input:
return reply
return "抱歉,我没听懂,请换个说法。"
# 运行示例
print(faq_bot("请问价格是多少?")) # → 我们的产品价格在 100–500 元之间...
print(faq_bot("折扣力度?")) # → 本月折扣高达 20%...
思考:这种实现简单易懂,但只能基于“关键词包含”做匹配,无法处理更复杂的语言。
示例 2:智能温控器
# 设定阈值
TEMP_LOW = 18 # 摄氏度
TEMP_HIGH = 26
def thermostat_agent(temp: float):
if temp < TEMP_LOW:
return "启动暖气" # THEN
elif temp > TEMP_HIGH:
return "启动空调制冷"
else:
return "温度适宜,保持当前状态"
# 模拟不同温度读数
for t in [16.5, 22.0, 28.3]:
print(f"当前温度 {t}℃ → {thermostat_agent(t)}")
延伸:加入“湿度”或“空气质量”规则,让代理更加智能。
示例 3:避障小车(二维网格)
import random
# 网格:0 可通行,1 障碍
grid = [
[0,0,0,1],
[0,1,0,0],
[0,0,0,0],
]
pos = [0, 0] # 起点 (row, col)
directions = [(0,1),(1,0),(0,-1),(-1,0)] # 右、下、左、上
def sense_obstacle(pos, dir):
r, c = pos
dr, dc = dir
nr, nc = r+dr, c+dc
if 0 <= nr < len(grid) and 0 <= nc < len(grid[0]):
return grid[nr][nc] == 1
return True # 出界也当做障碍
rules = [
# 优先尝试向“右”走,否则向“下”,否则随机
(lambda p: not sense_obstacle(p, directions[0]), lambda p: (p[0], p[1]+1)),
(lambda p: not sense_obstacle(p, directions[1]), lambda p: (p[0]+1, p[1])),
(lambda p: True, lambda p: random.choice(directions)(p)),
]
# 简易执行一轮
for step in range(5):
for cond, act in rules:
if cond(pos):
pos = act(pos)
break
print("移动到", pos)
思考:如何给规则加优先级?如何避免陷入死循环?
4.3 练习
-
扩展 FAQ 机器人
- 将规则库改为列表形式,支持多关键词匹配:
rules = [ (["你好","嗨"], "你好!"), (["价格","多少钱"], "产品价格在..."), … ]
- 实现:当用户输入包含任一关键词列表时,触发该回复。
- 将规则库改为列表形式,支持多关键词匹配:
-
多条件温控器
- 在“温度”之外加入“湿度”判断:
- 湿度 > 70% → “启动除湿模式”
- 温度 < 18 且湿度 > 60 → “同时启动暖气和除湿”
- 练习:设计不少于 5 条规则并用代码实现。
- 在“温度”之外加入“湿度”判断:
-
规则加载与热更新
- 将规则库写入一个 JSON 文件,格式例如:
[ {"if": "temp < 18", "then": "启动暖气"}, {"if": "humid > 70", "then": "启动除湿"}, … ]
- 实现:程序启动时加载规则;运行中检测到文件变更后自动重载并生效。
- 将规则库写入一个 JSON 文件,格式例如:
-
避障小车改进
- 为小车增加“回溯”能力:若前后左右均有障碍,则往回走;
- 实现一个“访问记录”列表,避免重复走同一格子。
- 统计完成 20 步后访问过多少不同格子。
-
自行设计小项目
- 选择一个生活场景(如智能灯光、浇花系统、消息通知等),用至少 6 条 IF–THEN 规则实现一个小型智能体。
- 编写 README,说明每条规则的含义与优先级策略,并演示运行效果。
以上内容既有原理解析,又通过多个示例让你快速上手;练习部分难度可自行调整,边动手边思考规则引擎的扩展与优化。祝学习愉快!