商人过河问题

商人过河问题(n个)-Matlab n个商人过河问题 Description         商人过河问题:n名商人各带一名随从过河,一只小船只能容纳z个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河并且渡河次数最少呢?? Explaination 先从一般的例子开始讨论,通过3名商人各带一名随从过河,... 阅读详情

商人过河问题

1.问题描述

n名商人带n个随从乘船渡河,一只小船能容纳k人,由他们自己划行。随从们秘密商定,在河的任一岸,一旦随从的人数比商人多,就杀人越货。当然如何渡船的方案则由商人们决定,那么怎样才能确保商人安全渡河呢

2.模型假设

2.1 假设过河过程中不会发生意外

2.2 假设当随从数量多于商人数量时,不改变杀人越货的计划

2.3 假设所有人最终都到达河对岸

3.符号说明

M\mathcal{M}M:表示商人的数量

N\mathcal{N}N:表示随从的数量

Z:表示河的对岸和此岸

K:表示小船的容量

k:表示小船的乘坐的人数

M:表示此岸的商人数量

m:表示对岸的商人数量

N:表示此岸的随从数量

n:表示对岸的随从数量

4.模型分析

本题针对商人们能否安全过河,选择一种合理的过河方案,是一个多步决策问题。通过对每一次过河方案的筛选优化,最终得到商人们全部安全过河的最优决策方案。对每一次的过河过程看成一个随机决策状态量,商人们能够安全到达彼岸或此岸。我们可以看成目标决策允许的状态量,通过对允许的状态量的层层筛选,从而得到过河的目标。

5.模型的建立和求解

5.1模型的建立
本体为多步决策模型,每一次过河都是状态量的转移过程,可以用三维向量表示(M,N,Z)表示

M的取值范围:{0,1,2,⋯ ,n}\left \{ 0,1,2,\cdots,n \right \}{0,1,2,⋯,n}
N的取值范围:{0,1,2,⋯ ,n}\left \{ 0,1,2,\cdots,n \right \}{0,1,2,⋯,n}

