数学建模之初等模型——商人过河问题(Matlab实现)

无关前言

进入大学一年半了,发现许多不久前学过的知识转头就会忘并且自己的学习能力也没那么尽如人意,在知道了程序员的神器小黄鸭后,想着也许把我所学到的知识讲清楚分享出来更有利于自己的深度理解,同时也能帮到他人避开我所走的弯路。来到这个平台的目的就是分享自己的所学所感并与他人交流,大家共同进步。如果大家发现了我的问题(其实我挺菜的),请在评论区畅所欲言!

问题叙述

三名商人和他们的三个仆从打算乘船过河。小船最多容纳两人,在河的任一岸,如果仆从的数量超过商人,仆从们就会杀人越货,如何才能让商人们安全过河呢?

构建模型

首先把该问题抽象成一个简单的数学问题:我们将河左岸商人,仆从,和船所在的位置看作看作一个状态,并用一个向量(a,b,dir)加以描述:第一个分量代表左岸商人个数,第二个代表左岸仆从个数,第三个代表船所在的位置(-1为左岸,1为右岸)。接下来就是描述状态间的转移操作:我们用一个二维向量(p,q)代表船上商人和仆从的人数。那么从原状态(a,b,dir)经过操作(p,q)变为下一状态(c,d,new_dir)可以用该式表示:(c,d,new_dir)=(a,b,-dir)+dir*(p,q)。接下来我们的目标就是找到一个操作序列,使得初始状态(3,3,-1)在这个操作序列的作用下变为(0,0,1)。

模型求解

这个看起来很像递归,只不过只有递没有归,因为我们在递的过程中就已将需要的信息存下来了。形象地说:递归:小明问你厕所在哪里,你每到走廊的一个转角都会随机选一个前往(递),如果没找到厕所,你就返回上一个转角,知道你找到厕所,然后园路返回告诉小明怎么走(归)。而我们这里则是在找到厕所后把路线画下来然后拍照发给小明

代码实现

这里有的函数名后面会有个2,这个是为了和我之前的人狗鸡米问题(同样的解决思路)的函数区别一下,不必在意

function [ out ] = move_2( i )
%返回允许操作集的第i个操作
move=[1 0;0 1;2 0;1 1;0 2];
out=move(i,:);
end
function [ flag ] = check_status_2( status )
%检验是否在允许状态中,yes:1,no:0
status_permit=[3 3 1; 3 0 1;3 1 1;3 2 1;2 2 1;0 0 1;0 3 1;0 2 1;0 1 1;1 1 1] ;
temp=status_permit;
temp(:,end)=-temp(:,end)
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值