數學建模中初等模型問題的matlab求解

2021-10-04 10:04:55 字數 3051 閱讀 6469

問題描述

三名商人攜帶隨從乘船,一次最多過兩人,在任一岸隨從人數大於商人,則隨從殺人越貨,問商人如何安全渡河?(不妨設最初在西岸)

思路

可以看出這是乙個迷宮問題,但是不同於資料結構中的普通的二維的迷宮問題,此問題中需要考慮的引數還有:船在東岸還是在西岸。所以我們考慮將狀態設定為乙個三維的陣列。採用迷宮問題的解決方式——遞迴來解決這個問題。

而我們知道,迷宮問題中,需要知道的有:可以到達的狀態集合、可以進行的決策集合。在設定初始狀態和終止狀態後,只需要使用函式遞迴即可尋找迷宮的解。遞迴函式中,首先需要判定當前狀態是否是終止狀態,若是則退出遞迴,否則繼續。接著遍歷決策集合,判斷執行決策後是否是安全狀態,否則此決策丟棄。如果是安全狀態,則修改可以到達的狀態集合,繼續前進(遞迴)。

基礎設定

設定狀態為三維的陣列(a,b,c),a,b分別表示未渡河商人個數和隨從個數,c表示此時船在東岸或者西岸(用0/1 表示,0為東,1為西)

設定決策為三維的陣列(m,n,1),m,n分別表示船上商人個數和隨從個數,而第三個引數下文的操作中會提到。

安全狀態

安全狀態最初即為可以保證在任何乙個岸邊商人數都不少於隨從個數的狀態集合。在遞迴層數增加時,安全狀態應該剔除當前的狀態以避免造成死迴圈(也即是在迷宮問題的鄰接矩陣中每次經過節點後把可通過狀態改為不可經過)。為實現這種功能,設計兩個集合,s用來統計最初的安全狀態,s2用來統計當前遞迴下,已經經過的安全狀態。

不妨設最初狀態為(3,3,1),終止狀態為(0,0,0)

決策

我們這樣來定義決策函式:

奇數次渡河時,未渡河的人數是減去船上的人數的;而偶數次渡河時,是加上船上人數的。也即是,當船在西岸時,做減法,否則是做加法。而狀態變數中的第三個引數就是記錄船在哪個岸的。於是我們這麼設計函式:tmp=s_now+(-1^(s_now(1,3))*d_now;

源**

merchant.m:

clear;clc;

global s;

global d;

s =[33

0;33

1;32

0;32

1;31

0;31

1;30

0;30

1;22

0;22

1;11

0;11

1;00

0;00

1;03

0;03

1;02

0;02

1;01

0;01

1];%s 是安全狀態,前兩個引數表示未過河的商人數和僕從數 後乙個引數表示 船停靠在哪個岸 方便後面的操作

d =[10

1;01

1;11

1;20

1;02

1];%d 是決策集合

%假設初始狀態是[33

1] 終止狀態是[00

0]s_now =[3

31];

r=;%r用來存放路徑s2(

1,:)

=[33

1];%s2是已經經過的狀態 即之後不能到達的狀態

crossriver

(s_now,

1,s2,r)

;crossriver.m:

function =

crossriver

(s_now,times,s2,r)

global s;

global d;

s_tmp=s_now;

if(s_now==[0

00])

%如果當前狀態是最終狀態 則退出當前遞迴

for i=

1:times-

2fprintf

('%d %d %d ->',r

(i,:))

; end

fprintf

('0 0 0\n');

else

for i=1:

5 s_now=s_tmp;

d_now =

d(i,:)

; tmp = s_now +((

-1)^

s_now(1

,3))

*d_now;

%如果當前狀態第三個引數為1 則是過去的動作 所以是未渡河的人數減少 否則是未渡河的人數增加

if(ismember

(tmp,s,

'rows'))

%如果渡河後狀態是安全狀態

if(~

ismember

(tmp,s2,

'rows'))

%且是沒有出現過的狀態

s_now = tmp;

%進行操作 當前狀態發生改變

s2((times+1)

,:)=s_now;

r(times,:)

=s_now;

%將當前狀態記錄進入路徑

crossriver

(s_now,times+

1,s2,r)

; end

endendend

end

結果

2 2 0 ->3 2 1 ->3 0 0 ->3 1 1 ->1 1 0 ->2 2 1 ->0 2 0 ->0 3 1 ->0 1 0 ->1 1 1 ->0 0 0

2 2 0 ->3 2 1 ->3 0 0 ->3 1 1 ->1 1 0 ->2 2 1 ->0 2 0 ->0 3 1 ->0 1 0 ->0 2 1 ->0 0 0

3 1 0 ->3 2 1 ->3 0 0 ->3 1 1 ->1 1 0 ->2 2 1 ->0 2 0 ->0 3 1 ->0 1 0 ->1 1 1 ->0 0 0

3 1 0 ->3 2 1 ->3 0 0 ->3 1 1 ->1 1 0 ->2 2 1 ->0 2 0 ->0 3 1 ->0 1 0 ->0 2 1 ->0 0 0

關於投籃的數學建模模型 投籃問題的數學建模

數。由 1.3 式計算出兩個出手速度角度記作1 2 且設12 可以看出1 是h 和v 的減函式 球入籃筐時的入射角度 可從下式得到 tan x l dy dx 1.6 這裡的導數由 1.2 式計算代入後可得 2 tan tan h h l 1.7 於是對應於1 2 有1 1 設12 問題2 的分析與...

數學建模優化模型簡單例題 數學建模優化問題經典練習

動力和機器裝置,製造乙個容器所需的各種資源的數量如表所示 資源小號容器 中號容器 大號容器 金屬板 t 勞動力 人 月 機器裝置 臺月 不考慮固定費用,每種容器售出乙隻所得的利潤分別為 萬元,萬元,萬元,可使用的金屬板有 500t 勞動力有 人月,機器有 臺月,此外,不管每種容器製造的數量是多少,都...

關於投籃的數學建模模型 數學建模中如何建立數學模型

根據數學建模的目的和問題的背景做出必要的簡化假設,用字母表示未知量,利用相應的物理或其他規律列出數學式子,做出數學上的解答,用這個答案解釋這個問題。把椅子往不平的地面上一放,通常只有三隻腳著地,放不穩,然而只要稍挪動幾次,就可以四腳著地,放穩了.下面用數學語言證明.設a,c兩腳與地面之和是f b,d...