人工智能 水壶问题 python解法
人工智能 水壶问题 python解法
系列文章
- 人工智能 倒啤酒问题 python解法
- 人工智能 水壶问题 python解法
- A*算法之八数码问题 python解法
- A*算法之野人传教士问题 python解法
- 人工智能 遗传算法 计算函数极值问题
文章目录
- 人工智能 水壶问题 python解法
- 问题描述
- 宽度优先搜索
- 状态空间
- 操作类型
- 思路
- 代码
补充发两篇文章记录一下之前用到的宽度优先算法
问题描述
给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水。
问题不难理解,就是倒水,倒来倒去然后一个杯子里只剩2升水了
宽度优先搜索
- 把起始点放入queue;
- 重复下述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)
操作类型
本道题的操作也不难,倒来倒去也就这么几种
- 装满4升水壶
- 装满3升水壶
- 清空4升水壶
- 清空3升水壶
- 3升水壶往4升到 (4升倒满或3升清空)
- 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解法相关推荐
- 华为机试python编程题_牛客网华为机试题之Python解法
牛客网华为机试题之Python解法 第1题 字符串最后一个单词的长度 a = input().split(" ") print(len(a[-1])) 第2题 计算字符个数 a = ...
- 为何人工智能首推Python 初学者怎么学Python
为何人工智能首推Python?初学者怎么学Python?我们知道,近两年人工智能发展的速度呈指数型增长,各行各业都在自己的产品上面加个AI.人工智能时代即将来临,人工智能是大势所趋.越来越多的人意识到 ...
- 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 ...
- 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 ...
- LeetCode 204. Count Primes--从一开始的质数个数--Python解法--面试算法题
题目地址:Count Primes - LeetCode Count the number of prime numbers less than a non-negative number, n. E ...
- LeetCode 458. Poor Pigs--智力题「小白鼠试毒」--C++,Python解法
题目地址:Poor Pigs - LeetCode There are 1000 buckets, one and only one of them is poisonous, while the r ...
- 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 ...
- LeetCode 221. Maximal Square----动态规划--谷歌面试算法题--Python解法
题目地址:Maximal Square - LeetCode Given a 2D binary matrix filled with 0's and 1's, find the largest sq ...
- LeetCode 148. Sort List--面试算法题--C++,Python解法
LeetCode 148. Sort List–面试算法题–C++,Python解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大 ...
最新文章
- php json java_php 解析java传过来的json数据
- java相同数组拼接_java遍历数组并重新拼接数组里的元素
- 5g应用场景_5G新媒体场景应用解决方案(ppt)
- linux链接 .o,Linux 链接概念 - osc_8ieji7o1的个人空间 - OSCHINA - 中文开源技术交流社区...
- Qt文档阅读笔记-QGraphicsItem events解析与实例
- 为什么别的手机都能接收wifi,而红米手机却收不到?
- 刚在乌镇夺魁的飞桨,又将在“WAVE SUMMIT+”深度学习开发者峰会带来哪些惊喜?...
- ORB-SLAM2 ROS运行
- paip.android环境搭建与开发事例
- 2017 十款最佳iPhone渗透APP及工具
- 微信公众号H5支付的两种方式
- Linux常用基本命令详解(三)
- android自动照相机2.0,Nano Camera
- H3C S5720交换机系统文件丢失一直重启的解决办法
- 刘涛入职阿里,年薪超过欧阳娜娜!揭秘阿里巴巴的明星员工和职级薪资!
- java模拟KTV点歌系统
- 系统设定工具与硬件侦测
- 基于jsp+java+ssm的农产品购物商城系统-计算机毕业设计
- LaTeX 第一页不显示页码
- java打地鼠游戏教案,幼儿园打地鼠游戏教案