(完整word版)传教士野人过河问题-两种解法思路

实验 传教士野人过河问题

37030602 王世婷

一、实验问题

传教士和食人者问题(The Missionaries and Cannibals Problem )。在河的左岸有3个传教士、1条船和3个食人者,传教士们想用这条船将所有的成员运过河去,但是受到以下条件的限制:(1)传教士和食人者都会划船,但船一次最多只能装运两个;(2)在任何岸边食人者数目都不得超过传教士,否则传教士就会遭遇危险:被食人者攻击甚至被吃掉。此外,假定食人者会服从任何一种过河安排,试规划出一个确保全部成员安全过河的计划。

二、解答步骤

(1) 设置状态变量并确定值域

M 为传教士人数,C 为野人人数,B 为船数,要求M>=C 且M+C <= 3,L 表示左岸,R 表示右岸。 初始状态 目标状态

L R L R

M 3 0 M 0 3

C 3 0 C 0 3

B 1 0 B 0 1

(2) 确定状态组,分别列出初始状态集和目标状态集

用三元组来表示f S :(ML , CL , BL )(均为左岸状态)

其中03,03ML CL ≤≤≤≤,BL ∈{ 0 , 1}

0S :(3 , 3 , 1) g S : (0 , 0 , 0)

初始状态表示全部成员在河的的左岸;

目标状态表示全部成员从河的左岸全部渡河完毕。

(3) 定义并确定规则集合

仍然以河的左岸为基点来考虑,把船从左岸划向右岸定义为Pij 操作。其中,第一下标i 表示船载的传教士数,第二下标j 表示船载的食人者数;同理,从右岸将船划回左岸称之为Qij 操作,下标的定义同前。则共有10种操作,操作集为

F={P01,P10,P11,P02,P20,Q01,Q10,Q11,Q02,Q20}

P 10 if ( ML ,CL , BL=1 ) then ( ML –1 , CL , BL –1 )

P 01 if ( ML ,CL , BL=1 ) then ( ML , CL –1 , BL –1 )

P 11 if ( ML ,CL , BL=1 ) then ( ML –1 , CL –1 , BL –1 )

P 20 if ( ML ,CL , BL=1 ) then ( ML –2 , CL , BL –1 )

P 02 if ( ML ,CL , BL=1 ) then ( ML , CL –2 , BL –1 )

Q 10 if ( ML ,CL , BL=0 ) then ( ML+1 , CL , BL+1 )

Q 01 if ( ML ,CL , BL=0 ) then ( ML , CL+1 , BL +1 )

Q 11 if ( ML ,CL , BL=0 ) then ( ML+1 , CL +1, BL +1 )

Q20 if ( ML ,CL , BL=0 ) then ( ML+2 , CL +2, BL +1 )

Q02if ( ML ,CL , BL=0 ) then ( ML , CL +2, BL +1 )

(4)当状态数量不是很大时,画出合理的状态空间图

图1 状态空间图

箭头旁边所标的数字表示了P或Q操作的下标,即分别表示船载的传教士数和食人者数。

三、算法设计

方法一: 树的遍历

根据规则由根(初始状态)扩展出整颗树,检测每个结点的“可扩展标记”,为“-1”的即目标结点。由目标结点上溯出路径。

见源程序1。

方法二:启发式搜索构造启发式函数为:

6.01

-ML CL

f

--

=⎨

满足规则时

其它

选择较大值的结点先扩展。

见源程序2。

四、实验结果

方法一的实验结果:

传教士野人过河问题

第1种方法:

第1次:左岸到右岸,传教士过去1人,野人过去1人第2次:右岸到左岸,传教士过去1人,野人过去0人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人第7次:左岸到右岸,传教士过去2人,野人过去0人第8次:右岸到左岸,传教士过去0人,野人过去1人第9次:左岸到右岸,传教士过去0人,野人过去2人第10次:右岸到左岸,传教士过去0人,野人过去1人第11次:左岸到右岸,传教士过去0人,野人过去2人

第2种方法:

第1次:左岸到右岸,传教士过去1人,野人过去1人第2次:右岸到左岸,传教士过去1人,野人过去0人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人第7次:左岸到右岸,传教士过去2人,野人过去0人第8次:右岸到左岸,传教士过去0人,野人过去1人第9次:左岸到右岸,传教士过去0人,野人过去2人第10次:右岸到左岸,传教士过去1人,野人过去0人第11次:左岸到右岸,传教士过去1人,野人过去1人

第3种方法:

第1次:左岸到右岸,传教士过去0人,野人过去2人第2次:右岸到左岸,传教士过去0人,野人过去1人第3次:左岸到右岸,传教士过去0人,野人过去2人第4次:右岸到左岸,传教士过去0人,野人过去1人第5次:左岸到右岸,传教士过去2人,野人过去0人第6次:右岸到左岸,传教士过去1人,野人过去1人

第7次:左岸到右岸,传教士过去2人,野人过去0人

第8次:右岸到左岸,传教士过去0人,野人过去1人

第9次:左岸到右岸,传教士过去0人,野人过去2人

第10次:右岸到左岸,传教士过去0人,野人过去1人

第11次:左岸到右岸,传教士过去0人,野人过去2人

第4种方法:

第1次:左岸到右岸,传教士过去0人,野人过去2人

第2次:右岸到左岸,传教士过去0人,野人过去1人

第3次:左岸到右岸,传教士过去0人,野人过去2人

第4次:右岸到左岸,传教士过去0人,野人过去1人

第5次:左岸到右岸,传教士过去2人,野人过去0人

第6次:右岸到左岸,传教士过去1人,野人过去1人

第7次:左岸到右岸,传教士过去2人,野人过去0人

第8次:右岸到左岸,传教士过去0人,野人过去1人

第9次:左岸到右岸,传教士过去0人,野人过去2人

第10次:右岸到左岸,传教士过去1人,野人过去0人

第11次:左岸到右岸,传教士过去1人,野人过去1人

方法二的实验结果:

传教士野人过河问题

方法如下

