Python基于回溯法子集树模板解决野人与传教士问题示例


Posted in Python onSeptember 11, 2017

本文实例讲述了Python基于回溯法子集树模板解决野人与传教士问题。分享给大家供大家参考,具体如下:

问题

在河的左岸有N个传教士、N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制:

(1)修道士和野人都会划船,但船每次最多只能运M个人;
(2)在任何岸边以及船上,野人数目都不能超过修道士,否则修道士会被野人吃掉。

假定野人会服从任何一种过河安排,请规划出一个确保修道士安全过河的计划。

分析

百度一下,网上全是用左岸的传教士和野人人数以及船的位置这样一个三元组作为状态,进行考虑,千篇一律。

我换了一种考虑,只考虑船的状态。

船的状态:(x, y) x表示船上x个传教士,y表示船上y个野人,其中 |x|∈[0, m], |y|∈[0, m], 0<|x|+|y|<=m, x*y>=0, |x|>=|y|

船从左到右时,x,y取非负数。船从右到左时,x,y取非正数

解的编码:[(x0,y0), (x1,y1), ..., (xp,yp)] 其中x0+x1+...+xp=N, y0+y1+...+yp=N

解的长度不固定,但一定为奇数

开始时左岸(N, N), 右岸(0, 0)。最终时左岸(0, 0), 右岸(N, N)

由于船的合法状态是动态的、二维的。因此,使用一个函数get_states()来专门生成其状态空间,使得主程序更加清晰。

代码

n = 3 # n个传教士、n个野人
m = 2 # 船能载m人
x = [] # 一个解,就是船的一系列状态
X = [] # 一组解
is_found = False # 全局终止标志
# 计算船的合法状态空间(二维)
def get_states(k): # 船准备跑第k趟
  global n, m, x
  if k%2==0: # 从左到右,只考虑原左岸人数
    s1, s2 = n - sum(s[0] for s in x), n - sum(s[1] for s in x)
  else:    # 从右到左,只考虑原右岸人数(将船的历史状态累加可得!!!)
    s1, s2 = sum(s[0] for s in x), sum(s[1] for s in x)
  for i in range(s1 + 1):
    for j in range(s2 + 1):
      if 0 < i+j <= m and (i*j == 0 or i >= j):
        yield [(-i,-j), (i,j)][k%2==0]  # 生成船的合法状态
# 冲突检测
def conflict(k): # 船开始跑第k趟
  global n, m, x
  # 若船上载的人与上一趟一样(会陷入死循环!!!!)
  if k > 0 and x[-1][0] == -x[-2][0] and x[-1][1] == -x[-2][1]:
    return True
  # 任何时候,船上传教士人数少于野人,或者无人,或者超载(计算船的合法状态空间时已经考虑到了。)
  #if 0 < abs(x[-1][0]) < abs(x[-1][1]) or x[-1] == (0, 0) or abs(sum(x[-1])) > m:
  #  return True
  # 任何时候,左岸传教士人数少于野人
  if 0 < n - sum(s[0] for s in x) < n - sum(s[1] for s in x):
    return True
  # 任何时候,右岸传教士人数少于野人
  if 0 < sum(s[0] for s in x) < sum(s[1] for s in x):
    return True
  return False # 无冲突
# 回溯法
def backtrack(k): # 船准备跑第k趟
  global n, m, x, is_found
  if is_found: return # 终止所有递归
  if n - sum(s[0] for s in x) == 0 and n - sum(s[1] for s in x) == 0: # 左岸人数全为0
    print(x)
    is_found = True
  else:
    for state in get_states(k): # 遍历船的合法状态空间
      x.append(state)
      if not conflict(k):
        backtrack(k+1) # 深度优先
      x.pop()  # 回溯
# 测试
backtrack(0)

效果图

Python基于回溯法子集树模板解决野人与传教士问题示例

解的解释,从上往下看:

Python基于回溯法子集树模板解决野人与传教士问题示例

一个结论

貌似只有满足m = n-1,此问题才有解

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python生成词云的实现方法(推荐)
Jun 13 Python
老生常谈python之鸭子类和多态
Jun 13 Python
用Python实现KNN分类算法
Dec 22 Python
20个常用Python运维库和模块
Feb 12 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
详解python的argpare和click模块小结
Mar 31 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
Python Matplotlib绘制动画的代码详解
May 30 Python
python playwright之元素定位示例详解
Jul 23 Python
Python 高级专用类方法的实例详解
Sep 11 #Python
Python 异常处理的实例详解
Sep 11 #Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 #Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 #Python
详解 Python 与文件对象共事的实例
Sep 11 #Python
Python 私有函数的实例详解
Sep 11 #Python
Python模拟用户登录验证
Sep 11 #Python
You might like
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
php实现单链表的实例代码
2013/03/22 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
php 修改密码实现代码
2017/05/24 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python使用udp实现聊天器功能
2018/12/10 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
毕业生简单求职信
2013/11/19 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
食品安全责任书范本
2015/05/09 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
小学思品教学反思
2016/02/20 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
搭建Yolov5服务器
2022/04/30 Servers