Z={1, 表示划船到河的彼岸 0, 表示划船到河的此岸 Z=\left\{\begin{array}{l} 1, \text { 表示划船到河的彼岸 } \\ 0, \text { 表示划船到河的此岸 } \end{array}\right.Z={1, 表示划船到河的彼岸 0, 表示划船到河的此岸 ​

那么允许状态量(即两岸同时必须满足(M≥N)且(m≥n)

5.2模型的求解
模型要求从(n,n,1)开始,经过对每次过河的安全状态量的选择,最终安全到达(0,0,0)

根据题意,状态转移必须满足以下规则:

(1)Z从1变0或从0变1交替进行。

(2)z从1变为0,即从河的此岸到达彼岸,此岸的人数减少1,2,⋯ ,K1,2, \cdots ,K1,2,⋯,K,即从(M,N,1)→(m,n,0)时,两岸人数满足M≥N且m≥n

代码实现如下


% Matlab
clear;
home;
m=3; %商人、仆人数
z=3; %船上可载人数

m=m+1; %矩阵中不存在0位置
A=zeros(m); %列表示商人,行表示仆人
for i=0:m-1 %寻找安全状态,1为安全,0为不安全
    for j=0:m-1
        if (i==j)||(i==m-1)||(i==0)
            A(i+1,j+1)=1;
        end
    end
end
s={}; %用来存放路径
p=1;  %用来表示放在每一行的第几列
R=[]; %特殊情况
s{1,1}=[m,m,1]; %[a,b,c]a表示此岸商人数,b表示此岸仆人数,c表示由上面情况c推的

for t=1:100 %循环上界适当
    flag=0; %用来判断是否重复
    trump=0; %用来判断是否已经存在可安全渡河的情况
    k=t; %k表示渡河次数
    if z>=2*(m-1) %当船载人数大于或等于总人数
        k=1 
        R=[m-1,m-1;0,0]
        break;
    end 
    
    for a=1:sum(~cellfun(@isempty, s(k,:))) %表示有几种情况(相对于同一个k来说)
        if a==1 %第一种情况,从第一个列开始存
            p=1;
        end
        n1=s{k,a}(1,1); %赋值,商人数
        n2=s{k,a}(1,2); %赋值,仆人数
        
        for i=0:z %渡河
            for j=0:z
                if (i+j>=1 && i+j<=z) && (n1+i*(-1)^k<=m && n1+i*(-1)^k>=1) && (n2+j*(-1)^k<=m && n2+j*(-1)^k>=1) && (A(n1+i*(-1)^k,n2+j*(-1)^k)==1)
                %条件判断
                    if k>=2 %判断是否重复
                        for e=1:sum(~cellfun(@isempty, s(k-1,:)))
                            if (s{k-1,e}(1,1)==n1+i*(-1)^k) && (s{k-1,e}(1,2)==n2+j*(-1)^k)
                                flag=1; %如果发现重复,则flag==1
                                break;
                            end
                        end
                    end
                    if flag==0 %不重复存入
                        s{k+1,p}=[n1+i*(-1)^k,n2+j*(-1)^k,a];
                        p=p+1;
                    end
                    flag=0; %每一次判断之后flag都要归0
                end
            end
        end
    end
    
    k=k+1; %一次考虑完后k+1
    s{k+1,1}=[]; %往下创建空cell
    if sum(~cellfun(@isempty, s(k,:)))==0 %判断是否有新的情况生成,0表示s{k,:}全部为空
        'No answer!'
        break;
    end
    
    for win=1:sum(~cellfun(@isempty, s(k,:))) %判断是否已有完成任务的情况
        if s{k,win}(1,1)==1 && s{k,win}(1,2)==1
            trump=1;
            break;
        end
    end
    if trump==1
        k=k-1
        break;
    end
end

if trump==1  %输出一组结果
    W=[];
    qq=win;
    for oo=1:k+1
        W(oo,1)=s{k+2-oo,qq}(1,1)-1;
        W(oo,2)=s{k+2-oo,qq}(1,2)-1;
        qq=s{k+2-oo,qq}(1,3);
    end
    W=flipud(W)
end

输出结果如下

1   k = 
2
3       5
4
5   W=
6
7       3  3
8       3  1
9       3  2
10      0  2
11      0  3
12      0  0

当3名商人3名随从,且船最多坐3人时,最少需要5次,第一次运送2名随从,第二次一名随从划船回来,第三次运送3名商人,第四次1名随从划船回来,第五次3名随从划船到对岸。

商人过河问题_6人过河问题_3商人3随从过河问题_python求全部解 """ 三个商人带了三个随从准备过河,目前只有一条船,并且每一次只能过两个人, 这时随从商议在河的任意一岸只要商人的数量少于随从的数量,那随从就会杀人越货, 请问商人要怎么安全过河? """ from collections import Counter from random import sample, randint class Solution: """解决问题的方案类""" def __init__(self): """初始化属性""" se 阅读详情

相关推荐

我用c语言写了一个关于商人过河的问题

#include "stdio.h"#include "string.h"#include "conio.h"FILE *fp;/*设立文件指针,以便将它用于其他函数中*/struct a{long m,s;struct a *next;};/*数组类型a:记录各种情况下船上的商人和仆人数,m:代表商人数s:代表仆人数*/struct a *jj,head;/*head为头指针的链表单元(船上

backplace的专栏 3560

过河问题 思路详解+代码

无论是商人仆人(随从)过河,农夫妖怪过河,还是传教士野人过河…除了里面的角色有所变化,其问题的本质都没有变,可以统称为过河问题 此问题解释较为详细,问题所展现的流程其实也是我真实的思考的过程 文章目录解题过程未考虑实际情况(即未考虑小船不能空挡载人来回)问题简述:有3名商人携带3名仆人渡河,小船每次最多只能承载两人。仆人协定,一旦仆人的数量大于主人的数量就杀人越货,请给出合适的乘船次序。模型假设:变量表示:问题求解:问题变型:对应的如果将问题改为4个商人4个仆人结合实际问题(考虑小船载人渡河的实际情况)问

weixin_47210960的博客 6365

商人渡模型matlab及模型假设,商人过河问题

商人过河问题一、三名商人各带一名随从的情况1. 问题(略)2. 模型假设① 当一边岸满足随从数大于商人数,但商人数为0时仍为一种安全状态; ② 小船至多可容纳2人,且渡河时由随从(或者商人)来划船。3. 分析与建模商人过河需要一步一步实现,比如第一步:两个仆人过河,第二步:一个仆人驾船回来,第三步:又是两个仆人过河,第四步:……其中每一步都使当前状态发生变化,而且是从一种安全状态变为另一种安全状态...

weixin_42554151的博客 2398

c语言-商人过河游戏

商人过河游戏

huangmingcsdn的博客 1354

商人过河问题的C语言程序

数学建模中经典问题商人过河问题的C语言源代码,绝对是自己想出来的算法,比枚举算法的时间复杂度要小得多,算法中运用了队列作为存储结构,自己感觉非常的巧妙,我很快就会将该算法用MATLAB进行实现,并将其功能在MATLAB程序中进行扩充,敬请关注! 希望广大朋友给我提出意见和建议,Email:liang.wang.hubei@gmail.com,谢谢

商人过河问题的Matlab程序

商人过河问题的Matlab程序,供学习数学建模或者对趣味性数学感兴趣的人参考。

【数学建模】商人随从过河的一般模型

三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自已划行,随从们密约,在河的任一岸,一旦随从的人数比商人多就杀人越货。但是如果乘船渡河的大权掌握在商人们手中,商人们怎样才能安全渡河呢?又若四名商人各带一个随从过河,商人如何才能安全渡河?一般地,有n名商人带n个随从过河,船每次能渡k人过河,试讨论商人能安全过河时,n与k应满足什么条件?

EnkiduGilgamesh的博客 1795

商人过河问题C语言源码

商人过河问题是数学建模中的一个经典问题,程序利用链表存储渡河状态,使用穷举的算法实现。该算法会找出N个商人/随从渡河的一个可行方案,但并不保证是最佳方案。写完这个程序后让我想到的居然是图的深度优先搜索,二者在查找的思想上是类似的。

数学建模 | 商人们怎样安全过河

本文探讨了三个商人和他们的随从如何安全渡河的问题。小船每次只能载两人,且随从在任一岸人数超过商人时会杀害商人。通过状态转移模型,本文分析了所有可能的安全状态和决策,确保在任何时刻两岸的随从人数不超过商人。使用穷举法和图解法,本文找出了四种最优的渡河方案,每种方案均需11步完成。此外,还提供了Python代码实现,通过广度优先搜索算法自动寻找所有最短路径的解决方案。这些方法确保了商人和随从能够安全地渡过河流,避免了任何可能的危险情况。

chateata的博客 1317

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4888

Anaconda离线创建python环境

既然是离线创建python环境,就需要有一个已经创建好的python环境。所以我们有两台win10的机器,分别是A和B。两台机器都安装了anaconda。其中A可以连网,因此我们在A上创建好一个python2.7的环境py27,然后将py27移植(安装)到B上。B连不连网都无所谓。 一、机器上A上创建python2.7的环境py27 有两种方法: 方法1:使用Anaconda的图形界面。首先,点击Environments->Create,然后输入要创建的环境名称"py27",然后选择2.7,如图

FY_2018的博客 6786

数学建模-商人过河问题

商人过河问题 1.问题重述 三名商人各带一个随从乘船渡河,一只小船只能容纳二人,由他们自己划行。随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货。但是如何乘船渡河的大权掌握在商人们手中,商人们怎样才能安全渡河呢? 2.问题分析 该问题是一个多步决策的问题,商人的下一步决定方案依赖于此时的状态,同时商人可以选择的方案有多种可能,因此,要想顺利将商人送达到对岸,需要对每一步进行决策和假设,通过一步步推理,分析出最后的结果 3.模型假设 将商人和随从的数目抽象成具体数值 将河的此岸和彼岸抽象成两

weixin_45895718的博客 1万+

射频工程师必须了解的S参数四项要点

本文围绕单端 6 英寸走线的 S 参数展开深入分析,核心包含四项关键要点:低频下导线电学长度远小于信号波长,S11 呈大负分贝值、S21 接近 0 分贝;端口与走线的阻抗不匹配引发反射叠加,形成 S11 首个峰值(对应传输线四分之一波长频率);S21 相位可作为一致性检查依据,其 90° 相位差与 S11 峰值吻合;理想建模中 S11 峰值随频率上升因损耗下降,实际测量因连接器等阻抗不连续性,S11 会出现振荡上升。分析依托 Keysight ADS 工具与电磁求解器原理,为 S 参数解读提供科学支撑。

一只豌豆象的博客 1284

商人过河问题最少步数matlab,商人过河问题(n个)-Matlab

n个商人过河问题Description商人过河问题:n名商人各带一名随从过河,一只小船只能容纳z个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河并且渡河次数最少呢??Explaination先从一般的例子开始讨论,通过3名商人各带一名随从过河,一只小船只能容纳3个人,从此岸的...

weixin_33092503的博客 1058

【Tessent Shell Users Manual】【Ch3】Design Introspection and Editing(未完待续)

Tessent Shell 提供了一系列用于检查(examining/introspecting)和编辑design的命令。

Tranquil_ovo的博客 1731

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 484

商人过河问题,MATLAB代码

https://blog.youkuaiyun.com/weixin_30562977/article/details/116066354 %%%%%%%%%%%%%%%% 开始 %%%%%%%%%%%%%%%%%%%%%% function jueche=guohe clear all clc %%%%%%%%%%程序开始需要知道商人和仆人数;%%%%%%%%%%%%% shangren=input(输入商人数目: ); puren=input(输入仆人数目: ); rongliang=input(输入船的最大容量:

qq_43561757的博客 1294

别再乱点U盘里的.exe了!手把手教你彻底清除那个伪装成Usb Disk的蠕虫病毒

本文详细介绍了如何识别、清除和预防伪装成Usb Disk的蠕虫病毒。从识别感染迹象到安全备份文件,再到深度清理病毒残留和构建防护策略,提供了一套完整的U盘病毒解决方案。特别提醒用户注意U盘病毒的风险,并养成良好的使用习惯。

weixin_30496999的博客 664

数学模型 商人过河问题 C++实现

数学模型 商人过河问题 C++实现 问题描述 ​ 将过河问题抽象为一个数学问题,安全渡河即为一个多步决策问题,在安全的前提下,每一步都考虑船上的商人与随从人数情况。 ​ 决策问题通常从考虑状态,决策,状态转移方程入手。 状态 ​ 设sk=(xk,yk)s_k=(x_k,y_k)sk​=(xk​,yk​)表示第kkk次渡河前此岸的商人数与随从数,显然有xk,yk=0,1,2,3;k=1,2,⋯x_k,y_k=0,1,2,3;k=1,2,\cdotsxk​,yk​=0,1,2,3;k=1,2,⋯。 ​

kmzy_hnu的博客 2252

YOLO26-seg分割优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 280

Oracle EBS与SAP数据数据切换至迁移华为MetaERP分析

Oracle EBS到华为MetaERP的数据迁移可采用“表对表复制”思路,因其模块化设计下数据模型标准化、边界清晰。核心业务对象存储在结构明确的主表中,与MetaERP模型兼容度高,便于直接映射。而SAP到MetaERP的迁移则因SAP高度优化的复杂表结构(如簇表/池表)、数据分散冗余、深度依赖配置等特点,无法简单复制,必须采用基于业务对象的迁移方法,通过视图/BAPI提取数据并进行深度转换。两种迁移的本质差异源于源系统的数据模型设计理念不同。

金牌架构师 1378

商人过河问题(DFS)

问题描述: 3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人。在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过河顺序才能让所有人都安全地过到河的另一边。 详细过程参见《数学模型》第四版(姜启源) #include #define maxn 101 int num;//number of

YQ_beyond 3070

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

数学建模:商人过河问题(牛虎问题/传教士野人问题)C语言实现

问题分析 读题可以看出这是一个多步决策问题,可以用计算机进行编程解决更大范围的问题,建模时老师可能会要求用matlab进行编程实现,但我还是喜欢用C语言,可以更加直观地显示建模过程!!! 对于每一步的决策,可以选择一定数量的商人和仆人上船,然后在河的左岸和右岸之间进行摆渡,并且保证每一次摆渡都不能使得商人被杀死(当然,如果不存在一种安全过河的方案,那么商人必死) 当n=3,r=2时,船的左岸或右岸的(商人,仆人)数目有4*4=16种选择,再加上岸的左右,所以有32种选择。然后再去考虑船上(商人,仆人)的数.

lgw999jyx的博客 3873

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

matlab商人旅行问题,商人过河问题(n个)-Matlab

n个商人过河问题Description商人过河问题:n名商人各带一名随从过河,一只小船只能容纳z个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河并且渡河次数最少呢??Explaination先从一般的例子开始讨论,通过3名商人各带一名随从过河,一只小船只能容纳3个人,从此岸的...

weixin_39569894的博客 926

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: C 零长数组
下一篇: Raft 领导者选举
yumWant2debug
博客等级 码龄7年 27粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值