Associate Professor, Tokai University; PhD in Economics

Official Web Site: https://sites.google.com/view/takashikurihara/

Voting Simulation


wo.py: the sets of linear/dichotomous/trichotomous preferences

#the set of ranking vectors corresponding to linear orders
def rank_L(choice):
    import itertools
    rlist=list(itertools.permutations(range(1,len(choice)+1)))
    ranklist=[list(rlist[i]) for i in range(len(rlist))]
    return ranklist

#the set of score vectors corresponding to dichotomous orders
def dic(choice):
    data=[0,1]
    import itertools
    dlist=list(itertools.product(data,repeat=len(choice)))
    diclist=[list(dlist[i]) for i in range(len(dlist))]
    return diclist

#the set of score vectors corresponding to trichotomous orders
def tri(choice):
    data=[-1,0,1]
    import itertools
    tlist=list(itertools.product(data,repeat=len(choice)))
    ticlist=[list(tlist[i]) for i in range(len(tlist))]
    return ticlist

rules.py: including plurality, anti-plurality, best-worst, Borda, approval voting, and dis&approval voting rules

#Plurality
def pl(choice,voter,rank):
    plrank=[]
    for i in range(voter):
        plrank.append([])
        for j in range(len(choice)):
            if rank[i][j]==1:plrank[i].append(1)
            else:plrank[i].append(0)
            
    import numpy as np
    for i in range(voter-1):
        plrank[i+1] = np.array(plrank[i]) + np.array(plrank[i+1])
        
    plwinner=[]
    for i in range(len(choice)):
        if np.max(plrank[voter-1])==plrank[voter-1][i]:plwinner.append(choice[i])
    return plwinner

#Anti-Plurality
def ap(choice,voter,rank):
    aprank=[]
    for i in range(voter):
        aprank.append([])
    for i in range(voter):
        for j in range(len(choice)):
            if rank[i][j]==len(choice):aprank[i].append(-1)
            else:aprank[i].append(0)
    import numpy as np 
    for i in range(voter-1): 
        aprank[i+1] = np.array(aprank[i]) + np.array(aprank[i+1])
    apwinner=[]
    for i in range(len(choice)):
        if np.max(aprank[voter-1])==aprank[voter-1][i]:apwinner.append(choice[i])
    return apwinner

#Best-worst
def bw(choice,voter,rank):
    bwrank=[]
    for i in range(voter):
        bwrank.append([])
    for i in range(voter):
        for j in range(len(choice)):
            if rank[i][j]==1:bwrank[i].append(1)
            elif rank[i][j]==len(choice):bwrank[i].append(-1)
            else:bwrank[i].append(0)
    import numpy as np 
    for i in range(voter-1): 
        bwrank[i+1] = np.array(bwrank[i]) + np.array(bwrank[i+1])
    bwwinner=[]
    for i in range(len(choice)):
        if np.max(bwrank[voter-1])==bwrank[voter-1][i]:bwwinner.append(choice[i])
    return bwwinner

#Borda
def br(choice,voter,rank):
    brrank=[]
    for i in range(voter):
        brrank.append(rank[i])
    import numpy as np 
    for i in range(voter-1): 
        brrank[i+1] = np.array(brrank[i]) + np.array(brrank[i+1])
    brwinner=[]
    for i in range(len(choice)):
        if np.min(brrank[voter-1])==brrank[voter-1][i]:brwinner.append(choice[i])
    return brwinner

#approval
def av(choice,voter,drank):
    avrank=[]
    for i in range(voter):
        avrank.append(drank[i])
    import numpy as np 
    for i in range(voter-1): 
        avrank[i+1] = np.array(avrank[i]) + np.array(avrank[i+1])
    avwinner=[]
    for i in range(len(choice)):
        if np.max(avrank[voter-1])==avrank[voter-1][i]:avwinner.append(choice[i])
    return avwinner

#dis&approval
def dav(choice,voter,trank):
    davrank=[]
    for i in range(voter):
        davrank.append(trank[i])
    import numpy as np
    for i in range(voter-1):
        davrank[i+1] = np.array(davrank[i]) + np.array(davrank[i+1])
    davwinner=[]
    for i in range(len(choice)):
        if np.max(davrank[voter-1])==davrank[voter-1][i]:davwinner.append(choice[i])
    return davwinner

result.py: simulation

#setting
c=['A','B','C'] #choice set (you can include two or more options)
v=100 # of voters

import wo, rule, random

#preference profile
r=random.choices(wo.rank_L(c),k=v)
d=random.choices(wo.dic(c),k=v)
t=random.choices(wo.tri(c),k=v)

#results
print(rule.pl(c,v,r),
      rule.ap(c,v,r),
      rule.bw(c,v,r),
      rule.br(c,v,r)
      )
print(rule.av(c,v,d))
print(rule.dav(c,v,t))

#If you want to repeat the above operation, I recommend to use `for loops' and save data with the `sys' package.