没有合适的资源?快使用搜索试试~ 我知道了~
2021年数学建模:研究商人过河问题.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 199 浏览量
2022-10-20
07:41:53
上传
评论
收藏 352KB PDF 举报
温馨提示
试读
19页
2021年数学建模:研究商人过河问题.pdf2021年数学建模:研究商人过河问题.pdf
资源推荐
资源详情
资源评论
*欧阳光明*创编 2021.03.07
数学建模实验一报告
欧阳光明(2021.03.07)
实验题目:研究商人过河问题
一、实验目的:编写一个程序(可以是 C,C++或 Mathlab)实现商
人安全过河问题。
二、实验环境:Turbo c 2.0、Microsoft Visual C++ 6.0、Matlab 6.0
以上
三、实验要求:要求该程序不仅能找出一组安全过河的可行方案,
还可以得到所有的安全过河可行方案。并且该程序具有一定的可扩
展性,即不仅可以实现 3 个商人,3 个随从的过河问题。还应能实
现
n 个商人,n 个随从的过河问题以及 n 个不同对象且每个对象有 m
个元素问题 (说明:对于 3 个商人, 3 个随从问题分别对应于
n=2,m=3)的过河问题。从而给出课后习题 5(n=4,m=1)的全部安
全过河方案。
四、实验步骤:
第一步:问题分析。这是一个多步决策过程,涉及到每一次船上的
人员以及要考虑此岸和彼岸上剩余的商人数和随从数,在安全的条
件下(两岸的随从数不比商人多),经有限步使全体人员过河。
第二步:分析模型的构成。记第 k 次渡河前此岸的商人数为
x
k
,
随 从 数 为
y
k
,
k 1,2
,
x
k
,
y
k
1,2
n
, ( 具 有 可 扩 展 性 ) , 将
(x
k
, y
k
)
定 义 为 状 态 , 状 态 集 合 成 为 允 许 状 态 集 合 ( S ) 。
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
S={
(x, y)| x 0, y 0,1,2,3; x 3, y 0,1,2,3; x y 1,2
}记第 k 次渡船的商人
数为
u
k
,随从数为
v
k
,决策为
(u
k
, v
k
)
,安全渡河条件下,决策的集
合 为 允 许 决 策 集 合 。 允 许 决 策 集 合 记 作 D , 所 以
D={
(u,v)| 1 u v 2,u, v 0,1,2
|1<u+v<2,u,v=0,1,2},因为 k 为奇数时船
从此岸驶向彼岸, k 为偶数时船由彼岸驶向此岸,所以状态
s
k
随决
策
d
k
变化的规律是
s
k 1
s
k
(1)
k
d
k
,此式为状态转移律。制定安全
渡河方案归结为如下的多步决策模型:求决策
d
k
D(k
1,2 n)
,使
状 态
s
k
S
按 照 转 移 律 , 由 初 始 状 态
s
1
(3,3)
经 有 限 n 步 到 达
s
n1
(0,0)
第三步:模型求解。
#include "stdio.h"
#include "string.h"
#include <memory>
#include <stdlib.h>
#include <iostream>
using namespace std;
#include "conio.h"
FILE *fp;/*设立文件指针,以便将它用于其他函数中*/
struct a{
long m,s;
struct a *next;
};/*数组类型 a:记录各种情况下船上的商人和仆人数,m:代表商
人数 s:代表仆人数*/
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
struct a *jj,head;/*head 为头指针的链表单元(船上的人数的各种情
况的链表)*/
int n,total=0,js=0;/*total 表示船上各种情况总数*/
struct aim {
long m1,s1,m2,s2;
int n;
struct aim *back,*next;};/*用于建立双向的指针链表,记入符合的情
况,m1,s1 表示要过岸的商人数和仆人数;m2,s2 表示过岸了的
商人数和仆人数,n 表示来回的次数*/
int k1,k2;
void freeit(struct aim *p){
struct aim *p1=p;
p1=p->back;
free(p);
if(p1!=NULL)
p1->next=NULL;
return;
}/*释放该单元格,并将其上的单元格的 next 指针还原*/
int determ(struct aim *p)
{ struct aim *p1=p;
if(p->s1>k2)return -1;/*仆人数不能超过总仆人数*/
if(p->m1>k1)return -1;/*商人数不能超过总商人数*/
if(p->s2>k2)return -1;/*对岸,同上*/
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
if(p->m2>k1)return -1;/*对岸,同上*/
if(p->s1<0)return -1;/*仆人数不能为负*/
if(p->s2<0)return -1;/*商人数不能为负*/
if(p->m1<0)return -1;/*对岸,同上*/
if(p->m2<0)return -1;/*对岸,同上*/
if(p->m1!=0)
if(p->s1>p->m1)return -1;
if(p->m2!=0)
if(p->s2>p->m2)return -1;/*两岸商人数均不能小于仆人数*/
while(p1!=NULL){
p1=p1->back;
if(p1!=NULL)
if(p1->n%2==p->n%2)
if(p1->s1==p->s1)
if(p1->s2==p->s2)
if(p1->m1==p->m1)
if(p1->m2==p->m2)
return -1;}/*用于解决重复,算法思想:即将每次算出的链表单元与
以前的相比较,若重复,则表示出现循环*/
if(p->s1==0&&p->m1==0)
if(p->n%2==0)return 1;
else return -1;/*显然如果达到条件就说明 ok 了*/
return 0;}/*判断函数*/
*欧阳光明*创编 2021.03.07
剩余18页未读,继续阅读
资源评论
春哥111
- 粉丝: 1w+
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功