人工智能原理实验1(2)——传教士与野人问题

news2025/1/16 17:44:46

🧡🧡实验内容🧡🧡

有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定野人与牧师都会划船,试设计一个算法,确定他们能否渡过河去,若能,则给出小船来回次数最少的最佳方案。
输入:牧师人数(即野人人数):n;小船一次最多载人量:c。
输出:若问题无解,则显示Failed,否则,显示Successed输出所有可行方案,并标注哪一组是最佳方案。用三元组(X1, X2, X3)表示渡河过程中的状态。并用箭头连接相邻状态以表示迁移过程:初始状态->中间状态->目标状态。

例:当输入n=2,c=2时,输出:221->200->211->010->021->000;
其中:X1表示起始岸上的牧师人数;X2表示起始岸上的野人人数;X3表示小船现在位置(1表示起始岸,0表示目的岸)。
Please input n: 2 Please input c: 2
Optimal Procedure: 221->200->211->010->021->000
Successed or Failed?: Successed

🧡🧡实现🧡🧡

状态的数据结构:

class State:
    def __init__(self, Lsavage, Lmissionary, Rsavage, Rmissionary, boat):
        self.Lsavage = Lsavage # 左边野人数目
        self.Lmissionary = Lmissionary # 左边野人数目
        self.Rsavage = Rsavage
        self.Rmissionary = Rmissionary
        self.boat = boat  # 0: 左边   1:右边

结果解释

👇初始状态为(2,2,1)👇
在这里插入图片描述
在这里插入图片描述

👇初始状态为(3,3,1)👇
在这里插入图片描述
在这里插入图片描述

完整程序

class State:
    def __init__(self, Lsavage, Lmissionary, Rsavage, Rmissionary, boat):
        self.Lsavage = Lsavage # 左边野人数目
        self.Lmissionary = Lmissionary # 左边野人数目
        self.Rsavage = Rsavage
        self.Rmissionary = Rmissionary
        self.boat = boat  # 0: 左边   1:右边

def boating(i,s,m): # s个野人 和 m个传教士
    if States[i].boat==1:  # 船在右边,准备往左边送
        States[i+1].Rsavage=States[i].Rsavage-s
        States[i+1].Rmissionary=States[i].Rmissionary-m
        States[i+1].Lsavage=States[i].Lsavage+s
        States[i+1].Lmissionary=States[i].Lmissionary+m
        States[i+1].boat=0
    else:                 # 船在左边,准备往右边送
        States[i+1].Lsavage=States[i].Lsavage-s
        States[i+1].Lmissionary=States[i].Lmissionary-m
        States[i+1].Rsavage=States[i].Rsavage+s
        States[i+1].Rmissionary=States[i].Rmissionary+m
        States[i+1].boat=1

def check(state): # 检查是否是正确的状态
    if state.Rmissionary>0 and state.Rmissionary<state.Rsavage:
        return False
    elif state.Lmissionary>0 and state.Lmissionary<state.Lsavage:
        return False
    else:
        return True

def saveSolution(i): # 保存路径
    path=""
    for j in range(0,i+1):
        path+=str(States[j].Rmissionary)+str(States[j].Rsavage)+str(States[j].boat)
        if j!=i:
            path+="->"
        else:
            path+="\n"
    all_path.add(path)


