def random_neighbor(G, i): l = neighbors(G, i) return random.choice(l) if len(l) > 0 else None
def main(args): if len(args) != 1: sys.exit("Usage: python origianl.py <graphml file>") C=3 L=6 #损失值 select_strength=1 #选择强度 fname = args[0] G = networkx.read_graphml(fname) G = networkx.convert_node_labels_to_integers(G) ''' 给每个参与者初始化投资额,利用之前initial_investment.npy文件 ''' a=[] defender = [Defender(i) for i in range(0, len(G))] for i in range(len(G)): defender[i].set_degree(G.degree()[i]) for i in range(len(G)): if defender[i].get_degree()<2: defender[i].set_investment(random.uniform(0,0.2)) elif defender[i].get_degree()<4 and defender[i].get_degree()>=2: defender[i].set_investment(random.uniform(0.2,0.4)) elif defender[i].get_degree()<6 and defender[i].get_degree()>=4: defender[i].set_investment(random.uniform(0.4,0.6)) elif defender[i].get_degree()<8 and defender[i].get_degree()>=6: defender[i].set_investment(random.uniform(0.6,0.8)) elif defender[i].get_degree()>=8: defender[i].set_investment(random.uniform(0.8,1)) a.append(defender[i].get_investment()) numpy.save('initial_investment.npy',a) for i in range(len(G)): sum_weight=0.0+defender[i].get_degree() for j in neighbors(G,i): sum_weight+=defender[j].get_degree() defender[i].set_weight((defender[i].get_degree())/sum_weight) #pdb.set_trace() '''开始演化博弈''' for i in range(300): #计算每个参与者的风险和收益 for j in range(0,len(G)): sum=0 for k in neighbors(G,j): sum = sum+defender[k].get_weight()*defender[k].get_investment() defender[j].set_risk(math.exp(-sum-defender[j].get_weight()*defender[j].get_investment())) defender[j].set_payoff(-C*defender[j].get_investment()-L*defender[j].get_risk()) if i==0: pp=0 for jo in range(0,len(G)): pp=pp+defender[jo].get_payoff() print pp '''更新策略''' for jj in range(0,len(G)): jjj=random_neighbor(G, jj) if defender[jj].get_payoff() < defender[jjj].get_payoff(): imitation_probabily=1.0/(1+math.exp((-select_strength)*(defender[jjj].get_payoff()-defender[jj].get_payoff()))) if random.random() <= imitation_probabily: defender[jj].set_investment_update(((defender[jj].get_degree()+0.1)/defender[jjj].get_degree()+0.1)*defender[jjj].get_investment()) else: defender[jj].set_investment_update((defender[jj]).get_investment()) else: (defender[jj]).set_investment_update((defender[jj]).get_investment()) for jjjj in range(0,len(G)): defender[jjjj].set_investment(defender[jjjj].get_investment_update()) ''' for j in range(0,len(G)): print defender[j].get_investment() ''' p=0 for j in range(0,len(G)): p=p+defender[j].get_payoff() print p
def main(args): if len(args) != 1: sys.exit("Usage: python add_mechanism.py <graphml file>") C = 3 L = 6 #损失值 select_strength = 1 #选择强度 fname = args[0] G = networkx.read_graphml(fname) G = networkx.convert_node_labels_to_integers(G) ''' 给每个参与者初始化投资额,利用之前initial_investment.npy文件 ''' a = numpy.load('initial_investment.npy') defender = [Defender(i) for i in range(0, len(G))] for i in range(len(G)): defender[i].set_investment(a[i]) defender[i].set_degree(G.degree()[i]) #pdb.set_trace() for i in range(len(G)): sum_degree = 0.0 + defender[i].get_degree() for j in neighbors(G, i): sum_degree += defender[j].get_degree() defender[i].set_weight((defender[i].get_degree()) / sum_degree) '''开始演化博弈''' for i in range(300): #计算每个参与者的风险和收益 for j in range(0, len(G)): sum = 0 neighbors_num = 0 sum_weight = 0.0 + defender[j].get_weight() for k in neighbors(G, j): neighbors_num += 1 sum_weight += defender[k].get_weight() sum = sum + defender[k].get_weight( ) * defender[k].get_investment() defender[j].set_risk( math.exp(-sum - defender[j].get_weight() * defender[j].get_investment())) defender[j].set_payoff(-C * defender[j].get_investment() - L * defender[j].get_risk()) defender[j].set_ave_neighbor_invest( (defender[j].get_weight() * defender[j].get_investment() + sum) / sum_weight) if i == 0: pp = 0 for jo in range(0, len(G)): pp = pp + defender[jo].get_payoff() print pp for jj in range(len(G)): taxsum = 0 for kk in neighbors(G, jj): ksum = 0 for kkk in neighbors(G, kk): if kkk != jj: ksum = ksum + defender[kkk].get_weight( ) * defender[kkk].get_investment() defender[kk].set_tax( L * (defender[kk].get_risk() - math.exp(-defender[kk].get_weight() * defender[kk].get_investment() - ksum - defender[jj].get_weight() * defender[jj].get_ave_neighbor_invest()))) taxsum = taxsum + defender[kk].get_tax() defender[jj].set_addtax(taxsum) defender[jj].set_payoff(defender[jj].get_payoff() - taxsum) '''更新策略''' for jjj in range(0, len(G)): jjjj = random_neighbor(G, jjj) if defender[jjj].get_payoff() < defender[jjjj].get_payoff(): imitation_probabily = 1.0 / (1 + math.exp( (-select_strength) * (defender[jjjj].get_payoff() - defender[jjj].get_payoff())) ) if random.random() <= imitation_probabily: defender[jjj].set_investment_update( ((defender[jjj].get_degree() + 0.1) / defender[jjjj].get_degree() + 0.1) * defender[jjjj].get_investment()) else: defender[jjj].set_investment_update( (defender[jjj]).get_investment()) else: (defender[jjj]).set_investment_update( (defender[jjj]).get_investment()) for jjjjj in range(0, len(G)): defender[jjjjj].set_investment( defender[jjjjj].get_investment_update()) ''' for j in range(0,len(G)): print defender[j].get_investment() ''' p = 0 for j in range(0, len(G)): p = p + defender[j].get_payoff() + defender[j].get_addtax() defender[j].set_tax(0.0) defender[j].set_addtax(0.0) print p '''
def neighbors_(): '''Functional equivalent to <Graph>.neighbors(<v>)''' g = Graph([(1, 2), (2, 3)]) print(function.neighbors(g, 2)) # [1, 3]