一、实验目的

  1. 会定义图的抽象数据类型
  2. 熟悉图的基本结构掌握程序中的用户头文件、实现文件和主文件之间的相
    互关系及各自的作用
  3. 熟悉对图的一些基本操作和具体的函数定义
    4.掌握在实际问题中运用所学知识解决实际问题的方法和步骤。

二、编程环境
Python语言
三、实验内容描述
有一农夫带着一条狼、一只羊和一筐菜想从河的左岸乘船到右岸。但由于船太小农夫每次只能带一样东西过河而且如果没有农夫看管则狼会吃羊,羊会吃菜。问农夫怎样过河才能把每样东西安全地送过河。
四、实验要求
1.上述问题用图表示出来
2. 选择图的一种存储结构编写一个自动生成该图的算法
3.在上述基础上编写求解该问题的算法程序并用此程序上机运行、调试
4.屏幕显示结果能结合程序进行分析
五、算法设计与代码分析
通过分析题干,我们可以理解重点在于:穷举状态,同时仍需判断动作的有效性。
设定一个有四个元素的列表表示狼,羊,菜,商人的状态。
initial_state = [0, 0, 0, 0]
这个元素对应的状态为0时,代表这个元素在此岸,反之在彼岸。
我们需要做的就是讲这个状态由[0,0,0,0]变成[1,1,1,1]、也就是让所有的元素全部过河。
但是为了避免狼吃掉羊,羊吃掉菜。我们对可行的中间状态还要做一定的设置。然后用枚举法的方式列举出来。知道有一个方案能成功让[0,0,0,0]变成[1,1,1,1]为止。

Python 代码实现如下:

import pandas as pd
import numpy as npinitial_state = [0, 0, 0, 0]  # the left side of river = 0
final_state = pd.Series([1, 1, 1, 1])
final_state.index = ['wolf', 'lamb', 'veg', 'farmer']
state = pd.DataFrame(columns=["wolf", "lamb", "veg", "farmer"])  # 8 3 5
state = state.append({'wolf': 0, 'lamb': 0, 'veg': 0, 'farmer': 0}, ignore_index=True)
state_col = state.columnsdef farmer(state, num):current = state.loc[len(state) - 1][state_col]if (current == final_state).all():return stateelif (current['farmer'] == 1 and current['wolf'] == 1 and current['veg'] == 1 and current['lamb'] == 0):current['farmer'] = 0  # 减少不必要的穷举次数state = state.append(current, ignore_index=True)current['farmer'] = 1current['lamb'] = 1state = state.append(current, ignore_index=True)state = farmer(state, 0)return stateelse:  # 每一趟都必须有农民 农民带或者不带与它在一边的物品row = current[current == current['farmer']]for id in range(num, len(row) - 1):current = state.loc[len(state) - 1][state_col]current['farmer'] = 1 - current['farmer']current[row.index[id]] = 1 - current[row.index[id]]if not (((current['wolf'] == current['lamb']) and (current['lamb'] != current['farmer'])) or \((current['lamb'] == current['veg']) and (current['lamb'] != current['farmer']))):state = state.append(current, ignore_index=True)if len(state) == len(state.drop_duplicates()):state = farmer(state, 0)return stateelse:state = state.drop_duplicates()if (id != len(row) - 1 - 1):  # 每次带一样东西或者单独返回state = farmer(state, id + 1)return stateelse:current = state.loc[len(state) - 1][state_col]current['farmer'] = 1 - current['farmer']state = state.append(current, ignore_index=True)state = farmer(state, 0)return stateoutput = farmer(state, 0)
print(output)  #打印显示表格结果

六、实验结果与总结
最终的输出结果为:

七、心得体会
通过这一次的人工智能上机课,我在实践的课程中更加了解熟悉了穷举、枚举问题表示法;通过对所学知识的应用,基本上掌握人工智能中的经典例子——猴子农夫、狼、羊、白菜过河问题的编程实现,收获可谓是颇丰。更重要的是也在这次实践中小组的团队协作能力更强了。

