人工智能 水壶问题 python解法


系列文章

  • 人工智能 倒啤酒问题 python解法
  • 人工智能 水壶问题 python解法
  • A*算法之八数码问题 python解法
  • A*算法之野人传教士问题 python解法
  • 人工智能 遗传算法 计算函数极值问题

文章目录

  • 人工智能 水壶问题 python解法
    • 问题描述
    • 宽度优先搜索
    • 状态空间
    • 操作类型
    • 思路
    • 代码

补充发两篇文章记录一下之前用到的宽度优先算法

问题描述

给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水。


问题不难理解,就是倒水,倒来倒去然后一个杯子里只剩2升水了

宽度优先搜索

  1. 把起始点放入queue;
  2. 重复下述2步骤,直到queue为空为止:
    1 . 从queue中取出队列头的点;
    2 . 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入queue中。

可以看看这篇文章,类似关于算法的介绍网上很多





状态空间

(x,y)

  • x代表3升水壶当前的水量,范围(0,1,2,3)
  • y代表4升水壶当前的水量,范围(0,1,2,3,4)。
  • 初值(0,0),目标值(2,?)或者(?,2)

操作类型

本道题的操作也不难,倒来倒去也就这么几种

  1. 装满4升水壶
  2. 装满3升水壶
  3. 清空4升水壶
  4. 清空3升水壶
  5. 3升水壶往4升到 (4升倒满或3升清空)
  6. 4升水壶往3升到 (3升倒满或4升清空)

思路

将各个属性放到一个类中,初始化状态空间,置为全0,仅仅(0,0)点为1,作为是否访问过的依据,再初始化一个队列来存放需要访问的节点,在类中编写操作相关的6个函数,接着使用宽度优先搜索算法进行循环,为了能够获取出正确并且多组路径,在每个节点的内容中添加了其父节点的信息。最后根据这些信息还原出所有的有效路径,这里稍微做出的改进是当遇到目标值后就不再对当前节点继续深入。

代码

# -*- coding: utf-8 -*-
# @Time    : 2020/10/15 19:12
# @Author  : Tong Tianyu
# @File    : chapter1_1.py
import queue
import numpy as np# 定义水壶类对象
class Kettle:def __init__(self):self.x = 0  # 三升的水壶self.y = 0  # 四升的水壶self.state_space = np.zeros((4, 5))  # 定义状态空间self.q_tmp = queue.Queue()  # 定义队列self.final = []  # 定义结果self.final_only_data = [[0, 0]]  # 便于操作的结果def BFS(self):# con = 1self.q_tmp.put([0, 0])self.final.append([[0, 0], 'none', [0]])self.state_space[0][0] = 1while len(self.q_tmp.queue) != 0:a, b = self.q_tmp.get()if a == 2 or b == 2:continuepre = [a, b]# print('----------------', con, '------------------')self.x, self.y = a, bself.Pour_X()self.update(pre, a, b, 'Pour_X')self.Pour_Y()self.update(pre, a, b, 'Pour_Y')self.Empty_X()self.update(pre, a, b, 'Empty_X')self.Empty_Y()self.update(pre, a, b, 'Empty_Y')self.Pour_X_To_Y()self.update(pre, a, b, 'Pour_X_To_Y')self.Pour_Y_To_X()self.update(pre, a, b, 'Pour_Y_To_X')# con += 1return self.final, self.final_only_datadef update(self, pre, a, b, name):if self.state_space[self.x][self.y] == 0:self.state_space[self.x][self.y] = 1self.q_tmp.put([self.x, self.y])self.final_only_data.append([self.x, self.y])self.final.append([[self.x, self.y], name, pre])self.x, self.y = a, bdef Pour_X(self):'''倒满三升的水壶X'''self.x = 3return Truedef Pour_Y(self):'''倒满四升的水壶Y'''self.y = 4return Truedef Empty_X(self):'''清空三升的水壶X'''self.x = 0return Truedef Empty_Y(self):'''清空四升的水壶Y'''self.y = 0return Truedef Pour_X_To_Y(self):'''三升的水壶x倒入四升y中'''if (self.x + self.y) <= 4:  # 可以完全倒入四升水壶Y中self.y = self.x + self.yself.x = 0else:  # 倒满四升壶y之后还有余量self.x = self.x - (4 - self.y)self.y = 4return Truedef Pour_Y_To_X(self):'''四升水壶y倒入三升水壶x中'''if (self.x + self.y) <= 3:  # 可以完全倒入三升水壶x中self.x = self.x + self.yself.y = 0else:  # 倒满四升壶y之后还有余量self.y = self.y - (3 - self.x)self.x = 3return Trueif __name__ == '__main__':kettle = Kettle()final_list, tmp_list = kettle.BFS()result = []for i in range(len(final_list)):if i == 0:continuedata = final_list[i]print('每行的数据为:', data)pre = data[2]print('当前的父节点为:', pre)pre_index = tmp_list.index(pre)print('当前父节点在列表中的位置为:', pre_index)result = final_list[pre_index][-1]print('当前父节点的路径为:', result)# md这里被深浅复制搞死了a = result.copy()a.append(i)final_list[i][-1] = aprint('*********************************************')def output(order):print('x' + '\t' + 'y' + '\t' + 'method')for i in order:print(*final_list[i][0], sep='\t', end='\t')print(final_list[i][1])con = 0for i in range(len(tmp_list)):if 2 in tmp_list[i]:print(f'-------------方法{con}--------------')order = final_list[i][-1]output(order)con += 1

