AI基础:传教士与野人

设定:

河的左岸有3个传教士和3个野人,船的载重量是2。当传教士人数小于野人人数时,会被野人吃掉,现在要将传教士和野人都送过河。

代码实现:

from collections import deque  

initial_men = 3  # 初始传教士人数
initial_cannibals = 3  # 初始野人人数
boat_capacity = 2  # 船的承载量
moves = []
def init():
    max_move = boat_capacity
    for men_move in range(max_move + 1):
            for cannibal_move in range(max_move - men_move + 1):
                if (men_move == 0 and cannibal_move == 0) or (men_move + cannibal_move > max_move):
                    continue
                moves.append((men_move, cannibal_move))

# 定义初始状态和目标状态  
initial_state = (3, 3, 0, 0, 'right')  # (右岸传教士人数, 右岸野人人数, 左岸传教士人数, 左岸野人人数, 船的位置)  
final_state = (0, 0, 3, 3, 'left')  # 目标状态:所有人都到左岸,且船在左岸  
  
# 定义所有可能的动作  
actions = [  
    [(1, 0), (0, 1), (1, 1), (2, 0), (0, 2)],  # 传教士或野人单独过河,或传教士和野人一起过河  
    [(-1, 0), (0, -1), (-1, -1), (-2, 0), (0, -2)]    # 传教士或野人单独返回,或传教士和一个野人一起返回  
]  
  
# 定义状态是否有效的函数  
def is_valid_state(missionaries, cannibals, side):  
    """
    missionaries: 左岸传教士人数 
    cannibals: 左岸野人人数
    side: 船的位置
    """
    if missionaries < 0 or cannibals < 0:  
        return False  
    if side == 'left' and (missionaries < 3 and cannibals < missionaries):  #船在左岸,判断右岸
        return False  
    if side == 'right' and (missionaries > 0 and cannibals > missionaries):  #船在右岸,判断左岸
        return False  
    return True  

def is_valid(missionaries, cannibals):
    if missionaries < 0 or cannibals < 0:
        return False
    if missionaries > 0 and cannibals > missionaries:  
        return False
    return True

# 广度优先搜索  
def bfs():  
    queue = deque([initial_state])  
    visited = set([initial_state])  
  
    while queue:  
        current_state = queue.popleft()  
        current_path.append(current_state)
        if current_state == final_state:  
            return current_path  
          
        missionaries_right, cannibals_right, missionaries_left, cannibals_left, boat_side = current_state  
          
        new_boat_side = 'left' if boat_side == 'right' else 'right'
        moves = actions[0] if boat_side == 'right' else actions[1]
        for move in moves:    
            new_missionaries_right = missionaries_right - move[0]  
            new_cannibals_right = cannibals_right - move[1]  
            new_missionaries_left = missionaries_left + move[0]  
            new_cannibals_left = cannibals_left + move[1]
                  
            new_state = (new_missionaries_right, new_cannibals_right, new_missionaries_left, new_cannibals_left, new_boat_side)  
            # if new_state not in visited and is_valid_state(new_missionaries_left, new_cannibals_left, 'left') and is_valid_state(new_missionaries_right, new_cannibals_right, 'right'):
            if new_state not in visited and is_valid(new_missionaries_left, new_cannibals_left) and is_valid(new_missionaries_right, new_cannibals_right):
                visited.add(new_state)    
                queue.append(new_state)  
  
# 存储路径  
current_path = []  
  
# 执行BFS  
result = bfs()  
  
# 打印结果路径  
if result:  
    print("解决方案路径:")  
    for step in result:  
        print(step)  
else:  
    print("没有找到解决方案")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core mvc发布时输出视图文件Views

var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器&#xff0c;注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录&#xff0c;视图文…

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

背包九讲——完全背包问题

目录 完全背包问题 问题定义 动态规划解法 状态转移方程 初始化 遍历顺序 三种解法&#xff1a; 朴素版——枚举k 进阶版——dp正推&#xff08;一维滚动数组&#xff09; 背包问题第三讲——完全背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定…

kafka 的高可用机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 的高可用机制是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 的高可用机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个分布式消息系统&am…

《性能之巅:洞悉系统、企业与云计算》读书笔记-Part 1

本文是读书笔记第一部分&#xff0c;包括原书第一、二章。 绪论 性能是一门令人激动的&#xff0c;富于变化同时又充满挑战的学科。 系统性能 单台服务器上的通用系统软件栈 人员 系统性能是一项需要多类人员参与的工程。 事情 关于性能的理想执行顺序排列如下&#x…

8个方法教会你提高企业培训效率

培训成本是企业中的一个复杂问题。它完全取决于课程内容、培训方法以及成本效益。在计算培训费用时&#xff0c;公司会面临许多关于包括哪些内容、如何进行以及假设情景的问题。 企业员工培训的每个方面都会产生自己的成本。例如&#xff1a; 地点&#xff1a;我们专门找个培训…

【重拾算法第一天】质数约数欧拉筛 埃氏筛GCD

