一、实验目的
- 会定义图的抽象数据类型
- 熟悉图的基本结构掌握程序中的用户头文件、实现文件和主文件之间的相
互关系及各自的作用 - 熟悉对图的一些基本操作和具体的函数定义
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 np
initial_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.columns
def farmer(state, num):
current = state.loc[len(state) - 1][state_col]
if (current == final_state).all():
return state
elif (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'] = 1
current['lamb'] = 1
state = state.append(current, ignore_index=True)
state = farmer(state, 0)
return state
else: # 每一趟都必须有农民 农民带或者不带与它在一边的物品
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 state
else:
state = state.drop_duplicates()
if (id != len(row) - 1 - 1): # 每次带一样东西或者单独返回
state = farmer(state, id + 1)
return state
else:
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 state
output = farmer(state, 0)
六、实验结果与总结
最终的输出结果为:
七、心得体会
通过这一次的人工智能上机课,我在实践的课程中更加了解熟悉了穷举、枚举问题表示法;通过对所学知识的应用,基本上掌握人工智能中的经典例子——猴子农夫、狼、羊、白菜过河问题的编程实现,收获可谓是颇丰。更重要的是也在这次实践中小组的团队协作能力更强了。