第1次:左岸到右岸,传教士过去1人,野人过去1人 l:2r,2y r:1r,1y 第2次:右岸到左岸,传教士过去1人,野人过去0人 l:3r,2y r:0r,1y 第3次:左岸到右岸,传教士过去0人,野人过去2人 l:3r,0y r:0r,3y 第4次:右岸到左岸,传教士过去0人,野人过去1人 l:3r,1y r:0r,2y 第5次:左岸到右岸,传教士过去2人,野人过去0人 l:1r,1y r:2r,2y 第6次:右岸到左岸,传教士过去1人,野人过去1人 l:2r,2y r:1r,1y 第7次:左岸到右岸,传教士过去2人,野人过去0人 l:0r,2y r:3r,1y 第8次:右岸到左岸,传教士过去0人,野人过去1人 l:0r,3y r:3r,0y 第9次:左岸到右岸,传教士过去0人,野人过去2人 l:0r,1y r:3r,2y 第10次:右岸到左岸,传教士过去0人,野人过去1人 l:0r,2y r:3r,1y 第11次:左岸到右岸,传教士过去0人,野人过去2人 l:0r,0y r:3r,3y 问题结束

由结果可以看出,方法二的结果为方法一的第一种结果,两者具有一致性。

五、总结与教训:

最开始时采用的方法为:用向量0123456{,,,,,,}A X X X X X X X 表示状态,其中02~X X 表示三个传教士的位置,35~X X 表示三个野人的位置,6X 表示船的位置。0表示在河左岸,1表示已渡过了河,在河右岸。

设初始状态和目标状态分别为:

0:{0,0,0,0,0,0,0}S S =

:{1,1,1,1,1,1,1}g G S =

但在描述规则时发现这样定义会造成规则麻烦、不清晰,原因在于此题并不关心是哪几个传教士和野人在船上,仅关心其人数,故没有必要将每个人都设置变量,分别将传教士、野人、船作为一类即可。

四、源代码

1. 源程序1:树的遍历

%野人和传教士过河问题

%date:2010/12/14

%author:wang shi ting

function [ ]=guohe()

clear all;

close all;

global n node;

n=2;

solveNum=1; %问题的解法

result=zeros(100,1);

node=zeros(300,5);

node(1,:)=[3,3,1,1,-1];%初始化

%1左岸传教士数 2左岸野人数 3船(1为左岸,0为右岸)

%4是否可扩展(1为可扩展) 5父节点号(-1表示无父节点,即为初始节点) j=1;

% for j=1:n

while (1)

if j>n

break

end

if node(j,4)==1 %判断结点是否可扩展

if node(j,3)==1 %船在左岸

if ( (node(j,1)==0) || (node(j,1)==3) )&&(node(j,2)>=1) forward(j,0,1);

end

if (node(j,1)==1 && node(j,2)==1 || node(j,1)==3 && node(j,2)==2) forward(j,1,0);

end

if (node(j,1)>=1 && node(j,1)==node(j,2))

forward(j,1,1);

end

if (node(j,1)==0 || node(j,1)==3)&& node(j,2)>=2

forward(j,0,2);

end

if (node(j,1)==2 && node(j,2)==2 || node(j,1)==3 && node(j,2)==1) forward(j,2,0);

end

elseif node(j,3)==0%船在右岸

if ( (node(j,1)==0) || (node(j,1)==3) )&&(node(j,2)<=2)

afterward(j,0,1);

end

if (node(j,1)==2 && node(j,2)==2 || node(j,1)==0 && node(j,2)==1) afterward(j,1,0);

end

if (node(j,1)<=2 && node(j,1)==node(j,2))

afterward(j,1,1);

end

if (node(j,1)==0 || node(j,1)==3)&& node(j,2)<=1

afterward(j,0,2);

end

if (node(j,1)==1 && node(j,2)==1 || node(j,1)==0 && node(j,2)==2) afterward(j,2,0);

end

end

end

j=j+1;

end

fprintf('传教士野人过河问题\n');

for t=1:n

j=1;

k=t;

StepNum=1;

if node(k,4)==-1

while (k~=-1)

result(j)=k;

k=node(k,5);

j=j+1;

end

j=j-1;

fprintf('第%d种方法:\n',solveNum);

while j>1

BoatPriNum=node(result(j),1)-node(result(j-1),1);

BoatWildNum=node(result(j),2)-node(result(j-1),2);

if node(result(j),3)==1

fprintf('第%d次:左岸到右岸,传教士过去%d人,野人过去%d人\n',...

StepNum,abs(BoatPriNum),abs(BoatWildNum));

StepNum=StepNum+1;

end

if node(result(j),3)==0

fprintf('第%d次:右岸到左岸,传教士过去%d人,野人过去%d人\n',...

StepNum,abs(BoatPriNum),abs(BoatWildNum));

StepNum=StepNum+1;

end

j=j-1;

end

pause(0.2);

fprintf('\n');

solveNum=solveNum+1;

end

end

fprintf('问题结束');

%%

%从左岸到右岸,船上传教士x个,野人y个

function []=forward(z,x,y)

global n;

global node;

node(n,1)=node(z,1)-x;

node(n,2)=node(z,2)-y;

node(n,3)=0;

r=search(z);

if(~r)

return

end

node(z,4)=0;

node(n,4)=1;

node(n,5)=z;

s=destination();

if s

node(n,4)=-1;

end

n=n+1;

%%

%%从右岸到左岸,船上传教士x个,野人y个

function []=afterward(z,x,y)

global n;

global node;

node(n,1)=node(z,1)+x;

node(n,2)=node(z,2)+y;

node(n,3)=1;

r=search(z);

if(~r)

return

end

node(z,4)=0;

node(n,4)=1;

node(n,5)=z;

s=destination();

if s

node(n,4)=-1;

end

n=n+1;

%%

function r=search(x)

global n node;

i=x;

while node(i,5)~=-1

if node(i,1)==node(n,1) && node(i,2)==node(n,2) && node(i,3)==node(n,3) r=0;

return

end

i=node(i,5);

end

%跟初始节点比较