1.素数 素数&#xff08;Prime Number&#xff09;是指大于1的自然数&#xff0c;只有两个正因数&#xff1a;1和它自身。换句话说&#xff0c;素数是不能被其他自然数整除的数。 1.1小素数的判定 判定一个数是否为素数 &#xff0c;当N ≤ 时&#xff0c; 用试除法 &#…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

DAF-Net:一种基于域自适应的双分支特征分解融合网络用于红外和可见光图像融合

题目&#xff1a;DAF-Net: A Dual-Branch Feature Decomposition Fusion Network with Domain Adaptive for Infrared and Visible Image Fusion 作者&#xff1a;JianXu发表时间&#xff1a;2024年9月 面临的问题&#xff1a;红外图像擅长捕捉热辐射&#xff0c;特别是在低…

国家能源集团携手海康威视研发攻克融合光谱煤质快检技术

10月24日&#xff0c;在国家能源集团准能集团黑岱沟露天煤矿&#xff0c;安装于准能选煤厂785商品煤胶带机中部的煤质快检核心设备&#xff0c;正在对当天装车外运的商品煤煤质进行实时检测。仅两分钟后&#xff0c;涵盖发热量、水分、灰分、硫分等多项指标的数据信息已传输到到…

前端方案:播放的视频加水印或者文字最佳实践

前言&#xff1a; 很多时候&#xff0c;视频的转码工作在后端&#xff0c;我们前端是拿到可以播放的链接进行播放即可。但是总是会出现一些定制化的需求&#xff0c;比如在视频的某个区域贴上水印、标识或者文字。这个时候大部分是由前端来操作的。 直接去修改播放器里的东西…

c语言指针详解2

c语言指针详解2 1.数组名理解 数组名其实是地址&#xff0c;是数组首元素的地址&#xff08;详解1有提及&#xff09; 我们可以根据打印来确认 我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样&#xff0c;数组名就是数组⾸元素(第⼀个元素)的地址。 但是上述结论有…

DataX简介及使用

目录 一、DataX离线同步工具DataX3.0介绍 1.1、 DataX 3.0概览 1.2、特征 1.3、DataX3.0框架设计 1.4、支持的数据元 1.5、DataX3.0核心架构 1.6、DataX 3.0六大核心优势 1.6.1、可靠的数据质量监控 1.6.2、丰富的数据转换功能 1.6.3、精准的速度控制 1.6.4、强劲的…

轻松清理 PC 微信文件,释放存储空间

软件介绍 微信在我们的日常生活中使用频率极高&#xff0c;但随着时间的推移&#xff0c;它占用的存储空间也越来越大。以一个使用了两年时间的微信为例&#xff0c;它可能会占用多达几十G的存储空间。其中大部分都是与自己无关的各大群聊中的文件、视频、图片等内容&#xff…

java导出带图形的word

先看效果图&#xff1a;方法都是一样的&#xff0c;所以数据只做了前两组 第一步需要准备模版&#xff1a; 新建一个word插入图表&#xff0c;选择想要的图表。 编辑图表&#xff1a;营业额表示数字&#xff0c;季度表示文字。其他的样式编辑可根据自己的需求更改&#xff0c;…

从 Vue 2 到 Vue 3:全面升级指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-从 Vue 2 到 Vue 3&#xff1a;全面升级指南 前言 随着前端技术的不断发展&#xff0c;Vue.j…

基于大型语言模型的智能网页抓取

Google Gemini 是 Google AI 创建的大型语言模型 (LLM) 系列&#xff0c;可提供最先进的 AI 功能。Gemini 模型包括&#xff1a; Gemini Ultra — 最大、最强大的模型&#xff0c;擅长处理编码、逻辑推理和创意协作等复杂任务。可通过 Gemini Advanced&#xff08;原名 Bard&a…

FreeRTOS任务状态_改进播放控制 任务管理与调度 空闲任务及其钩子函数 两个Delay函数

任务状态_改进播放控制 FreeRTOS源码概述&#xff08;内存管理&#xff0c;入口函数&#xff0c;数据类型和编程规范&#xff09;创建任务&#xff08;声光色影&#xff0c;使用任务参数&#xff09;删除任务&#xff08;使用遥控器控制音乐&#xff09;-CSDN博客https://blog…

网络信息安全工程师证2024年如何报考?了解这几点让你轻松考证!收藏这一篇就够了

网络信息安全工程师是一种专门从事网络安全工作的职业。随着互联网的快速发展和普及&#xff0c;网络安全问题也日益突出&#xff0c;因此网络信息安全工程师的需求也越来越大。 网络信息安全工程师主要负责保护网络系统和数据的安全&#xff0c;防止黑客攻击、病毒侵入、数据泄…

2.3 塑性力学—等效应力

个人专栏—塑性力学 1.1 塑性力学基本概念 塑性力学基本概念 1.2 弹塑性材料的三杆桁架分析 弹塑性材料的三杆桁架分析 1.3 加载路径对桁架的影响 加载路径对桁架的影响 2.1 塑性力学——应力分析基本概念 应力分析基本概念 2.2 塑性力学——主应力、主方向、不变量 主应力、主…