Вернуть отрицательное значение - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь реализовать функцию, в которой у меня есть 2 игрока, и их выплаты зависят от их действий.

def game(action1,action2):

  if action1 == "a" and action2 == "a":
     payoff1 = 1
     payoff2 = 1
  elif action1 == "a" and action2 == "b":
     payoff1 = -5
     payoff2 = 3
  elif action1 == "b" and action2 == "a":
     payoff1 = 3
     payoff2 = -5
  elif action1 == "b" and action2 == "b":
     payoff1 = 2
     payoff2 = 2
 return payoff1 , payoff2

Тогда у меня была бы стратегия для этой игры (пример):

def TitForTat(round_num, previous_action):
    if round_num == 0:
       action = "a"
    else:
       action = previous_action
  return action

def AlwaysDefect():
  return "b"

action1 = TitForTat (0,'c')
action2 = AlwaysDefect()

game (action1,action2)

Это возвращает ошибку:

local variable 'payoff1' referenced before assignment

Я пытался инициализировать их на «0», но то же самое. Точные функции работают очень хорошо, если у меня есть все положительные значения.

EDIT:

Извините за опечатку. А функция AlwaysDefect () возвращает «b» и «d».

Ответы [ 5 ]

0 голосов
/ 30 октября 2018

У вас есть несколько проблем в этом коде.

def game(action1,action2):
  # 1. this if/else chain only handles input values of "a" or "b"
  if action1 == "a" and action2 == "a":
     payoff1 = 1
     payoff2 = 1
  elif action1 == "a" and action2 == "b":
     payoff1 = -5
     payoff2 = 3
  elif action1 == "b" and action2 == "a":
     payoff1 = 3
     payoff2 = -5
  elif action1 == "b" and action2 == "b":
     payoff1 = 2
     # 2. this is misspelt, so payoff2 never gets declared for input "b","b"
     payyoff2 = 2

 return payoff1 , payoff2
  1. код для game только работает для входных данных в ("a","b") x ("a","b"), но проверка ошибок отсутствует, и фактически код, который вы отправили , предоставляет входные данные вне этого диапазона
  2. один из действительных входов ("b","b") все равно не будет выполнен, потому что вы ошиблись "выплатой". Менее подробный код имеет меньше возможностей для орфографических ошибок, но на самом деле это то, что вы должны найти в тестировании.

    action1 = TitForTat (0, 'c') action2 = AlwaysDefect ()

Почему бы не напечатать ваши аргументы, прежде чем передать их в свою функцию? Или вывести аргументы внутри функции? Или войдите в функцию в pdb и посмотрите на них?

Вы установили здесь "a", "d", и TitForTat может произвести "c". Ни "c", ни "d" вообще не обрабатываются в вашей функции game.

0 голосов
/ 30 октября 2018

Вы должны инициализировать оба вознаграждения чем-то, потому что, если ваши действия не попадают в конкретный случай, вы в конечном итоге ничего не возвращаете. Поэтому добавьте еще одно значение по умолчанию, чтобы ваша функция возвращала выплаты по умолчанию, и следующий код должен помочь вам решить проблему.

def game(action1,action2):


    if action1 == "a" and action2 == "a":
        payoff1 = 1
        payoff2 = 1
    elif action1 == "a" and action2 == "b":
        payoff1 = -5
        payoff2 = 3
    elif action1 == "b" and action2 == "a":
        payoff1 = 3
        payoff2 = -5
    elif action1 == "b" and action2 == "b":
        payoff1 = 2
        payoff2 = 2
    else:
        payoff1= 0
        payoff2=0


    return payoff1 , payoff2

Это должно технически предотвратить появление этой ссылочной ошибки.

0 голосов
/ 30 октября 2018

Вы имели в виду, что функция AlwaysDefect возвращает 'd' или 'b'?

Теперь, когда он возвращает 'd', вы не попадаете ни в одно из своих утверждений if и у вас нет определения для payoff1 или payoff2

Также опечатка: payyoff2 -> payoff2

Вы можете установить оператор по умолчанию, чтобы исправить его (в разделе else):

def game(action1,action2):

  if action1 == "a" and action2 == "a":
     payoff1 = 1
     payoff2 = 1
  elif action1 == "a" and action2 == "b":
     payoff1 = -5
     payoff2 = 3
  elif action1 == "b" and action2 == "a":
     payoff1 = 3
     payoff2 = -5
  elif action1 == "b" and action2 == "b":
     payoff1 = 2
     payoff2 = 2
  else:
     payoff1 = 0 # or any other value
     payoff2 = 0 # or any other value
  return payoff1, payoff2
0 голосов
/ 30 октября 2018

Слишком много болтовни в вызове вашей функции. Используйте словарь:

def game(action1, action2):
    payoffs = {
        ('a', 'a'): (1, 1),  ('a', 'b'): (-5, 3),
        ('b', 'a'): (3, -5), ('b', 'b'): (2, 2)
    }
    return payoffs.get((action1, action2), (0, 0))
0 голосов
/ 30 октября 2018

Ваши операторы if не перехватывают, если действие c или d, это приводит к тому, что payoff1 и payoff2 не инициализируются.

...