if node(i,1)==node(n,1) && node(i,2)==node(n,2) && node(i,3)==node(n,3)

r=0;

return

end

r=1;%均不相同

%%

function s=destination()

global n node;

if node(n,1)==0 && node(n,2)==0 && node(n,3)==0

s=1;

return

end

s=0;

2. 运用启发式函数

%%

%野人和传教士过河问题

%date:2010/12/15

%author:wang shi ting

function [ ]=guohe()

clear all;

close all;

global n node open_list index;

n=2;

result=zeros(100,1);

node=zeros(100,5);

node(1,:)=[3,3,1,1,-1];%初始化

%1左岸传教士数 2左岸野人数 3船(1为左岸,0为右岸)

%4是否可扩展(1为可扩展) 5父节点号(-1表示无父节点,即为初始节点)

index=1;

open_list=[1,0.01];%节点号启发函数值

while (1)

[row,~]=size(open_list);

if row==0

fprintf('all the nodes in open list have been expanded.');

return

end

for i1=1:row

open_list(i1,2)=6.01-node(open_list(i1,1),1)-node(open_list(i1,1),2);%定义启发函数

if node(open_list(i1,1),4)==-1%如果该结点是目标结点,则打印结果

fprintf('传教士野人过河问题\n');

j=1;

k=open_list(i1,1);

StepNum=1;

while (k~=-1)

result(j)=k;

k=node(k,5);

j=j+1;

end

j=j-1;

fprintf('方法如下\n');

while j>1

BoatPriNum=node(result(j),1)-node(result(j-1),1);

BoatWildNum=node(result(j),2)-node(result(j-1),2);

if node(result(j),3)==1

fprintf('第%d次:左岸到右岸,传教士过去%d人,野人过去%d人\n',...

StepNum,abs(BoatPriNum),abs(BoatWildNum));

StepNum=StepNum+1;

end

if node(result(j),3)==0

fprintf('第%d次:右岸到左岸,传教士过去%d人,野人过去%d人\n',...

StepNum,abs(BoatPriNum),abs(BoatWildNum));

StepNum=StepNum+1;

end

j=j-1;

end

pause(0.2);

fprintf('问题结束\n');

return

end

end

[r_row,~,~]=find(open_list(:,2)==max(open_list(:,2)));

j=open_list(r_row(1,1),1);

if node(j,3)==1 %船在左岸

if ( (node(j,1)==0) || (node(j,1)==3) )&&(node(j,2)>=1)

forward(j,0,1);

end

if (node(j,1)==1 && node(j,2)==1 || node(j,1)==3 && node(j,2)==2) forward(j,1,0);

end

if (node(j,1)>=1 && node(j,1)==node(j,2))

forward(j,1,1);

end

if (node(j,1)==0 || node(j,1)==3)&& node(j,2)>=2

forward(j,0,2);

end

if (node(j,1)==2 && node(j,2)==2 || node(j,1)==3 && node(j,2)==1) forward(j,2,0);

end

elseif node(j,3)==0%船在右岸

if ( (node(j,1)==0) || (node(j,1)==3) )&&(node(j,2)<=2)

afterward(j,0,1);

end

if (node(j,1)==2 && node(j,2)==2 || node(j,1)==0 && node(j,2)==1) afterward(j,1,0);

end

if (node(j,1)<=2 && node(j,1)==node(j,2))

afterward(j,1,1);

end

if (node(j,1)==0 || node(j,1)==3)&& node(j,2)<=1

afterward(j,0,2);

end

if (node(j,1)==1 && node(j,2)==1 || node(j,1)==0 && node(j,2)==2) afterward(j,2,0);

end

end

%display(open_list);

open_list(r_row(1),:)=[ ];

index=index-1;%open表个数减1

%display(open_list);

end

%%

%从左岸到右岸,船上传教士x个,野人y个

function []=forward(z,x,y)

global n;

global node open_list index;

node(n,1)=node(z,1)-x;

node(n,2)=node(z,2)-y;

node(n,3)=0;

r=search(z);

if(~r)

return

end

node(z,4)=0;

node(n,4)=1;

node(n,5)=z;

s=destination();

if s

node(n,4)=-1;

end

index=index+1;

open_list(index,1)=n;

n=n+1;

%%

%%从右岸到左岸,船上传教士x个,野人y个

function []=afterward(z,x,y)

global n;

global node open_list index;

node(n,1)=node(z,1)+x;

node(n,2)=node(z,2)+y;

node(n,3)=1;

r=search(z);

if(~r)

return

end

node(z,4)=0;

node(n,4)=1;

node(n,5)=z;

s=destination();

if s

node(n,4)=-1;

end

index=index+1;

open_list(index,1)=n;

n=n+1;

%%

function r=search(x)

global n node;

i=x;

while node(i,5)~=-1

if node(i,1)==node(n,1) && node(i,2)==node(n,2) && node(i,3)==node(n,3) r=0;

return

end

i=node(i,5);

end

%跟初始节点比较

if node(i,1)==node(n,1) && node(i,2)==node(n,2) && node(i,3)==node(n,3) r=0;

return

end

r=1;%均不相同

%%

function s=destination()

global n node;

if node(n,1)==0 && node(n,2)==0 && node(n,3)==0

s=1;

return

end

s=0;

(完整word版)传教士野人过河问题-两种解法思路

