2015-06-23 3 views
0
import numpy as np 

import matplotlib.pyplot as plt 


class Prisoners_Dilemma: 


    def __init__(self,n,p): 
     self.n = n 
     self.p = p 


    def decision_array(self): 
     self.dict_dict = {} 

     for i in range(1,self.n + 1): 
      self.dict_dict[i] = [] 
      list_list = [] 

      for j in range(1,self.n):   
       #np.random.seed(j) 
       self.r = np.random.uniform(0,1) 

       if self.r > self.p: 
        q = 0 

       else: 
        q = 1 

       list_list.append(q)     
       self.dict_dict[i] = list_list 

     return self.dict_dict 


    def payoff(self): 
     self.dict_dict_2 = {} 

     for i in range(1,self.n + 1): 
      self.dict_dict_2[i] = [] 
      list_list_2 = [] 
      list_list_3=[] 

      for j in range(1, i): 
        list_list_2.append(self.dict_dict[j][i-2]) 

      for j in range(i + 1, self.n + 1): 
        list_list_2.append(self.dict_dict[j][i-1]) 



      list_list_2_np = np.array(list_list_2) 
      against_i = np.sum(list_list_2_np) 
      for_i = np.sum(self.dict_dict[i]) 

      if against_i == 0 and for_i == 0: 
       payoff_i = 2 

      elif against_i == 0 and for_i != 0: 
       payoff_i = 5 

      elif against_i != 0 and for_i == 0: 
       payoff_i = -5 

      else: 
       payoff_i = -2 

      list_list_3.append(payoff_i) 

      self.dict_dict_2[i]=list_list_3 

     return self.dict_dict_2 


    def gameplay(self, N, initial_count): 

     self.counter = initial_count 

     for i in range(N): 
      for j in range(1, self.n + 1): 
       z = self.dict_dict_2[j] 
       x = np.array(z) 


       self.counter += np.sum(z) 
     return self.counter 

y = Prisoners_Dilemma(15,0.015) 

print (y.gameplay(20,100)) 

В приведенном выше коде компилятор сообщает об ошибке, что экземпляр не имеет атрибута как dict_dict_2, хотя его префикс сам. Более того, он отлично справляется с dict_dict. Для полноты я включил весь код, но проблема заключается только в способах оплаты и игрового процесса?Почему код (Python) дает ошибку?

ответ

2

dict_dict_2 является только создан в payoff(), поэтому вы должны назвать его, прежде чем пытаться вызвать gameplay().

+0

Не могли бы вы объяснить, почему переменная dict_dict работает (см. Payoff и decision_matrix)? –

+0

Это «работает» случайно, потому что ** вы никогда не обращаетесь к нему **. –

0

Вопрос заключается в том, что вы только создание self.dict_dict_2 переменной в функции payoff, но в вашей логике, где вы вызываете gameplay() функцию, вы не вызывая функцию payoff() перед обращением к dict_dict_2, от взглядов этого вы не заходящих которая функционирует где угодно вообще.

Не уверен, что dict_dict_2 держится, но выше, является причиной, почему вы получаете вопрос, может быть, вы можете переместить инициализацию часть dict_dict_2 к __init__() функции, хотя это не исправит полный вопрос, так как вы все равно будете пытаясь получить доступ к dict_dict_1[j], который может ошибиться, если j не является ключом в dict_dict_2.

+0

не могли бы вы объяснить, почему нет такой проблемы с переменной dict_dict? –

+0

Вы вообще не получаете доступ к переменной 'dict_dict' в любом месте игрового процесса, вы пытаетесь получить доступ к ней там (просто сделайте простой' print (self.dict_dict) '), и вы увидите ошибку для этого также –

+0

не в игровом процессе. Я вызвал dict_dict в decision_matrix и использовал его в выигрыше без какого-либо специального синтаксиса, но он отлично работает и дает мне список (если вы попытаетесь запустить код, комментируя часть игрового процесса). –

Смежные вопросы