def dfs(i):
    # 终止条件
    if i >= 150:
        return
    for j in range(0, i):  # 保证没有重复状态
        if States[j].Lsavage == States[i].Lsavage and \
                States[j].Lmissionary == States[i].Lmissionary and \
                States[j].Rsavage == States[i].Rsavage and \
                States[j].Rmissionary == States[i].Rmissionary and \
                States[j].boat == States[i].boat:
            return
    if States[i].Rsavage == 0 and States[i].Rmissionary == 0 and States[i].boat == 0:  # 目标状态
        saveSolution(i)
        return

    # 递归  s: 野人个数, m:传教士个数, c:船的最大载量
    if States[i].boat == 1:  # -- 船在右边
        for s in range(1, c + 1 if c < States[i].Rsavage else States[i].Rsavage + 1):  # 先让野人上船
            m = 0
            boating(i, s, m)
            if check(States[i + 1]):
                dfs(i + 1)
        for m in range(1, c + 1 if c < States[i].Rmissionary else States[i].Rmissionary + 1):  # 再让传教士上船
            for s in range(m + 1):
                if s <= c - m and s <= States[i].Rsavage:
                    boating(i, s, m)
                    if check(States[i + 1]):
                        dfs(i + 1)
    else:  # -- 船在左边
        for s in range(1, c + 1 if c < States[i].Lsavage else States[i].Lsavage + 1):
            m = 0
            boating(i, s, m)
            if check(States[i + 1]):
                dfs(i + 1)
        for m in range(1, c + 1 if c < States[i].Lmissionary else States[i].Lmissionary + 1):
            for s in range(m + 1):
                if s <= c - m and s <= States[i].Lsavage:
                    boating(i, s, m)
                    if check(States[i + 1]):
                        dfs(i + 1)


if __name__ == "__main__":
    n = eval(input("请输入野人和传教士的的人数 n="))
    c = eval(input("请输入船的最大载量 c="))

    States = [State(0, 0, 0, 0, 0) for _ in range(150)]  # 初始化状态
    States[0].Rsavage = States[0].Rmissionary = n
    States[0].Lsavage = States[0].Lmissionary = 0
    States[0].boat = 1  # 船一开始在右边

    all_path = set()  # 初始化路径
    dfs(0)  # 递归

    # 打印结果
    if not all_path:
        print("无解")
    else:
        print(f"\n{len(all_path)}条可行路径:")
        for p in all_path:
            print(p, end="")
        print("\n最佳路径(次数最少):")
        print(min(all_path, key=len))


🧡🧡总结🧡🧡

1.当船载量设置为2时:

野人和传教士人数为2时,程序输出结果如下👇
在这里插入图片描述
野人和传教士人数为3时,程序输出结果如下👇
在这里插入图片描述
野人和传教士人数为4时,程序输出结果如下👇
在这里插入图片描述
野人和传教士人数>=4时,均是无解

2.当船载量设置为3时:

