2024數模b題-問題一思路構建
樣本量計算
根據置信空間的計算公式,
逆累積分佈函式(ICDF):
- 逆累積分佈函式(ICDF)是從累積分佈函式的值反推出對應的Z分數。
- 在MATLAB中,norminv 函式就是計算標準正態分佈的逆累積分佈函式的值
我們透過這個公式來得到
我們可以得到
對於95%置信水平,我們能得到Z=1.96
對於90%置信水平,我們能得到Z=1.645
接下來我們可以根據兩種情況來判斷,
第一種:
在95%置信水平下,當p1>p0=10%時,拒收這批零配件, 當樣本檢測到的次品率顯著高於 標稱值時拒收
第二種:
在90%置信水平下,當p2<p0=10%時,接收這批零配件,當次品率在一個合理的範圍內,接收這批零配件。
因此我們可以計算樣本量的值,
利用兩個臨界值的Z,求得95%和90%置信程度下的 最小樣本量
但是還是有一個問題那就是,我們讓樣本足夠小,但是接受率我們沒有進行限定,因此我們還要討論接受率p和樣本量n的關係
p值在統計假設檢驗中起著核心作用。它提供了關於樣本資料與假設之間一致性的度量。具體來說,p 幫助我們判斷在給定的零假設(H0)下,觀察到的資料(或更極端的資料)發生的機率有多大。
然後我們去找到關於p 和 n 的關係圖然後得到
問題二
思路
企業要在生產過程中做出決策,然後找到最小的總成本數,然後根據零配件,成品,不合格成品的選擇進行動態規劃,找到最優解進行最佳化。
模型設計
此題的關鍵就是考慮狀態轉移方程,動態規劃的思路
為了使模型更加清晰,我們可以將問題劃為三個階段
第一階段:零配件採購和檢測
第二階段:成本的裝配和檢測
第三階段:不合格成品的調換和拆解
我們來利用這三個階段進行動態規劃模型的建立
動態規劃模型分析
- 問題定義給定一系列的成本和機率引數,我們需要決定在每個階段應該採取的最佳行動,從而最大化總收益或最小化總成本。
定義自變數
n:批次大小(生產的產品數量)。
p_1:零配件1的次品率。
p_2:零配件2的次品率。
fp:成品的次品率。
cg1:零配件1的採購單價。
cg2:零配件2的採購單價。
jc1:零配件1的檢測成本。
jc2:零配件2的檢測成本。
zp:成品的裝配成本。
cjc:成品的檢測成本。
dh:成品的調換損失。
cj:不合格成品的拆解費用。
s:成品的市場售價。
2.狀態表示
第一階段:零配件採購和檢測
狀態表示 (a1,a2)
a1表示是否檢測零配件1,a2表示是否檢測零配件2 (1表示檢測,0表示不檢測)
第二階段:成本的裝配和檢測
狀態表示 a3
a3表示是否檢測成品(1表示檢測,0表示不檢測)
第三階段:不合格成品的調換和拆解
狀態表示 a4
a4表示是否拆解不合格產品(1表示拆解,0表示不拆解)
3.轉移方程
第三階段:不合格成品的調換和拆解
這種分兩種情況
第一n種:拆解不合格成品
那麼得到a4=1
則狀態轉移方程可得到
Y(3,1)=−cj⋅n1−(zp+cjc)⋅n1
第二種:不拆解不合格成品
由於 a4=0
則得到
Y(3,0)=0
第二階段:成本的裝配和檢測
這個也是分兩種情況
第一種:不檢測成品
那麼得到a3=0
不檢測成品狀態轉移方程為
Y(2,0)=−fp⋅dh⋅𝑛1+(1−fp)⋅s⋅𝑛1+Y(3,a4)
第二種:檢測成品
那麼得到a4=0
檢測成品的狀態轉移方程
Y(2,1)=−cjc⋅n1+(1−fp)⋅s⋅n1+Y(3,a4)
第一階段:零配件採購和檢測
分四種情況
第一種:檢測零件一檢測零件二
那麼a1=1,a2=1
那麼狀態轉移方程
𝑌(1,1,1)=−(jc1+cg1+jc2+cg2)⋅𝑛1+𝑌(2,a3)Y(1,1,1)=−(jc1+cg1+jc2+cg2)⋅n1+Y(2,a3)
第二種:檢測零件一,不檢測零件二
那麼a1=1,a2=0
狀態轉移方程
Y(1,1,0)=−(cg1+jc2+cg2+(p_1+p_2)⋅n1)+Y(2,a3)
第三種:不檢測零件一,檢測零件二
那麼a1=0,a2=1
狀態轉移方程
𝑌(1,0,1)=−(cg1+cg2+jc2+(p_1+p_2)⋅𝑛)+𝑌(2,a3)Y(1,0,1)=−(cg1+cg2+jc2+(p_1+p_2)⋅n)+Y(2,a3)
第四種:不檢測零件一,不檢測零件二
那麼a1=0,a2=0
狀態轉移方程
Y(1,0,0)=−(cg1+cg2+(p_1+p_2)⋅n1)+Y(2,a3)
步驟
計算階段三-->階段二-->階段一-->最優解
程式碼如下
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑體顯示中文
p_1 = [0.1,0.2,0.1,0.2,0.1,0.05] # 零配件1的次品率
p_2 = [0.1,0.2,0.1,0.2,0.2,0.05] # 零配件2的次品率
fp = [0.1,0.2,0.1,0.2,0.1,0.05] # 成品的次品率
cg1 = [4,4,4,4,4,4] # 零配件1的採購單價
cg2 = [18,18,18,18,18,18] # 零配件2的採購單價
jc1 = [2,2,2,1,8,2] # 零配件1的檢測成本
jc2 = [3,3,3,1,1,3] # 零配件2的檢測成本
zp = [6,6,6,6,6,6] # 成品的裝配成本
cjc =[3,3,3,2,2,3] # 成品的檢測成本
dh= [6,6,30,30,10,10] # 成品的調換損失
cj = [5,5,5,5,5,40] # 不合格成品的拆解費用
colors = ['r', 'g', 'b', 'c', 'm', 'y']
s = 56 # 成品的市場售價
# 初始化DP表和決策路徑表
dp = {}
decision_path = {}
dic={}
# 階段3:不合格成品拆解與市場流轉決策
def calculate_jd_3(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s):
# 不拆解不合格成品
dp[(3, 0)] = -fp * (zp+ cjc+ cg1 + cg2) * n
decision_path[(3, 0)] = "不拆解不合格成品"
# 拆解不合格成品
dp[(3, 1)] = -cj * n # 注意這裡需要減去拆解費用,後續計算階段1的收益
decision_path[(3, 1)] = "拆解不合格成品"
# 階段2:成品裝配和檢測決策
def calculate_jd_2(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s):
# 不檢測成品
dp[(2, 0)] = -fp * dh* n + (1 - fp) * s * n + dp[(3, 0)]
decision_path[(2, 0)] = "不檢測成品"
# 檢測成品
dp[(2, 1)] = -cjc * n + (1 - fp) * s * n + dp[(3, 1)]
decision_path[(2, 1)] = "檢測成品"
# 階段1:零配件採購和檢測決策
def calculate_jd_1(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s):
# 檢測零配件1和零配件2
dp[(1, 1, 1)] = -(jc1 * n + cg1 * n + jc2 * n + cg2 * n) + dp[(2, 1)]
decision_path[(1, 1, 1)] = "檢測零配件1和零配件2"
# 檢測零配件1,不檢測零配件2
dp[(1, 1, 0)] = -(jc1 * n + cg1 * n + cg2 * n + p_2 *dh* n) + dp[(2, 1)]
decision_path[(1, 1, 0)] = "檢測零配件1,不檢測零配件2"
# 不檢測零配件1,檢測零配件2
dp[(1, 0, 1)] = -(cg1 * n + jc2 * n + cg2 * n + p_1 * dh * n) + dp[(2, 1)]
decision_path[(1, 0, 1)] = "不檢測零配件1,檢測零配件2"
# 不檢測零配件1和零配件2
dp[(1, 0, 0)] = -(cg1 * n + cg2 * n + p_1 * dh * n + p_2 * dh * n) + dp[(2, 1)]
decision_path[(1, 0, 0)] = "不檢測零配件1和零配件2"
def calculate_n_money(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s,j):
calculate_jd_3(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s); # 計算階段3
calculate_jd_2(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s); # 計算階段2
calculate_jd_1(n,p_1,p_2,fp,cg1,cg2,jc1,jc2,zp,cjc,dh,cj,s); # 計算階段1
# 找到最優的決策和路徑
optimal_value = max(dp.values()) # 最優總收益
optimal_state = max(dp, key=dp.get) # 最優狀態
# 輸出最優結果和對應的決策路徑
print("最優總收益和成本:", optimal_value)
print("最優策略路徑:")
# 回溯決策路徑
# if len(optimal_state) == 3:
# 從階段1開
calculate_1_state = max(dp.keys(), key=lambda k: dp[k] if k[0] == 1 else float('-inf'))
print(f"階段1:{decision_path[calculate_1_state]}")
calculate_2_state = max(dp.keys(), key=lambda k: dp[k] if k[0] == 2 else float('-inf'))
print(f"階段2:{decision_path[calculate_2_state]}")
calculate_3_state = max(dp.keys(), key=lambda k: dp[k] if k[0] == 0 else float('-inf'))
print(f"階段3:{decision_path[calculate_3_state]}")
dic[i]=optimal_value#將這種情況對應的最優策略的最大利潤
for j in range(0,6,1):
# 初始化DP表和決策路徑表
dp = {}
decision_path = {}
dic={}
for i in range(1,100,1):
calculate_n_money(i,p_1[j],p_2[j],fp[j],cg1[j],cg2[j],jc1[j],jc2[j],zp[j],cjc[j],dh[j],cj[j],s,j)
keys=dic.keys()
values=dic.values()
plt.bar(keys, values,color=colors[j])
plt.xlabel('情況'+str(j+1))
plt.ylabel('利潤')
plt.title('情況'+str(j+1)+"與樣本量的關係圖")
plt.show()
# plt.figure() # 建立一個新的圖形視窗