例題:(橫軸玩家利得 , 縱軸玩家利得)
除此之外,這篇要有python的基本知識才看得懂,從資料種類到迴圈、函數設定。當然你看不懂的話就直接跳到最後把程式碼複製下來直接用吧,程式會叫你該輸入哪些資料。
首先,我們從橫軸玩家的最佳回應策略開始。在縱軸玩家的每個策略下,橫軸玩家要分別出哪個策略才能得到最多的利得呢?先固定考慮一個策略,看哪個策略能獲得最多利得,然後再考慮下一個策略。
譬如當縱軸玩家出1號策略時,橫軸玩家要出1號策略才能得到最多的利得。 |
因此我自訂一個函式,它會比較所有元素是否為最大值,不是的話就繼續比較,是的話就儲存在一個串列當中。如果只有一個數字是最大值,就回傳串列裡面的值,不然就回傳整個串列。
def find_max(q):
a=[]
for i in range(0,len(q)):
#range預設起點為零,故可寫range(len(q))。
if q[i]!=max(q):
continue
else:
a.append(i+1)
if len(a)==1:
return a[0]
else:
return a
在我們能夠找到最大值的位置後,就可以來解靜態賽局了。
def game_row():
row=1 #代表橫軸玩家使出第幾號策略
col=1 #代表縱軸玩家使出第幾號策略
r=int(input("橫軸玩家有幾種策略?"))
c=int(input("縱軸玩家有幾種策略?"))
#input會產生字串。
gain=[] #裝利得的串列
a=dict() #裝最終結果的字典
while 1==1:
#由於一永遠等於一,所以這個迴圈會一直跑下去,直到有break為止。
print("當 縱軸 玩家使出 %d 號策略時,"%col)
x=float(input("橫軸玩家使出 %d 號策略時的利得為:" %row))
gain.append(x)
row+=1
#例子中橫軸玩家有四種策略,r等於4。如果row==r就會在第四號策略那邊斷掉不考慮。
if row==r+1:
a[col]=find_max(gain)
print("!!!!!最佳回應策略:"+str(find_max(gain))+"號!!!!!")
gain=[]
col+=1
row=1
if col==c+1:
break
print("{縱軸玩家使出的策略:橫軸玩家的最佳回應策略}")
return a
所以依樣畫葫蘆就可以找出縱軸玩家的最佳回應策略(用的時候是橫著輸入,不像前面的圖所示之橫軸玩家的直向輸入):
def game_col():
row=1
col=1
r=int(input("橫軸玩家有幾種策略?"))
c=int(input("縱軸玩家有幾種策略?"))
gain=[]
a=dict()
while 1==1:
print("當 橫軸 玩家使出 %d 號策略時,"%row)
x=float(input("縱軸玩家使出 %d 號策略時的利得為:" %col))
gain.append(x)
col+=1
if col==c+1:
a[row]=find_max(gain)
print("!!!!!最佳回應策略:"+str(find_max(gain))+"號!!!!!")
gain=[]
row+=1
col=1
if row==r+1:
break
return a
接下來只要有兩個迴圈、裝最終結果的字典,就能寫出完整的程式了。我是先把橫軸玩家的部分跑完,再把縱軸玩家的部分跑完。
完整程式碼:
def find_max(q):
a=[]
for i in range(0,len(q)):
if q[i]!=max(q):
continue
else:
a.append(i+1)
if len(a)==1:
return a[0]
else:
return a
row=1
col=1
r=int(input("橫軸玩家有幾種策略?"))
c=int(input("縱軸玩家有幾種策略?"))
gain=[]
a=dict()
while 1==1:
print("當 縱軸 玩家使出 %d 號策略時,"%col)
x=float(input("橫軸玩家使出 %d 號策略時的利得為:" %row))
gain.append(x)
row+=1
if row==r+1:
a[col]=find_max(gain)
print("!!!!!最佳回應略:"+str(find_max(gain))+"號!!!!!")
gain=[]
col+=1
row=1
if col==c+1:
break
row=1
col=1
gain=[]
b=dict()
while 1==1:
print("當 橫軸 玩家使出 %d 號策略時,"%row)
y=float(input("縱軸玩家使出 %d 號策略時的利得為:" %col))
gain.append(y)
col+=1
if col==c+1:
b[row]=find_max(gain)
print("!!!!!最佳回應略:"+str(find_max(gain))+"號!!!!!")
gain=[]
row+=1
col=1
if row==r+1:
break
print("{縱軸玩家使出的策略:橫軸玩家的最佳回應策略}")
print(a)
print("{橫軸玩家使出的策略:縱軸玩家的最佳回應策略}")
print(b)
這個程式只會顯示最佳回應策略,不過這已經足以判斷奈許均衡以及是否有優勢策略。看你們要不要挑戰自己的能力,把判斷奈許均衡和優勢策略的程式碼寫出來。
沒有留言:
張貼留言