实验 传教士野人过河问题 37030602 王世婷 一、实验问题 传教士和食人者问题(The Missionaries and Cannibals Problem )。在河的左岸有3个传教士、1条船和3个食人者,传教士们想用这条船将所有的成员运过河去,但是受到以下条件的限制:(1)传教士和食人者都会划船,但船一次最多只能装运两个;(2)在任何岸边食人者数目都不得超过传教士,否则传教士就会遭遇危险:被食人者攻击甚至被吃掉。此外,假定食人者会服从任何一种过河安排,试规划出一个确保全部成员安全过河的计划。 二、解答步骤 (1) 设置状态变量并确定值域 M 为传教士人数,C 为野人人数,B 为船数,要求M>=C 且M+C <= 3,L 表示左岸,R 表示右岸。 初始状态 目标状态 L R L R M 3 0 M 0 3 C 3 0 C 0 3 B 1 0 B 0 1 (2) 确定状态组,分别列出初始状态集和目标状态集 用三元组来表示f S :(ML , CL , BL )(均为左岸状态) 其中03,03ML CL ≤≤≤≤,BL ∈{ 0 , 1} 0S :(3 , 3 , 1) g S : (0 , 0 , 0) 初始状态表示全部成员在河的的左岸; 目标状态表示全部成员从河的左岸全部渡河完毕。 (3) 定义并确定规则集合 仍然以河的左岸为基点来考虑,把船从左岸划向右岸定义为Pij 操作。其中,第一下标i 表示船载的传教士数,第二下标j 表示船载的食人者数;同理,从右岸将船划回左岸称之为Qij 操作,下标的定义同前。则共有10种操作,操作集为 F={P01,P10,P11,P02,P20,Q01,Q10,Q11,Q02,Q20} P 10 if ( ML ,CL , BL=1 ) then ( ML –1 , CL , BL –1 ) P 01 if ( ML ,CL , BL=1 ) then ( ML , CL –1 , BL –1 ) P 11 if ( ML ,CL , BL=1 ) then ( ML –1 , CL –1 , BL –1 ) P 20 if ( ML ,CL , BL=1 ) then ( ML –2 , CL , BL –1 ) P 02 if ( ML ,CL , BL=1 ) then ( ML , CL –2 , BL –1 ) Q 10 if ( ML ,CL , BL=0 ) then ( ML+1 , CL , BL+1 ) Q 01 if ( ML ,CL , BL=0 ) then ( ML , CL+1 , BL +1 ) Q 11 if ( ML ,CL , BL=0 ) then ( ML+1 , CL +1, BL +1 )

2020山西省中考数学试题(word版,含答案)(共3套)

山西省中考数学试题(一) 第I 卷 选择题(共30分) 一、选择题(本大题共10个小题,每小题3分,共30分。在每个小题给出的四个选项中,只有一项符合题目要求,请选出并在答题卡上将该选项涂黑) 1.将 -3+(-1)的结果是( )。 A. 2 B. -2 C. 4 D. -4 2.下列运算错误的是( ) 241642121y x x =-++ A. 0112??= ??? B.2242x x x += C. a a =- D.3326b b a a ??= ??? 3.晋商大院的许多窗格图案蕴含着对称之美,现从中选取以下四种窗格图案,其中是中心称图形但是不是轴对称图形的是( ) 4.如图,在△ABC 中,点D,E 分别是边AB,BC 的中点,若 △DBE 的周长是6,则△的周长是( )。 A.8 B.10 C.12 D.14 5.我们解一元二次方程2 360x x -=时,可以运用因式分解法,将 此方程化为3(2)0x x -=,从而得到两个一元一次方程:30x = 或20x -=,进而得道原方程的解为120,2x x ==。这种解法体现 的数学思想是( )。 A.转化思想 B.函数思想 C.数形结合思想 D.公理化思想 6.如图,直线a ∥b ,一块含60°角的直角三角板ABC (∠A=60°)按 如图所示放置。若∠1=55°,则∠2的度数为( ) A.105° B.110° C.115° D.120° 7.化简22222a ab b b a b a b ++---的结果是( ) A.a a b - B.b a b - C.a a b + D.b a b +

2019年管理类MBA综合考试数学真题及详细答案解析(word版)

2019年管理类MBA综合考试数学真题及详细答案解析 一、问题求解:第1~15小题,每小题3分,共45分。下列每题给出A、B、C、D、E 五个选项中,只有一项是符合试题要求的。请在答题卡上将所选项字母涂黑。 1. 学科竞赛设一等奖、二等奖和三等奖,比例为1:3:8,获奖率为30%,已知10人获得一等奖,则参加竞赛的人数为() A.300 B. 400 C. 500 D. 550 E. 600 解析:(B)解法1:由一等奖:二等奖:三等奖=1:3:8,且一等奖10人,可推出二等奖、三等奖分别为30人和80人,所以获奖人数为10+30+80=120人,所以参加竞赛人数为12030%=400 ÷人。 解法2:设参加竞赛的人数为x,根据题意有 1 30%10400 138 x x =?= ++ g g。 2. 为了解某公司员工的年龄结构,按男、女人数的比例进行了随机抽样,结果如下: A. 32, 30 B. 32, 29.5 C. 32, 27 D. 30, 27 E. 29.5, 27 解析:(A) 23+26+28+30+32+34+36+38+41 ==32 9 x 男 23+25+27+27+29+31 ==27 6 x 女 329+276 ==30 15 x ?? 总 3. 某单位采取分段收费的方式收取网络流量(单位: GB)费用,每月流量20(含)以内免费,流量20到30(含)的每GB收费1元,流量30到40(含)的每GB收费3元,流量40以上的每GB收费5元,小王这个月用了45GB的流量,则他应该交费() A. 45元 B. 65元 C. 75元 D. 85元 E. 135元 解析:(B)各个流量段所需缴费数额见下表: 所以小王应该缴费0+10+30+25=65元。

(完整word版)专题:阿氏圆与线段和最值问题(含答案),推荐文档

