網頁

2018年8月17日 星期五

用python幫忙寫經濟學作業─完全資訊下的靜態賽局

    首先簡單講一下什麼是靜態賽局:通常場上有兩個玩家,他們要同時出招。他們知道所有出招組合的結果(完全資訊),所以他們會考量彼此的最佳回應策略,同時有兩個最佳回應策略的組合就是所謂的奈許均衡解
例題:(橫軸玩家利得 , 縱軸玩家利得)

    除此之外,這篇要有python的基本知識才看得懂,從資料種類到迴圈、函數設定。當然你看不懂的話就直接跳到最後把程式碼複製下來直接用吧,程式會叫你該輸入哪些資料。

    首先,我們從橫軸玩家的最佳回應策略開始。在縱軸玩家的每個策略下,橫軸玩家要分別出哪個策略才能得到最多的利得呢?先固定考慮一個策略,看哪個策略能獲得最多利得,然後再考慮下一個策略
譬如當縱軸玩家出1號策略時,橫軸玩家要出1號策略才能得到最多的利得。
所以做法是先輸入利得,把它們裝在串列裡,然後找出最大值的位置。python已經有找出最大值的函式max,但只會回傳最大值本身:max([9.65,4.77,7.07,2.23])=9.65
    因此我自訂一個函式,它會比較所有元素是否為最大值,不是的話就繼續比較,是的話就儲存在一個串列當中。如果只有個數字是最大值,就回傳串列裡面的值,不然就回傳整個串列
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

def stgame():
    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)

    這個程式只會顯示最佳回應策略,不過這已經足以判斷奈許均衡以及是否有優勢策略。看你們要不要挑戰自己的能力,把判斷奈許均衡和優勢策略的程式碼寫出來。

沒有留言:

張貼留言