野人和传教士人数为2时,程序输出结果如下👇
在这里插入图片描述
野人和传教士人数为3时,程序输出结果如下👇
在这里插入图片描述
在这里插入图片描述
野人和传教士人数为4时,程序输出结果如下👇
在这里插入图片描述在这里插入图片描述
野人和传教士人数为5时,程序输出结果如下👇
在这里插入图片描述
在这里插入图片描述
野人和传教士人数为>=6 时,程序输出结果如下👇
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1400850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法练习-替换数字(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;字符串 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个字符串S,它包含小写字母和数字字符&#xff0…

全国各省市上市公司数量数据,Shp、excel格式,含上市企业数量、行政区划中心点位经纬度等字段

基本信息. 数据名称: 全国各省市上市公司数量数据 数据格式: Shp、excel 数据时间: 2023年1月 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2provin_dm省份代码3city城市名…

力扣刷MySQL-第七弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

如何快速搭建springboot+前后端分离(vue),多商户客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

kxmalls外卖生鲜多商户&#xff0c;针对中小商户、企业和个人学习者开发。使用Java编码&#xff0c;采用SpringBoot、Mybatis-Plus等易用框架&#xff0c;适合个人学习研究。同时支持单机部署、集群部署&#xff0c;用户与店铺范围动态定位&#xff0c;中小商户企业可根据业务动…

C语言的编译和链接

每日一言 要保持希望在每天清晨太阳升起。 --自己 前言 当我们写下C语言代码&#xff08;源文件、以.c为后缀&#xff09;的时候&#xff0c;他需要经过一个翻译环境&#xff0c;被处理后形成一个可执行程序&#xff08;以.exe为后缀&#xff09;。形成的这个可执行程序里面放…

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

matlab抽取与插值

什么是抽取&#xff1f; 我们假设一个数字信号 x ( n ) , n 1 , 2 , . . . , N x(n),n1,2,...,N x(n),n1,2,...,N共有 N N N个点&#xff0c;抽取就是每个几个点抽1个点&#xff0c;比如2倍抽取&#xff0c;那么抽取后的信号为 y ( n ) , y ( 1 ) x ( 1 ) , y ( 2 ) x ( 3 …

WebSocket-黑马好客租房

文章目录 网站中的消息功能如何实现&#xff1f;什么是WebSocket&#xff1f;http与websocket的区别httpwebsocket 浏览器支持情况快速入门创建itcast-websocket工程websocket的相关注解说明实现websocket服务测试编写js客户端 SpringBoot整合WebSocket导入依赖编写WebSocketHa…

Python实现M-Estimators稳健线性回归模型(RLM算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 M-Estimators 是稳健统计估计中的一个重要概念&#xff0c;它们在处理含有异常值、离群点或者影响点的…

GPT应用_AutoGPT

项目地址&#xff1a;https://github.com/Significant-Gravitas/AutoGPT 1 功能 1.1 整体功能&#xff0c;想解决什么问题 单独使用 ChatGPT 时&#xff0c;只提供基本的聊天&#xff0c;无法实现复杂多步的功能&#xff0c;以及与其它应用交互&#xff0c;如果想提供某种功…

【开源】基于JAVA的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

【微服务】springcloud集成sleuth与zipkin实现链路追踪

目录 一、前言 二、分布式链路调用问题 三、链路追踪中的几个概念 3.1 什么是链路追踪 3.2 常用的链路追踪技术 3.3 链路追踪的几个术语 3.3.1 span ​编辑 3.3.2 trace 3.3.3 Annotation 四、sluth与zipkin概述 4.1 sluth介绍 4.1.1 sluth是什么 4.1.2 sluth核心…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节&#xff0c;以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源&#xff08;如太阳能、风能、储能等&#xff09;和负载&#xff08;如建筑、工业设备等&…

NLP论文阅读记录 - 2021 | WOS 使用预训练的序列到序列模型进行土耳其语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1 预训练的序列到序列模型2.2 抽象文本摘要 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos&#xff0c;查看所有任务的栈的信息&#xff0c;包括任务名&#xff0c;任务状态&#xff0c;任务优先级&#xff0c;空闲栈&#xff0c;任务号。 运行结果如下 只需要使用一个函数vTaskList &#xff1a;获得任务的统计信息&#xff0c;形式为…

【leetcode】移除元素

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…

AI视频智能识别技术在智慧农业大棚升级改造管理场景中的应用方案

一、需求分析 随着科技的进步和农业现代化的推进&#xff0c;智能化技术逐渐成为现代农业发展的重要支撑。农业大棚作为现代农业的重要组成部分&#xff0c;其智能化改造对于提高农业生产效率、降低成本、增加收益具有重要意义。利用先进的信息化手段来对农业大棚进行管理&…

复合材料压缩过程中引入屈曲变形前后的对比

振动模态&#xff1a; 压缩过程&#xff08;不考虑屈曲引入&#xff09; 在45KN出现拐点&#xff0c;在30步。 30步&#xff0c;压缩时的面外位移&#xff0c;与一阶模态类似&#xff1b;31步已经不正常。在快破坏前几步与一阶模态很相似。 30步树脂拉伸只是零星出现 …

CSS之高度塌陷和外边距塌陷

目录 1.高度塌陷&#xff08;原因&#xff0c;如何解决&#xff09; 【概念介绍】 【解决办法】 【概念介绍-BFC】 【拓展-BFC的触发条件】 2.外边距塌陷 &#xff08;原因&#xff0c;如何解决&#xff09; 【概念介绍】 【两种情况】 1.相邻块元素 2.嵌套块元素 【…

【arthas诊断线上java应用】

背景&#xff1a; 想起来之前的面试&#xff0c;有一次问到&#xff1a;假如线上出现cpu飙升&#xff0c;和内存问题&#xff0c;如何排查&#xff1f;当时我只用过jprofiler&#xff0c;现在想想这个玩意是要占用一个端口的&#xff0c;而且会影响服务器的性能&#xff0c;适…