商人们怎样安全过河 (附MATLAB程序完整)
-
商人们怎样安全过河
随从们密约
,
在河的任一岸
,
一旦随从
的
人
数
比
商
人<
/p>
多
,
就
杀
p>
人
越
货
.
但
是
p>
乘
船
渡
河
的
方
案
由
商
人
决
定
< br>.
商人们怎样才能安全过河
?
问题分析:
多步决策过程
决策
~
每一步
(
此岸到彼岸或彼岸到此岸
)
船上<
/p>
的人员
要求
~
在安全的前提下
(
两岸的随从数不比商
人多
),
经有限步使全体人员过河
.
建立模型
xk~
第
k
次渡河前此岸的商人数
xk,
yk=0,1,2,3;
yk~
第
k
次渡河前此岸的随从数
k=1,2,|....
sk=(xk ,
yk)~
过程的状态
S ~
允许状态集合
S={(x ,
y)
x=0,
y=0,1,2,3; x=3, y=0,1,2,3; x=y=1,2}
uk~
第
k
次渡船上的商人数
uk, vk=0,1,2;
vk~
第
k
次渡船上的随从数
k=1,2,.....
dk=(uk ,
vk)~
决策
D={(u ,
v)
u+v=1, 2}
~
允许决策集合
~
状态转移律
多步决策问题
求
dk<
/p>
D(k=1,2,
n),
使
sk
S,
并按转移律由
s1=(3,3)
到达
sn+1=(0,0).
模型求解
穷
举
法
~
编
程<
/p>
上
机
S={(x ,
y)
x=0,
y=0,1,2,3;x=3, y=0,1,2,3; x=y=1,2}
图解法
状态
s=(x,y) ~
16
个格点允许状态
~
10
个
点
允许决策
~
移动
1
或
2
格
; k
奇
,
左下移
; k
偶
,
右上移
.
d1,.......
,
d11
给
出安全渡河方案
评注和思考
规格化方法
,
易于推广
考虑
4
名商人各带一随从的情况
< br>
程序
%%%%%%%%%%%%%%%%
开始
%%%%%%%%%%%%%%%%%%%%%%
function jueche=guohe
clear
all
clc
%%%%%%%%%%
程序开始需要知道商人和仆人数;
%%%%%%%%%%%%%
shangren=input('
输入商人数目
: ');
puren=input('
输入仆人数目
: ');
ronglian
g=input('
输入船的最大容量
: ');
if
puren>shangren
shangren=input('
< br>输入商人数目
:');
puren=input('<
/p>
输入仆人数目
:');
ronglia
ng=input('
输入船的最大容量
:');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
决
策
生成
jc=1;
%
决策向量放在矩阵
d
中,
jc
为插入新元素的行
标初始为
1
;
for i=0:rongliang
for
j=0:rongliang
if (i+j<=rongliang)&(i+j>0)
% <
/p>
满足条
D={(u,v)|1<=u+v<=rongliang
,u,v=0,1,2}
d(jc,1:3)=[i,j ,1];
%
生成一个决策向量立刻扩充为三维;
d(jc+1,1:3)=[-i,-j,-1];
%
同时生成他的负向量;
jc=jc+2;
%
<
/p>
由于生成两个决策向量,则
jc
要向下移
动两个;
end
end
j=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
状态数
组生成
kx=1;
% <
/p>
状态向量放在
A
矩阵中,生成方法同矩阵
生成;
for
i=shangren:-1:0
for
j=puren:-1:0
if
((i>=j)&((sha
ngren-i)>=(puren-j)))|((i==0)|(i==shangren))
%
(i
>=j)&((shangren-i)>=(puren-j)))|((i==0)|(i==shangr
en))
为可以存在的状态的约束条件
A(kx,1:3)=[i,j,1];
%
生成状态数组集合
D `
A(kx+1,1:3)=[i,j,0];
kx=kx+2;
end
end