专题:阿氏圆与线段和最值问题 以阿氏圆(阿波罗尼斯圆)为背景的几何问题近年来在中考数学中经常出现,对于此类问题的归纳和剖析显得非常重要. 具体内容如下: 阿氏圆定理(全称:阿波罗尼斯圆定理),具体的描述:一动点P 到两定点A 、 B 的距离之比等于定比n m (≠1),则P 点的轨迹,是以定比n m 内分和外分定线段 AB 的两个分点的连线为直径的圆.这个轨迹最先由古希腊数学家阿波罗尼斯发现,该圆称为阿波罗尼斯圆,简称阿氏圆. 定理读起来和理解起来比较枯燥,阿氏圆题型也就是大家经常见到的PA+kPB ,(k ≠1)P 点的运动轨迹是圆或者圆弧的题型. PA+kPB,(k ≠1)P 点的运动轨迹是圆或圆弧的题型 阿氏圆基本解法:构造母子三角形相似 例题1、问题提出:如图1,在Rt △ABC 中,∠ACB =90°,CB =4,CA =6,⊙C 半径为2,P 为圆上一动点,连结AP 、BP ,求AP +BP 的最小值. (1)尝试解决:为了解决这个问题,下面给出一种解题思路:如图2,连接CP ,在CB 上取点D ,使CD =1,则有 = =,又∵∠PCD =∠BCP ,∴△PCD ∽△BCP .∴ =,∴PD =BP ,∴AP +BP =AP +PD . 请你完成余下的思考,并直接写出答案:AP +BP 的最小值为 . (2)自主探索:在“问题提出”的条件不变的情况下,AP +BP 的最小值为 . (3)拓展延伸:已知扇形COD 中,∠COD =90°,OC =6,OA =3,OB =5,点P 是上一点,求2P A +PB 的最小值. 【分析】(1)利用勾股定理即可求出,最小值为AD = ;

小学教育心理学《当代教育心理学》第九章 问题解决的学习与创造性

第九章问题解决的学习与创造性 教学目标:使学生掌握问题与问题解决的含义、过程,了解问题解决能力的训练方法。掌握创造性的含义与心理结构,理解如何培养的创造性思维。 教学重点、难点:重点是创造性思维;难点是问题解决的训练。 教学过程: 问题解决是一种重要的思维活动,它在人们的实际生活中占有突出地位。关于问题解决的学说有联想理论和格式塔理论。本世纪50年代认知心理学兴起后,出现了新的转折。认知心理学从信息加工观点出发,将人看作主动的信息加工者,将问题解决看作是对问题空间的搜索,并用计算机来模拟人的问题解决过程,以此来检验和进一步发展对人的问题解决的研究。 第一节问题与问题解决 一、问题及其分类 1.问题的界定多数心理学家都认为,所有的问题都含3个基本的成分:给定、目标和障碍。 第一,给定成分:一组已知的关于问题条件与问题情境的描述,即间题的起始状态。 第二,目标成分:关于问题结论的描述,即问题所要求的答案,也就是问题的目标状态。 第三,障碍成分:从问题的起始状态到问题的目标状态之间的中介状态与各个步骤。 2.问题的分类 (1)结构良好问题 结构良好问题有二个基本特征。第一,问题的明确性。第二,解法的确定性。在结构良好问题中,有一类问题被称为“谜题”(puzzle problems),这是较早的研究问题解决的认知心理学家所采用的问题。 学校情境中的结构良好问题一般都是与一定的知识领域相联系的。是指对问题的起始状态和目标状态都作了明确规定,并最终会有一个正确答案的问题。这种类型的问题在其初始状态、目标状态、可能操作和解决问题过程中的算子都是清楚的。明确限定性问题一般有三种类型:归类结构问题、转换问题和重新排列问题。 归纳结构问题给予几个成分,而问题解决者必须发现隐含再这些成分中的结构形式。例如:类推问题 转换问题给予一个最初的状态,而问题解决者必须发现一系列到目标状态的操作。例如:著名的河内塔问题,传教士与野人过河问题,水罐问题等常见于研究的问题。 根据一个古老的故事,在远东的某处有一个寺院,里面有一堆六十四个由大到小纯金打造的盘子。有一回,这些盘子被迭在一起,最大的盘子放在最底层。每一个盘子被穿了一个孔,放在宝石的针上。它们可以根据底下的规则由一个位置搬移到另外一个位置: ◎一次只能移动一个盘子。 ◎大盘子永远不能放在小盘子的上面。 ◎这一迭盘子可以藉由另外一个外加的暂时位置从某个位置移到另外一个位置。当这个"河内塔"从某个位置全部被搬到另外一个位置时,世界末日就会降临!

传教士问题

一.问题描述 有M个传教士和N个野人来到河边准备渡河,河岸有一条船,每次至多可供k人乘渡。任何时刻在河的两岸以及船上的野人数目总是不超过传教士的数目。二.问题分析 本问题采用A*算法求解,解答的关键与难点如下: 1.评估函数的建立。评估函数为f=h+d=M+N-2*B+d.。 M表示左岸的传教士的人数,N表示左岸野人的数目,B取值为0或1 。1表示船在左岸,0 表示船在右岸。d 表示节点的深度。 下面我们来证明h(n)=M+C-2B是满足A*条件的。 我们分两种情况考虑。先考虑船在左岸的情况。如果不考虑限制条件,也就是说,船一次可以将三人从左岸运到右岸,然后再有一个人将船送回来。这样,船一个来回可以运过河2人,而船仍然在左岸。而最后剩下的三个人,则可以一次将他们全部从左岸运到右岸。所以,在不考虑限制条件的情况下,也至少需要摆渡[(M+N-3)/2]*2+1次。其中分子上的"-3"表示剩下三个留待最后一次运过去。除以"2"是因为一个来回可以运过去2人,需要[(M+N-3)/2]个来回,而"来回"数不能是小数,需要向上取整,这个用符号[ ]表示。而乘以"2"是因为一个来回相当于两次摆渡,所以要乘以2。而最后的"+1",则表示将剩下的3个运过去,需要一次摆渡。 化简有:M+N-2。 再考虑船在右岸的情况。同样不考虑限制条件。船在右岸,需要一个人将船运到左岸。因此对于状态(M,N,0)来说,其所需要的最少摆渡数,相当于船在左岸时状态(M+1,N,1)或(M,N+1,1)所需要的最少摆渡数,再加上第一次将船从右岸送到左岸的一次摆渡数。因此所需要的最少摆渡数为:(M+N+1)-2+1。其中(M+N+1)的"+1"表示送船回到左岸的那个人,而最后边的"+1",表示送船到左岸时的一次摆渡。 化简有:(M+N+1)-2+1=M+N。 综合船在左岸和船在右岸两种情况下,所需要的最少摆渡次数用一个式子表示为:M+N-2B。其中B=1表示船在左岸,B=0表示船在右岸。 由于该摆渡次数是在不考虑限制条件下,推出的最少所需要的摆渡次数......

