主仆渡河问题

  • 只有一艘船,三个商人三个仆人过河,每一次船仅且能坐1~2个人,而且任何一边河岸上仆人比商人多的时候,仆人会杀人越货。
#允许状态集合,例num=3
#S={(x,y)|x=0,y=0,1,2,3;x=3,y=0,1,2,3;x=y=1,2} x是此岸的商人数,y是此岸的仆人数
#允许决策集合,例 boat_limit=2
#D={(u,v)|1<=u+v<=2,u,v=0,1,2} u是撘载的商人数,v是搭载的仆人数# 设置决策状态集合变量,允许决策集合限制变量
num=3
boat_limit=2
temp=[]
for i in range(0,num+1):if i==0 or i==num:for j in range(0,num+1):temp.append((i,j))else:temp.append((i,i))
S=set(temp)  # 产生初始状态集合D=[]  # 产生初始决策集合
for u in range(0,boat_limit+1):for v in range(0,boat_limit+1):if u+v>=1 and u+v<=boat_limit :D.append((u,v))
start=(num,num)
end=(0,0)
queue=[]
queue.append((0,start)) #前面的元素如果是0,说明是船在此岸,是1,说明船在对岸
step_dict={}
flag=0
finish=[]
while len(queue)!=0:q_pop=queue.pop(0)if q_pop[0]==0:for x in D: # 遍历每一种撘载方式temp_s=(q_pop[1][0]-x[0],q_pop[1][1]-x[1]) # 此岸的人数if temp_s not in S:  # 如果人数不符合状态集合,就跳过continueif (1,temp_s) in step_dict: # 如果结果状态在之前步骤的初始状态,则跳过,因为会产生重复continuequeue.append((1,temp_s)) # 保存当前此岸的状态step_dict[(1,temp_s)]=q_pop # 结果状态 :初始状态 以此岸作为参考if temp_s==end:flag=1finish=(1,temp_s)breakelse:for x in D:temp_s=(q_pop[1][0]+x[0],q_pop[1][1]+x[1])if temp_s not in S: continueif (0,temp_s) in step_dict:continuequeue.append((0,temp_s))step_dict[(0,temp_s)]=q_pop # 结果状态 :初始状态 以此岸作为参考if flag==1:break
if flag==1:print('该问题有解!最短路径:')path=[]path.append(finish)while path[-1]!=(0,start):path.append(step_dict[path[-1]])path.reverse()real_path=list(map(str,path))for i in range(len(real_path)):if i!=len(real_path)-1:print(real_path[i] + '->')else:print(real_path[i])
else:print('该问题无解')

