from math import log
from random import random
from pprint import pprint
data = {
'lombardia' : [195,150],
'veneto' : [83,70],
'sardegna' : [34,100],
'faroe' : [33],
'cherkasy' : [19],
'vitebsk' : [18],
'lisbon' : [13],
'pontevedra' : [12],
'vladimir' : [11],
'moldavia' : [11]
}
iterations = 25
printIterations = True
printAverage = True
aliveRegions = 33
totalTerritories = 517
totalUsers = 1000
if sum([v[0] for v in data.values()]) > totalTerritories:
print("Errore numero territori")
exit()
if sum([v[1] if len(v)>1 else 0 for v in data.values()]) > totalUsers:
print("Errore numero utenti")
exit()
otherRegions = aliveRegions - len(data)
otherTerritories = totalTerritories - sum([v[0] for v in data.values()])
otherUsers = totalUsers - sum([ v[1] if len(v)>1 else 0 for v in data.values()])
incomplete = []
for k,v in data.items():
if len(v) == 1:
incomplete.append(k)
for i in range(otherRegions):
data['other%s' % i] = [
otherTerritories/(otherRegions) ,
otherUsers/(otherRegions+len(incomplete))
]
for k in incomplete:
data[k].append(otherUsers/(otherRegions+len(incomplete)))
def score(regions,people):
return regions * log(2+people)
scores = {k: score(*v) for k,v in data.items()}
total = sum(scores.values())
probs = {k: v/total for k,v in scores.items()}
items = []
for v in probs:
items.append((v,probs[v]))
cumul = []
for k,v in enumerate(items):
if k == 0:
cumul.append((v[0],v[1]))
else:
cumul.append((v[0],v[1] + cumul[k-1][1]))
def attack():
r = random()
for v in cumul:
if r < v[1]:
return v[0]
return False
attacksAverage = {}
attacksCount = 0
for y in range(iterations):
attacks = {k: 0 for k,v in scores.items()}
for i in range(24*3):
a = attack()
if a in attacks:
attacks[a] = attacks[a] + 1
attacks['altri'] = 0
for k,v in attacks.items():
if 'other' in k:
attacks['altri'] += v
for i in range(otherRegions):
attacks.pop('other%s'%i,None)
if printIterations: print(attacks)
for k,v in attacks.items():
if k in attacksAverage:
avg = (( attacksAverage[k] * attacksCount ) + v ) / ( attacksCount + 1 )
attacksAverage[k] = (float)("%.2f" % avg)
else:
attacksAverage[k] = v
attacksCount += 1
if printIterations: print()
if printAverage:
print("Media:")
print(attacksAverage)