传教士与野人过河问题

贵州航天职业技术学院《C语言程序设计》 系别: __计算机科学系 _________ 班级: __10级软件技术_________ 姓名: _______________________ 指导教师: ___陆树芬_______________ 小组成员: ___翟奇张源李雪_______

前言 C语言作为一门最通用的语言,在过去很流行,将来依然会如此。几乎每一个理工科或者其他专业的学生毫不例外地要学习它。从C 语言产生到现在,它已经成为最重要和最流行的编程语言之一。在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C 语言基本相同。学习、掌握C语言是每一个计算机技术人员的基本功之一。C语言具有高级语言的强大功能,却又有很多直接操作计算机硬件的功能(这些都是汇编语言的功能),因此,C语言通常又被称为中级语言。学习和掌握C语言,既可以增进对于计算机底层工作机制的了解,又为进一步学习其他高级语言打下了坚实的基础。本大作业是对学生在课堂上所学知识的一次综合检测。通过本次大作业的制作,应能综合使用在《C语言程序设计》课程中学到的多种基础知识,并可以很好的应用到实际操作中去,具备简单的项目设计能力。 本大作业主要以传教士和野人怎样从河的一岸完全渡到另一岸,而不发生野人吃掉传教士这一问题展开,主要使用C语言中的链表应用完成程序的设计,将此次程序设计报告分为以下几点: 1. 问题的描述:描述本程序的设计内容; 2. 问题分析:介绍此程序设计的结构和算法分析 3. 程序设计流程图 4. 程序各个功能模块的实现

5. 程序运行结果:将各种情况下的运行结果通过屏幕截取下来 6. 程序设计结论:描述本次程序设计的一些体会和在程序设计过 程中所获得的一些知识以及本次程序设计所存在的不足和缺陷。 7. 完成本次程序设计所翻阅的资料

2020东北师大《认知心理学》离线作业考核参考答案

《认知心理学》离线作业考核 学号:18035012916008 丁乘风 一、分析判断(每题5分,共25分) 1、平行分布处理模型的基本思想是,通过使用一个处理单元或处理器,在同 一时间内实现众多的信息处理。 答:错误。平行分布处理模型的基本思想是,通过使用数量众多且独立的处理单元或处理器,在同一时间内实现众多的信息处理。 2、我们上课或看电视时的聚精会神属于持续性注意。 答:正确。持续性注意是指注意在一定时间内保持在某个认识客体或活动上,也叫注意的稳定性。而“我们上课或看电视时的聚精会神”正体现了这个特点。 3、模式识别是将刺激模式与头脑中已有的表征进行匹配的过程。 答:正确。因为模式识别是指:将刺激模式与头脑中已有的表征相匹配,从而达到一个确认的模式的过程,或者说运用记忆中已经贮存的信息对当前出现的刺激模式做出有效解释的过程。 4、外显记忆测验要求材料驱动加工。 答:正确。外显记忆测验是指要求被试有意识地回忆在实验的先前阶段所学习过的材料的测验,要求材料驱动加工。

5、关于言语理解过程的相互作用模型认为言语理解只存在自上而下的加工。答:错误。相互作用模型是一种言语理解模型,它认为各种水平的加工以复杂的方式发生相互作用,信息并不总是朝着一个方向流动,而且一些加工水平是可以相互重叠的。 二、论述题(每题15分,共60分) 1、关于知觉现象中的结构优势效应有哪些理论?结构优势效应实验中的影响 因素又有哪些? 答:关于知觉现象中的结构优势效应理论有:字词优势效应、客体优势效应、构型优势效应、字母优势效应和句子优势效应。 字词优势效应(Word-Superiority Effect):识别字词中字母的正确率>识别一个单独的同一字母。 客体优势效应(Object-Supriotity Effect):识别一个客体图形中的线段正确率>识别结构不严的图形中同一线段或单独该线段。 构型优势效应(Configural-Superiority Effect):识别一个完整的图形>识别图形的一部分。 字母优势效应(Letter-Superiority Effect):识别字母中的一个组成线段>识别单独的该线段。 句子优势效应(Tulving,Mandler,Baumal):在一个句子中识别一个词优于识别单个的该词。 结构优势效应实验中的影响因素有:字词、图形等各种形式、可以在字母、字词和句子等不同水平上出现、涉及信息的编码方式和各种加工过程。

C++实现传教士与野人过河问题实验报告