狼、羊、菜、农夫过河问题相关推荐

  1. 农夫过河狼羊白菜Java开放封闭_农夫过河——狼羊菜问题

    话说一位农夫带着一只狼.一只羊和一个卷心菜过河,无奈船小,农夫每次只能运送一样东西,考虑到狼吃羊.羊吃菜,因此运送的顺序至关重要. 在现实世界里解决这个问题并不困难,相信很多人都已经有了答案,但是如何 ...

  2. 狼羊菜过河问题深入学习分析——Java语言描述版

    前言 这个问题的抛出,是几个星期之前的算法课程.老师分析了半天,最后的结论是:其实就是图的遍历.那时候挺懵逼的,不管是对于图,还是遍历,或者是数据结构,心里面都没有一个十足的概念,所以搁置了这么久的问 ...

  3. 狼羊菜过河(C实现)

            题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种 ...

  4. *python解决狼羊菜过河问题

    python解决狼羊菜过河问题 A岸有菜,羊,狼,农夫农夫必须将他们都送到B岸每次只能送一个,在保证他们不会被吃的前提下,完成任务,并得出步骤. 代码: A=[["狼",1],[& ...

  5. java狼羊草过河_狼羊菜过河问题深入学习分析——Java语言描述版

    前言 这个问题的抛出,是几个星期之前的算法课程.老师分析了半天,最后的结论是:其实就是图的遍历.那时候挺懵逼的,不管是对于图,还是遍历,或者是数据结构,心里面都没有一个十足的概念,所以搁置了这么久的问 ...

  6. 算法之狼羊菜过河问题

    算法之狼羊菜过河问题 1.带羊再带狼 回来时把羊带上 然后把白菜带到对岸 最后把羊带过去 2..带羊再带菜 回来时把羊带上 然后把狼带到对岸 最后把羊带过去 关键点在于羊和两个都有联系,而狼不吃菜,

  7. 位操作符:与,或,异或 狼羊菜

    位操作符 位操作符有三种,即: ①按位与----- & ②按位或----- | ③按位异或-- ^ 还有一类操作符叫逻辑操作符,分别为: ①逻辑与----- && ②逻辑或-- ...

  8. 狼羊菜问题的算法思想和C++实现(二进制状态表示 递归状态转移 回溯 剪枝)

    狼羊菜问题的算法思想和C++实现 狼羊菜问题 把[狼.羊和蔬菜]这三样东西安全地送至河的对面,你能用的工具只有身边的一艘小船.已知,这艘小船很小,当你坐在里面时,其只能搭载[狼.羊和蔬菜]这三样东西中 ...

  9. 狼羊菜过河问题c语言算法,算法系列之十四:狼、羊、菜和农夫过河问题

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  10. 算法谜题1,狼羊菜过河

    问题描述 农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

最新文章

  1. 删除trigger 禁用触发器 启用触发器 查看触发器
  2. 使用UIScrollView 实现分页功能
  3. Oracle RBA(Redo Byte Address) 说明
  4. 北大青鸟广州天河中心S1T62班HTML项目答辩实录
  5. 计算机省赛教案,《计算机系统的组成》最新 参赛教案.doc
  6. 全面 Severless 化只需要 7天!
  7. scrum回顾_3步开好回顾会 | IDCF FDCC认证学员作品
  8. 【Python CheckiO 题解】Sort Array by Element Frequency
  9. 数组 spark_结合实例理解Spark中的cache()
  10. Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player-转
  11. Windows10下安装MySQL8.0
  12. 一些基本数字图像处理算法
  13. 【手机连接adb的两种方法】
  14. jQuery实现button按钮提交表单
  15. 51超声波测距简易代码
  16. pcr mix试剂选购相关问题
  17. 计算机操作系统发展史免费 ppt,《计算机操作系统》PPT课件
  18. 文章本天成 妙手偶得之 两句三年得 一吟双泪流
  19. 定陶创维科技-自己创业的经历(1)
  20. 足球比赛常用英语单词集锦

热门文章

  1. Android获取物理键盘按键的keycode
  2. 哔哩哔哩如何一键给全部粉丝发私信
  3. 【SA8295P 源码分析】34 - 老婆都想懂的Audio系列 -
  4. Linux内核的红黑树源码实现以及调用
  5. Linux 内核设计与实现
  6. 周润发:《上海滩》成就史上最酷最帅“许文强”
  7. Linux 音频硬件设备-msm89xx和pm8953 Audio Hardware
  8. 智能家居来了,未来的你需要一个会思考的房子
  9. 参与项目——智美庭院
  10. Validform使用入门