人工智能 水壶问题 python解法相关推荐

  1. 华为机试python编程题_牛客网华为机试题之Python解法

    牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...

  2. 为何人工智能首推Python 初学者怎么学Python

    为何人工智能首推Python?初学者怎么学Python?我们知道,近两年人工智能发展的速度呈指数型增长,各行各业都在自己的产品上面加个AI.人工智能时代即将来临,人工智能是大势所趋.越来越多的人意识到 ...

  3. LeetCode 111. Minimum Depth of Binary Tree--Java, Python解法--二叉树最小高度--迭代,递归

    题目地址:Minimum Depth of Binary Tree - LeetCode Given a binary tree, find its minimum depth. The minimu ...

  4. LeetCode 226. Invert Binary Tree--反转二叉树--C++,Python解法--递归,迭代做法

    题目地址:Invert Binary Tree - LeetCode Invert a binary tree. Example: Input: 4/ \2 7/ \ / \ 1 3 6 9 Outp ...

  5. LeetCode 204. Count Primes--从一开始的质数个数--Python解法--面试算法题

    题目地址:Count Primes - LeetCode Count the number of prime numbers less than a non-negative number, n. E ...

  6. LeetCode 458. Poor Pigs--智力题「小白鼠试毒」--C++,Python解法

    题目地址:Poor Pigs - LeetCode There are 1000 buckets, one and only one of them is poisonous, while the r ...

  7. LeetCode 230. Kth Smallest Element in a BST--C++,Python解法--面试真题--找二叉树中第K小的元素

    题目地址:Kth Smallest Element in a BST - LeetCode Given a binary search tree, write a function kthSmalle ...

  8. LeetCode 221. Maximal Square----动态规划--谷歌面试算法题--Python解法

    题目地址:Maximal Square - LeetCode Given a 2D binary matrix filled with 0's and 1's, find the largest sq ...

  9. LeetCode 148. Sort List--面试算法题--C++,Python解法

    LeetCode 148. Sort List–面试算法题–C++,Python解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大 ...

最新文章

  1. php json java_php 解析java传过来的json数据
  2. java相同数组拼接_java遍历数组并重新拼接数组里的元素
  3. 5g应用场景_5G新媒体场景应用解决方案(ppt)
  4. linux链接 .o,Linux 链接概念 - osc_8ieji7o1的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. Qt文档阅读笔记-QGraphicsItem events解析与实例
  6. 为什么别的手机都能接收wifi,而红米手机却收不到?
  7. 刚在乌镇夺魁的飞桨,又将在“WAVE SUMMIT+”深度学习开发者峰会带来哪些惊喜?...
  8. ORB-SLAM2 ROS运行
  9.  paip.android环境搭建与开发事例
  10. 2017 十款最佳iPhone渗透APP及工具
  11. 微信公众号H5支付的两种方式
  12. Linux常用基本命令详解(三)
  13. android自动照相机2.0,Nano Camera
  14. H3C S5720交换机系统文件丢失一直重启的解决办法
  15. 刘涛入职阿里,年薪超过欧阳娜娜!揭秘阿里巴巴的明星员工和职级薪资!
  16. java模拟KTV点歌系统
  17. 系统设定工具与硬件侦测
  18. 基于jsp+java+ssm的农产品购物商城系统-计算机毕业设计
  19. LaTeX 第一页不显示页码
  20. java打地鼠游戏教案,幼儿园打地鼠游戏教案

热门文章

  1. 仿QQ分组列表(UITableView)
  2. 手把手教你读财报---银行业---第七课
  3. mysql144错误_MySQL 144错误
  4. ssm招投标管理系统毕业设计(附源码、运行环境)
  5. 2020年12月国产数据库排行榜:榜首TiDB 2.7亿融资再破纪录;openGauss晋级十强!
  6. Python 网络自动化: 使用 Netmiko 模块批量下发华为、思科交换机配置
  7. 电子信息工程专业就业形势分析
  8. openfire好友关系解析
  9. 前端学习笔记-4.2php实现注册功能
  10. MacOS 查看硬盘分区参数