2020-07-15
題目不難, 難在搞懂 …..
你經營一家報攤專賣一份日報,今天下午你得在報社關門前下訂單,
告訴報社你要為明天訂購幾份報紙,隔天清晨你就會收到訂購的報紙並且付款。
每份報紙的進貨價格是 c 元,賣給客人的零售價則是 r 元。
每天會來多少個客人想買報紙是件不確定的事,
也就是說單日需求量 D 是隨機的。
根據過往經驗,你估計明天的單日需求量會落在 0 和 N 之間,
並且符合如下的機率分佈:
Pr(D=i)=pi,i=0,1,...,N
意思是說,有 0 個人來買報紙的機率是 p0 、有 1 個人來買報紙的機率是 p1、最後是賣出 N 份報紙的機率是 pN
你想要決定你的
訂貨量 q
進貨價 c
需求量 D
去最大化你的期望利潤(expected profit)
π(q)=rE[min{q,D}]−cq
看了半天簡單說 :
單位進貨成本 c
單位零售價格 r
需求的可能數 D (0..n)
訂貨量 q
賣出0份 機率 list0
賣出1份 機率 list1
賣出2份 機率 list2
賣出3份 機率 list3
賣出4份 機率 list4
賣出5份 機率 list5
賣出6份 機率 list6
賣出7份 機率 list7
賣出8份 機率 list8
手算:
c=2 #成本
r=10 #售價
n=[0..8] #需求
q=? #訂貨數量
賣出0份 機率 0.06
賣出1份 機率 0.15
賣出2份 機率 0.22
訂貨(q = 0) -> 賺 0 元
訂貨(q = 1) -> p0 + p1(最後一個時要用100% 減去前面發生的機率) => (0-2*1)*(0.06)+(1*10-1*2)*(1-0.06)
訂貨(q = 2) -> p0 + p1 + p2(最後一個時要用100% 減去前面發生的機率) => (0-2*2)*(0.06)+(1*10-2*2)*(0.15)+(2*10-2*2)*(1-0.06-0.15)
--> p0 + p1 + p2
p = 0 -> (p-c*q)*list0 #第一個時
p = 1 -> (p-c*q)*list1 #第二個時
p = 2 -> (p-c*q)*(1 - (list0+list1)) #最後一個時
所以 p0+p1+p2+p3 時
(p0-c*q)*list0+(p1-c*q)*list1+(p2-c*q)*list3+(p3-c*q)*(1 - (list0+list1+list2))
所以
sum[(p[0..n-1]-c*q)*list[0...n-1]]+(pn-cq)*(1 - sum(list[0..n-1]))
大概就是這樣 ….
(c, r, N, q) =(2,
10,
8,
6)
num_list=[0.06,
0.15,
0.22,
0.22,
0.17,
0.1,
0.05,
0.02,
0.01]
'''
c=2 #成本
r=10 #售價
N=8 #需求
q=6 #訂貨數量
num_list=[0.06, 0.15, 0.22, 0.22, 0.17, 0.1, 0.05, 0.02, 0.01] #需求機率
'''
x = min(q,D) #訂貨數量 與 需求 最小的那個
profit = 0.0 #利潤
d = 0.0 #最後機率 100% 減去之前機率累計
for i in range(0,x+1):
print ("第 {} 個購買 ".format(i))
if i == x: #用於最後那個機率
p2 = (i*r-c*q)* (1-d) # (pn-cq)*(1 - sum(list[0..n-1]))
print ("最後的個 {} 購買機率利潤: {}".format(i,p2))
profit = profit + p2 #累加最後那個利潤
else:
p2 = (i*r-c*q)* num_list[i] #(p[0..n-1]-c*q)*list[0...n-1])
print ("第 {} 個購買機率利潤 : {}".format(i,p2))
profit = profit + p2 #累加利潤 sum((p[0..n-1]-c*q)*list[0...n-1])
d = d + num_list[i] #累加機率 list[0..n-1]
print ("第 {} 個購買累加機率 : {}".format(i,d))
print ("第 {} 個購買累加利潤 : {}".format(i,profit))
print("預期的期望利潤為: ",profit)
#0, 7.4, 13.3
接下來是 –> 不想根據給定的一個存貨量去計算預期利潤
題目敘述
在本題中,我們上一題的報童問題,
但現在我們不想根據給定的一個存貨量去計算預期利潤;
我們想要找出能最大化預期利潤的最佳訂貨量 q
預期利潤一樣,請用比較小的那一個當最佳訂貨量
單位進貨成本 c
單位零售價格 r
需求的可能個數 N (N 一定會是 8)
賣出0份 機率 list0
賣出1份 機率 list1
賣出2份 機率 list2
賣出3份 機率 list3
賣出4份 機率 list4
賣出5份 機率 list5
賣出6份 機率 list6
賣出7份 機率 list7
賣出8份 機率 list8
讀入這些資料之後,你會計算最佳訂購量 q in range (0 - N+1)
那一個當最佳訂貨量 ?
用上面程式加一個 loop (把 print 都去掉 , 簡化程式)
# (q = 1 .... 8)
(c, r, N ) = (1,
99,
8)
num_list=[0.0,
0.0,
0.0,
0.0,
0.2,
0.2,
0.2,
0.2,
0.2]
for q in range(0,N+1):
x = min(N,q) #訂貨數量 與 需求 最小的那個
profit = 0.0 #利潤
d = 0.0 #最後機率 100% 減去之前機率
for i in range(0,x+1):
#print ("第 {} 個購買 ".format(i))
if i == x:
profit = profit + (i*r-c*q)* (1-d) #累加最後的一個利潤
else:
profit = profit + (i*r-c*q)* num_list[i] #累加利潤
d = d + num_list[i] #累加機率
print("訂貨數量 {} 時 ,預期的期望利潤為 {}".format(q,int(profit)))