matlab三个商人三个随从,数学建模 商人过河
數學建模課程作業
論文題目:
對商人過河問題的研究
指導教師:黃光輝
小組成員:黃志宇(20156260)車輛工程04班
牛凱春(20151927)電氣工程05
班
文逸楚(20150382)工商管理
02
班
一、問題重述
3名商人帶3名隨從乘一條小船過河,小船每次只能承載至多兩人。隨從們密約,在河的任一岸,一旦隨從的人數比商人多,就殺人越貨。乘船渡河的方案由商人決定,商人們如何才能安全渡河呢?
二、問題分析
本題針對商人們能否安全過河問題,需要選擇一種合理的過河方案。對該問題可視為一個多步決策模型,通過對每一次過河的方案的篩選優化,最終得到商人們全部安全過到河對岸的最優決策方案。對于每一次的過河過程都看成一個隨機決策狀態量,商人們能夠安全到達彼岸或此岸我們可以看成目標決策允許的狀態量,通過對允許的狀態量的層層篩選,從而得到過河的目標。
三、模型假設
1. 過河途中不會出現不可抗力的自然因素。
2. 當隨從人數大于商人數時,隨從們不會改變殺人的計劃。
3.船的質量很好,在多次滿載的情況下也能正常運作。
4. 隨從會聽從商人的調度,所有人都到達河對岸。
四、符號說明第k 次渡河前此岸的商人數
第k 次渡河前此岸的隨從數
過程的狀態向量
允許狀態集合
第k 次渡船上的商人數
第k 次渡船上的隨從數
決策向量
允許決策集合
五、模型建立
本題為多步決策模型,每一次過河都是狀態量的轉移過程。
用二維向量表示過程的狀態,其中分別表示對應時刻此岸的商人,仆人數以及船的行進方向,其中則允許狀態集合:
=
又將二維向量定義為決策,則允許的決策合集為:
因為k 為奇數時船從此岸駛向彼岸,k 為偶數時船從彼岸駛向此岸,所以狀態隨決策的變化規律是
該式稱為狀態轉移律。
求決策,使, 并按照轉移律,由經過有限步n 到達狀態
六、模型求解
本模型使用MATLAB 軟件編程,通過窮舉法獲得決策方案如下(完整matlab 程序詳見附錄):
初始狀態:
X0=
3
狀態為:
S =
3
3
3
3
1
2
決策為:
D =
0可用圖片表示為:3y [**************]1s n +12
2
1
2
[1**********]
七、模型推廣
該商人和隨從過河模型可以完美解決此類商人過河的決策問題,并且該模型還可推廣至解決m 個商人和n 個隨從過河,以及小船的最大載重人數改變時的問題,只需適當地改變相關的語句即可輕松實現模型的轉換。
如當商人數和隨從數均為4,小船最大載重人數為2時,只需將程序的參數修改為m=4,n=4,h=2即可。
若需求更多人數,則推廣過程只需要將其中的(x,y)(限定范圍)改成相對應的情況即可。
例如,商人基于仆人數都為4時允許狀態集合,S={(x, y)|x=0,y=0,1,2,3,4;x=4,y=0,1,2,3,4;x=y=1,2,3}。由程序結果可得該問題無解。
八、模型評價
1. 本文通過matlab 編程,運用窮舉法找出解決方案,并且程序可推廣至m 個商人n 個隨從的問題,具有實用性。
2. 本文存在的不足是程序只能求解出一種解決方案,無法列出所有解決方法。
附錄
matlab 源程序
clear all
%n 為商人數,m為仆人數,h為每次過河的最多人數%n=3;m=3;h=2;%初始狀態及數據
m0=0;n0=0;
tic
LS=0;%允許的狀態集合S 與個數LS
LD=0;%允許的決策集合D 與個數LD
for i=0:n
for j=0:m
if i>=j&n-i>=m-j|i==n|i==0
LS=LS+1;S(LS,:)=[ij];
end
if i+j>0&i+j=j|i==0)
LD=LD+1;D(LD,:)=[ij];
end
end
end
%用搜尋法找出符合條件的渡河方案%
N=15;
Q1=inf*ones(2*N,2*N);
Q2=inf*ones(2*N,2*N);
t=1;
le=1;
q=[mn];
f0=0;%判斷循環終止標記
while f0~=1&t
k=1;
sa=[];
sb=[];
for i0=1:le%第n 次允許的策略集逐次搜索
s0=q(i0,:);
if f0==1
break
end
for i=1:LD%由s0搜索D 后得到允許的狀態
s1=s0+(-1)^t*D(i,:);
if s1==[m0,n0]
sa=[m0,n0];
sb=D(i,:);
f0=1;
break
end
for j=2:LS-1%搜索對比S 后允許狀態%
if s1==S(j,:)
if k==1
sa(k,:)=s1;
sb(k,:)=D(i,:);
k=k+1;
break
end
if k>1%對重復狀態刪除處理%f1=0;
for ii=1:k-1
if s1==sa(ii,:)
f1=1;
break
end
end
end
if f1==0
sa(k,:)=s1;
sb(k,:)=D(i,:);
k=k+1;
break
end
end
end
end
end
q=sa;
le=size(q,1);
Q1(1:le,t*2-1:t*2)=q;
Q2(1:le,t*2-1:t*2)=sb;
t=t+1;
end
%在可行方案集合中逆向搜尋唯一方案%tr=t-1;saa1=sa;
S=zeros(tr,2);D=zeros(tr,2);for k=tr:-1:2
k1=k-1;f0=0;
sbb=Q2(:,k*2-1:k*2);
saa=Q1(:,k1*2-1:k1*2);
for i=1:2*N
saa2=saa1-(-1)^k*sbb(i,:);for j=1:2*N
if saa2==saa(j,:)
saa1=saa2;
sbb1=sbb(i,:);
f0=1;
break
end
end
if f0==1
break
end
end
S(k1,:)=saa1;
D(k,:)=sbb1;
end
S(tr,:)=[m0n0];
D(1,:)=[m,n]-SA(1,:);disp '初始狀態:'X0=[m,n]
disp '狀態為:'
S
disp '決策為:'
D
toc
總結
以上是生活随笔為你收集整理的matlab三个商人三个随从,数学建模 商人过河的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数据组织存在维度吗_用Pyt
- 下一篇: 运用Python完成五角星随机颜色的绘制