传教士与野人过河问题实验报告 1 问题定义 河的两岸有三个传教士和三个野人需要过河,目前只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会被野人攻击,怎么找出一种安全的渡河方案呢? 2 算法分析 首先,先来看看问题的初始状态和目标状态,定义河的两岸分别为左岸和右岸,设定状态集合为(左岸传教士人数,右岸野人数,右岸传教士人数,右岸野人数,船的位置),船的位置:-1表示船在左岸,1表示船在右岸。 初始状态:(3,3,0,0,0,-1) 目标状态:(0,0,3,3,1) 然后,整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。问题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说的算符,根据题目要求,可以得出以下5个算符(按照渡船方向的不同,也可以理解为10个算符): 渡1野人、渡1传教士、渡1野人1传教士、渡2野人、渡2传教士根据船的位置,向左移或向右移通过递归依次执行5种算符,判断是否找到所求,并排除不符合实际的状态,就可以找到所有可能的解,如图1所示为递归函数流程图。 数据结构方面采用如下所示的结构体存储当前传教士、野人、船三者的状态。struct riverSides { int churchL;//左岸传教士数 int wildL;//左岸野人数 int churchR; //右岸传教士数 int wildR; //右岸野人数 int boat;//船的位置,-1在左岸,1在右岸 };

图 1 传教士与野人过河递归函数流程图

3 编程实现 程序使用C++实现,具体代码如下: #include #include #include using namespace std; struct riverSides { int churchL;//左岸传教士数 int wildL;//左岸野人数 int churchR; //右岸传教士数 int wildR; //右岸野人数 int boat;//船的位置,-1在左岸,1在右岸 }; int mycount = 0;//统计成功过河次数 int CvsWdfs(riverSides lastcurrentState, vector lastParameters, vector operation, int ifboacurrentStatety) { if (lastcurrentState.churchR == 3 && lastcurrentState.wildR == 3) { mycount++; cout << "第" << mycount << "次成功过河" << endl; cout << "传教士野人 | 移动方向" << endl; for (int i = 0; i < operation.size(); i++) { cout << operation[i] << endl; } cout << endl; return 0; } //判断过河操作否重复,去除死循环 for (int i = 0; i < lastParameters.size() - 1; i++) { if(lastParameters[i].wildL == lastcurrentState.wildL&&lastParameters[i].churchL == lastcurrentState.churchL) { if (lastcurrentState.boat == lastParameters[i].boat) return 0; }

传教士和野人渡河问题

传教士和野人渡河问题 刘宪国050422023 野人过河问题描述如下:有三个传教士和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会有危险. 一、算法分析 先来看看问题的初始状态和目标状态,假设分为甲岸和乙岸: 初始状态:甲岸,3野人,3传教士;乙岸,0野人,0传教士;船停在甲岸,船上有0个人; 目标状态:甲岸,0野人,0传教士;乙岸,3野人,3传教士;船停在乙岸,船上有0个人; 整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。问题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说的算符,根据题目要求,可以得出以下5个算符(按照渡船方向的不同,也可以理解为10个算符):渡1野人、渡1传教士、渡1野人1传教士、渡2野人、渡2传教士。 算符知道以后,剩下的核心问题就是搜索方法了,本文采用深度优先搜索,通过一个FindNext(…)函数找出下一步可以进行的渡河操作中的最优操作,如果没有找到则返回其父节点,看看是否有其它兄弟节点可以扩展,然后用Process(…)函数递规调用FindNext(…),一级一级的向后扩展。 搜索中采用的一些规则如下: 1、渡船优先规则:甲岸一次运走的人越多越好(即甲岸运多人优先),同时野人优先运走;乙岸一次运走的人越少越好(即乙岸运少人优先),同时传教士优先运走; 2、不能重复上次渡船操作(通过链表中前一操作比较),避免进入死循环; 3、任何时候河两边的野人和传教士数均分别大于等于0且小于等于3; 4、由于只是找出最优解,所以当找到某一算符(当前最优先的)满足操作条件后,不再搜索其兄弟节点,而是直接载入链表。 5、若扩展某节点a的时候,没有找到合适的子节点,则从链表中返回节点a的父节点b,从上次已经选择了的算符之后的算符中找最优先的算符继续扩展b。 二、基本数据结构 定义如下几个数据结构: typedef struct _riverside{ // 岸边状态类型 int wildMan; // 野人数 int churchMan; // 传教士数 }RIVERSIDE; typedef struct _boat{ // 船的状态类型 int wildMan; // 野人数 int churchMan; // 传教士数 }BOAT; typedef struct _question{ // 整个问题状态

(word完整版)娟娟老师鸡兔同笼问题解题思路解法及公式

鸡兔同笼 例题1.笼子里有若干只鸡和兔。从上面数,有8个头,从下面数,有26只脚.鸡和兔各有多少只? 解题方法: ①假设法:如果笼子里都是鸡,那么就有8×2=16只脚,这样就多出26-16=10只脚; 一只兔子比一只鸡多2只脚,也就是有10÷2=5只兔.所以笼子里有3只鸡,5只兔。 (总脚数-总头数×2)÷2=兔子数总头数-兔子数=鸡数 ②假设法:如果笼子里都是兔,那么就有8×4=32只脚,这样就少了32-26=6只 脚;一只鸡比一只兔子少2只脚,也就是有6÷2=3只鸡。所以笼子里有3只鸡,5只兔。 (总头数×4-总脚数)÷2=鸡数总头数-鸡数=兔子数 ③抬腿法:假如让鸡抬起一只脚,兔子抬起两只脚,还有26÷2=13只脚;这时每 只鸡一只脚,每只兔子两只脚。笼子里只要有一只兔子,则脚的总数就比头的总数多1;这时脚的总数与头的总数之差13-8=5,就是兔子的只数. 总脚数÷2-总头数=兔子数. 总头数-兔子数=鸡数 ④解方程法:解:设有χ只兔子,那么就有(8-χ)只鸡。 鸡兔总共26只脚,就是:4χ+2(8—χ)=26 则χ=5 8—5=3只 例题2.买一些4分和8分的邮票,共花6元8角。已知8分的邮票比4分的邮票多40张,那么两种邮票各买了多少张? 解一:如果拿出40张8分的邮票,余下的邮票中8分与4分的张数就一样多。 (680—8×40)÷(8+4)=30(张), 这就知道,余下的邮票中,8分和4分的各有30张。 因此8分邮票有 40+30=70(张)。 答:买了8分的邮票70张,4分的邮票30张。 也可以用任意假设一个数的办法.

解二:譬如,假设有20张4分,根据条件”8分比4分多40张”,那么应有60张8分。以”分"作为计算单位,此时邮票总值是 4×20+8×60=560. 比680少,因此还要增加邮票。为了保持”差"是40,每增加1张4分,就要增加1张8分,每种要增加的张数是 (680-4×20-8×60)÷(4+8)=10(张)。 因此4分有20+10=30(张),8分有60+10=70(张). 例3. 一项工程,如果全是晴天,15天可以完成。倘若下雨,雨天比晴天多3天,工程要多少天才能完成 解:类似于例3,我们设工程的全部工作量是150份,晴天每天完成10份,雨天每天完成8份.用上一例题解一的方法,晴天有 (150—8×3)÷(10+8)= 7(天). 雨天是7+3=10天,总共 7+10=17(天). 答:这项工程17天完成。 请注意,如果把”雨天比晴天多3天"去掉,而换成已知工程是17天完成,由此又回到上一节的问题.差是3,与和是17,知道其一,就能推算出另一个.这说明了例7,例8与上一节基本问题之间的关系。 总脚数是”两数之和”,如果把条件换成"两数之差”,又应该怎样去解呢 例4.鸡与兔共100只,鸡的脚数比兔的脚数少28。问鸡与兔各几只? 解一:假如再补上28只鸡脚,也就是再有鸡28÷2=14(只),鸡与兔脚数就相等,兔的脚是鸡的脚4÷2=2(倍),于是鸡的只数是兔的只数的2倍.兔的只数是 (100+28÷2)÷(2+1)=38(只)。 鸡是 100—38=62(只)。 答:鸡62只,兔38只. 当然也可以去掉兔28÷4=7(只)。兔的只数是 (100-28÷4)÷(2+1)+7=38(只). 也可以用任意假设一个数的办法。 解二:假设有50只鸡,就有兔100-50=50(只)。此时脚数之差是 4×50—2×50=100,

(完整word版)行程之相遇问题(四)三人或多人之间的相遇问题

四、三人或多人之间的相遇问题。 (一)基本题 例1.甲每分钟走50米,乙每分钟走60米,丙每分钟走70米,甲乙两人从A地,丙一人从B地同时相向出发,丙遇到乙后2分钟又遇到甲, AB两地相距多少米。 解法一:依题意,作线段图如下: 丙遇到乙后2分钟再遇到甲,2分钟甲、丙两人的相遇路程=甲乙两人的追及路程=(50+70)×2=240(米),甲乙的追及时间=甲丙的相遇时间=240÷(60-50)=24(分) 两地距离=甲丙相遇路程=(60+70)×24=3120(米) 解法二:甲、丙相遇时,甲、乙两人相距的路程=乙、丙相背运动的路程和=(60+70)×2=260(米). 甲、乙是同时出发的,到甲、丙相遇时,甲、乙相距260米,所以,从出发到甲、丙相遇需260÷ (60-50)=26(分) 两地相距(50+70)×26=3120(米) 答:AB两地相距3120米。 解题基本步骤: 1.后相遇两人行的路程=同向而行两人的追及路程=(后相遇两人速度和)×时间 2.同向而行两人的追及时间=先相遇两人的相遇时间=追及路程÷(同向两速度差) 3.全程=先相遇两人的相遇路程=(先相遇两人的速度和)×相遇时间 综合算式: (后相遇两人速度和)×时间÷(同向两速度差)×(先相遇两人的速度和) (二)行到两人中间 例2. 甲乙丙三人的行走速度分别为每分钟80米、60米、50米。甲乙两人从A地,丙一人从B地同时相向出发,已知AB两地的距离是480米。如果在两地同时相向而行,多少分钟后丙走到甲乙两人的中间? 分析:假设有一人丁以甲乙的平均速度行走,那么丁就会一直在甲乙两人的中间,这样就等于是丙和丁(甲乙的平均速度)相遇,问题就非常简单了:相遇时间=全程÷【丙速+(甲乙速度和)÷2】480÷【50+(80+60)÷2】=480÷120=4(分钟)

(完整word版)人工智能导论课参考答案第2章

第2章知识表示方法部分参考答案 2.8设有如下语句,请用相应的谓词公式分别把他们表示出来: (1)有的人喜欢梅花,有的人喜欢菊花,有的人既喜欢梅花又喜欢菊花。 解:定义谓词 P(x):x是人 L(x,y):x喜欢y 其中,y的个体域是{梅花,菊花}。 将知识用谓词表示为: (∃x )(P(x)→L(x, 梅花)∨L(x, 菊花)∨L(x, 梅花)∧L(x, 菊花)) (2) 有人每天下午都去打篮球。 解:定义谓词 P(x):x是人 B(x):x打篮球 A(y):y是下午 将知识用谓词表示为: (∃x )(∀y) (A(y)→B(x)∧P(x)) (3)新型计算机速度又快,存储容量又大。 解:定义谓词 NC(x):x是新型计算机 F(x):x速度快 B(x):x容量大 将知识用谓词表示为: (∀x) (NC(x)→F(x)∧B(x)) (4) 不是每个计算机系的学生都喜欢在计算机上编程序。 解:定义谓词 S(x):x是计算机系学生 L(x, pragramming):x喜欢编程序 U(x,computer):x使用计算机 将知识用谓词表示为: ¬(∀x) (S(x)→L(x, pragramming)∧U(x,computer)) (5)凡是喜欢编程序的人都喜欢计算机。 解:定义谓词 P(x):x是人 L(x, y):x喜欢y 将知识用谓词表示为: (∀x) (P(x)∧L(x,pragramming)→L(x, computer))

2.9 用谓词表示法求解机器人摞积木问题。设机器人有一只机械手,要处理的世界有一张桌子,桌上可堆放若干相同的方积木块。机械手有4个操作积木的典型动作:从桌上拣起一块积木;将手中的积木放到桌之上;在积木上再摞上一块积木;从积木上面拣起一块积木。积木世界的布局如下图所示。 解:(1) 先定义描述状态的谓词 CLEAR(x):积木x 上面是空的。 ON(x, y):积木x 在积木y 的上面。 ONTABLE(x):积木x 在桌子上。 HOLDING(x):机械手抓住x 。 HANDEMPTY :机械手是空的。 其中,x 和y 的个体域都是{A, B, C}。 问题的初始状态是: ONTABLE(A) ONTABLE(B) ON(C, A) CLEAR(B) CLEAR(C) HANDEMPTY 问题的目标状态是: ONTABLE(C) ON(B, C) ON(A, B) CLEAR(A) HANDEMPTY (2) 再定义描述操作的谓词 在本问题中,机械手的操作需要定义以下4个谓词: Pickup(x):从桌面上拣起一块积木x 。 Putdown(x):将手中的积木放到桌面上。 Stack(x, y):在积木x 上面再摞上一块积木y 。 Upstack(x, y):从积木x 上面拣起一块积木y 。 其中,每一个操作都可分为条件和动作两部分,具体描述如下: 图 机器人摞积木问题 C A B A B C

相关文档
最新文档