主仆渡河问题 ----python相关推荐

  1. AI A_star算法野人渡河-实验报告

    1. 问题描述及实验要求 请用A*算法实现野人过河问题,(1)分析设计估价函数f(2)采用C语言或Python编程实现(代码中适当加注释,输出具有可读性).        问题描述:设有m个传教士和n ...

  2. AI传教士和野人渡河问题-实验报告

    一 题目要求: 设有m个传教士和n个野人来到河边,打算乘一只船从左岸渡到右岸去,该船每次最多载3人.在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉.他们怎样才能用这条船安全地把所有人 ...

  3. C语言版,传教士与野人渡河问题,使用深度优先搜索法求解(DFS),变态版,随便输入人数和船的最大载人数,人工智能经典题目,简单易懂,注释到位,没有bug

    目录 一.问题描述 二.迟来的代码 运行截图 三.简单分析 一.问题描述 有n个传教士和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯传教士,要求无论在何处,传教士的人数不得少于野人 ...

  4. DFS实现传教士野人渡河问题

    请将下面这个例子设计成一个状态搜索系统,(1)分析采用宽度优先和深度优先方法分别进行搜索,写出搜索的过程及搜索路径(可以画图来分析)(2)采用C语言或Python编程实现(代码中适当加注释,输出具有可 ...

  5. 人工智能导论实验二 食人族传教士过河+黑白棋 prolog+Python

    实验目的及要求: 本项目要求能够理解人工智能的基本原理,理解状态空间的概念.原理和方法,掌握用状态空间表示问题的步骤,掌握搜索方法的基本原理,并能够实际问题给出具体的实现. 实验内容: 状态.状态空间 ...

  6. python 城市代号数据的保存及读取

    城市代号及保存 前言 一.城市及代号 二.保存数据(2种方法) 1.直接保存 2.使用python进行保存 三.数据的读取 总结 前言 在某些情况下我们需要获取些票务信息,但是城市信息中有英文代号,在 ...

  7. python怎么解题_农夫过河问题 Python实现解题

    1 题目 一农夫带着一头狼,一只羊和一担草过河,小船只能一次装载农夫和一样货物,狼会吃羊,羊会吃草,只有农夫在时才安全.现欲让所有物品包括农夫都安全过道河对岸,使用程序实现求解. 2 设计分析 把农夫 ...

  8. 三牛三虎过河问题--图的最短路径dijkstra算法--简单的Python实现

    问题:三头牛三只虎要过河,船需要一只动物来划,另外至多还能载一物,而只有一头牛和一只虎会划船,并且当虎的数量多于牛的数量时,虎要吃牛,请设计一个安全渡河方案,并使渡河次数尽量少. 我们用一个数组来表示 ...

  9. Python之路第一课Day2--随堂笔记

    入门知识拾遗 一.bytes类型 bytes转二进制然后转回来 msg="张杨" print(msg) print(msg.encode("utf-8"))pr ...

  10. 修道士野人问题的python求解

    修道士野人问题的python求解 问题描述 状态空间表示 程序设计 执行结果 源代码(Python3.5) github项目文件下载点这里~ 问题描述 修道士(Missionaries)和野人(Can ...

最新文章

  1. 浅谈ASP.NET的内部机制(一)
  2. xml信息管理系统_WPF信息管理系统项目实战教程二:使用XAML实现页面布局
  3. [Rainy开发笔记]使用RandomAccessFile实现的Tail
  4. OpenStack AMQP与kombu
  5. 新手第一课-什么是深度学习
  6. java mail发送邮件(单发和群发)
  7. Python3.6学习笔记(五)
  8. 机器学习性能评估指标(综合性总结)
  9. 《构建之法》读后感 二
  10. AngularJS中页面传参方法
  11. 使用回调技术实现局部刷新
  12. vue-cropper 自定义旋转任意角度
  13. 思科 计算机网络 期末考试答案
  14. css仿支付宝提现到账过程时间轴
  15. Python下载网易云歌曲(版权限制的怎么播放和下载呢?)
  16. 【CSS基础】box-shadow盒子阴影(重点)
  17. “给在读研究生+未来要读研同学们的一封受益匪浅的信”(摘录+整合)
  18. 运维面试题(面前准备)
  19. FreeRTOS学习笔记 2 - 任务
  20. 修改手游登录服务器,手游[有侠气]一键启动服务端+客户端+GM管理运营后台+VIP修改+启动教程等...

热门文章

  1. 计算机主机风扇声音大的原因,台式电脑风扇声音大怎么办?五个方法简单完美解决...
  2. 单细胞测序数据下载和预处理
  3. Unity3D Dither 抖动Shader实现
  4. 3.基于Golang协程实现流量统计系统-快速构建一个示例网站
  5. 线性代数学习笔记——第四十讲——n维向量空间的概念
  6. 前端程序员成长的记录及被某IT外包公司套路的经历
  7. 肯德基 服务器响应异常,肯德基链接服务器异常
  8. html5压缩视频文件大小,格式工厂怎么压缩视频大小 只需5步大视频变小视频
  9. JS实现获取今天星期几
  10. 11月最新WIFI大师小程序源码/支持无限部署