6.1 项目目标

  • 实现功能:智能体通过询问“我猜 X,请回复‘大’/‘小’/‘对’”的方式,最终猜出用户心中所想的数字。
  • 用户体验:智能体自动调整猜测范围、记录猜测次数,并在猜对时给出祝贺。
  • 核心思路:将用户的“大”“小”反馈转化为上下界调整,直到收敛到唯一解。

6.2 设计思路:二分法

  1. 初始范围
    • low = 最小值high = 最大值,如 1100
  2. 每轮猜测
    • guess = (low + high) // 2
    • 向用户输出 “我猜 {guess},请回复‘大’/‘小’/‘对’:”
  3. 根据反馈更新范围
    • 若用户回复“大” → 说明实际数字 > guesslow = guess + 1
    • 若用户回复“小” → 实际数字 < guesshigh = guess - 1
    • 若用户回复“对” → 猜测成功,结束循环
  4. 循环终止条件
    • low > high 时,说明反馈中存在矛盾,需要额外处理(见 6.4)。
示例演示

假设用户心中数字是 73,范围 [1,100]

轮次lowhighguess用户反馈下一步
1110050low = 51
25110075high = 74
3517462low = 63
4637468low = 69
5697471low = 72
6727473成功,6 次猜中!

6.3 代码示例

6.3.1 交互版(控制台)
def guess_number_agent(low=1, high=100):
    """控制台交互版猜数字智能体"""
    attempts = 0
    while low <= high:
        guess = (low + high) // 2
        attempts += 1
        feedback = input(f"我猜 {guess},请回复“大/小/对”:").strip()
        if feedback == "大":
            low = guess + 1
        elif feedback == "小":
            high = guess - 1
        elif feedback == "对":
            print(f"太棒了!我用了 {attempts} 次就猜对了。")
            return
        else:
            print("输入无效,请只回复“大”、“小”或“对”。")
    print("看来你的反馈有冲突,无法继续猜测。")

if __name__ == "__main__":
    print("请在脑中想一个 1–100 之间的数字,我来猜!")
    guess_number_agent(1, 100)
6.3.2 自动模拟版(无需人工反馈)
import random

def simulate_agent(secret, low=1, high=100):
    """自动模拟:智能体猜随机 secret,返回猜测次数"""
    attempts = 0
    while low <= high:
        guess = (low + high) // 2
        attempts += 1
        if guess < secret:
            low = guess + 1
        elif guess > secret:
            high = guess - 1
        else:
            return attempts
    return None

# 多次模拟,统计平均猜测次数
trials = 1000
results = [simulate_agent(random.randint(1, 100)) for _ in range(trials)]
avg = sum(results) / len(results)
print(f"在 1–100 范围内,平均 {avg:.2f} 次猜对。")

6.4 练习:让智能体能自我纠正

  1. 反馈矛盾检测

    • 思路:记录每次 low/high 变动;如果更新后 low > high,提示用户“你的大/小 反馈似乎有误,请检查是否有输入错误”,并允许重置最后一次反馈。
    • 上手实践:在交互版中,增加一个历史记录栈,出问题时弹出并重试。
  2. 日志与回顾功能

    • 思路:每次猜测后,将 (guess, feedback, new_low, new_high) 存入列表,猜对后打印完整日志,帮助分析猜测过程。
    • 上手实践:修改 guess_number_agent,在结束时输出:
      第1次:猜50 → “大” → 范围变为[51,100]
      第2次:猜75 → “小” → 范围变为[51,74]
      ……
      
  3. 动态范围与自定义

    • 思路:让用户在开始时自定义最小/最大值,例如 输入起始范围(格式 low high):
    • 上手实践:读取用户输入,解析为整数,并传给函数。
  4. 批量性能测试

    • 思路:模拟 1–N 范围中所有可能的 secret,记录最大最小与平均猜测次数,分析复杂度。
    • 上手实践
      def profile_agent(max_value):
          stats = [simulate_agent(s, 1, max_value) for s in range(1, max_value+1)]
          print("最大尝试次数:", max(stats))
          print("最小尝试次数:", min(stats))
          print("平均尝试次数:", sum(stats)/len(stats))
      profile_agent(100)
      
  5. 进阶扩展

    • 增加“提示次数”限制,超出后自动放弃;
    • 改用随机猜测或三分法,比对效率;
    • 尝试用简单的 GUI(如 Tkinter)实现按钮交互版本。

通过以上示例、变体代码和练习,你可以从跟着输入–输出流程,到自动化模拟、再到增加鲁棒性与性能分析,全面掌握这个“小项目”的设计与实现。祝你练习愉快!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