胡慧华
菜单
首页人工智能机器学习深度学习项目实践关于我
跳至课程正文
← 人工智能课程

ARTIFICIAL INTELLIGENCE · COURSE 04

规划:让行动满足目标与约束

理解前置条件、行动顺序和资源限制如何影响计划。

第 04 / 18 课20–30 分钟(含实验)无需密钥 · 本地实验
透明迷宫中的青色路径连接起点与终点,呈现搜索和路径规划
让机器寻找答案与行动
  • 行动顺序
  • 约束条件
01

START WITH A QUESTION

配送不只是找到最近的路

配送员需要先取到包裹,才能把包裹送给客户;收到签收信息后,才能关闭订单。即使道路畅通,行动顺序错了,任务仍然无法完成。规划关注的正是“哪些行动在当前条件下可做,做完之后会怎样”。

我们把配送缩成四个步骤:取件、检查地址、送达、签收。取件与检查地址可以先后互换,但送达必须等两者都完成。这比背诵固定流程更灵活,也更能解释为什么某一步暂时不能执行。

02

BUILD YOUR VOCABULARY

先把三个概念讲清楚

CONCEPT 01

前置条件

行动开始前必须成立的事实。条件不满足时,不能只因为用户催促就假定它已经成立。

放进场景看

送达要求已经取件并确认地址。

CONCEPT 02

行动效果

行动完成后新增或移除的事实。效果改变当前状态,让后续行动变得可执行。

放进场景看

取件后,状态新增“持有包裹”。

CONCEPT 03

目标与约束

目标描述最终希望成立的事实;约束限制哪些计划可接受。可行计划不一定是耗时最少的计划。

放进场景看

目标是已签收;现实中还可能有时间窗与载重约束。

03

FOLLOW THE PROCESS

把原理放进完整流程

  1. 01

    写出初始状态

    明确包裹、地址与订单目前分别处于什么状态。

  2. 02

    列出行动模型

    为每个行动写前置条件和完成后的效果。

  3. 03

    选择合法行动

    仅在条件满足时推进,执行后更新状态。

  4. 04

    验证目标

    检查最终状态是否达到目标,同时保留失败与重试分支。

行动依赖表
行动前置条件完成后
取件尚未取件已取件
确认地址地址可查地址已确认
送达已取件且地址已确认已送达
签收已送达已签收
04

CHANGE ONE THING & OBSERVE

亲手安排一次配送

选择下一步行动。条件未满足的按钮保持可查看,但会解释不能执行的原因;完成签收即达成目标。

INTERACTIVE LAB / 04
目标:完成签收

尝试选一个行动。你也可以先点送达,查看缺少什么条件。

行动记录:尚未行动

05

KNOW THE LIMITS

哪些结论不能直接推出?

计划完成不等于现实完成

模拟器里点击取件直接更新状态,现实系统需要可靠的回执才能确认效果。

只追求最优,忘记可行

优化路线前,先确保依赖、资源与权限成立。看似更快但无法执行的计划没有意义。

06

READ, RUN & EXPLAIN

检查一个配送顺序是否合法

以下示例仅使用 Python 3 标准库,可复制到本地 Python 环境运行。先看每一行的作用,再修改一个输入观察结果;无需网络或密钥。

Python 3 · 完整示例下载 .py
needs = {'取件': set(), '确认地址': set(), '送达': {'取件', '确认地址'}, '签收': {'送达'}}
done = set()
plan = ['取件', '确认地址', '送达', '签收']
for action in plan:
    if not needs[action].issubset(done):
        print('条件不足:' + action); break
    done.add(action)
print('目标达成:', '签收' in done)

复制或下载只获取本课示例,不会自动执行。

逐行解释(8 行)
  1. 第 1 行needs = {'取件': set(), '确认地址': set(), '送达': {'取件', '确认地址'}, '签收': {'送达'}}

    每个行动对应一组前置行动;set() 是空集合,表示无前置行动。

  2. 第 2 行done = set()

    记录已完成行动,最初为空。

  3. 第 3 行plan = ['取件', '确认地址', '送达', '签收']

    给出准备验证的顺序,也可以故意把送达放到开头。

  4. 第 4 行for action in plan:

    逐个验证行动。

  5. 第 5 行 if not needs[action].issubset(done):

    issubset 判断所有前置行动是否都已完成。

  6. 第 6 行 print('条件不足:' + action); break

    发现不合法行动时停止,不伪造完成状态。

  7. 第 7 行 done.add(action)

    条件满足后记入已完成集合。

  8. 第 8 行print('目标达成:', '签收' in done)

    检查最终状态是否含签收。True 表示达成,False 表示未达成。

预期输出
目标达成: True
07

CHECK YOUR UNDERSTANDING

换一个角度,检查自己是否理解

已回答 0 / 3 题 · 当前答对 0 题

1. 送达行动的前置条件应该在哪里检查?
2. 取件与确认地址可以交换,说明什么?
3. 接口超时后能直接标记已签收吗?
08

TAKE IT WITH YOU

带走三个判断,再做一次迁移练习

  • 行动由前置条件和效果定义。
  • 先找可行计划,再比较时间与资源代价。
  • 执行时要重新确认状态,并处理失败。
参考与延伸阅读

本课例子、代码和模拟数据为教学设计。以下一手文档用于延伸核对,不代表对本示例的认证。