趣味问题:农夫羊狼白菜过河(人工智能、Python)实验报告

一、实验目的

  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 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)

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

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

  • 12
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值