Меза учебник: сюжет агентских богатств является детерминированным, а не случайным - PullRequest
0 голосов
/ 26 октября 2018

спасибо, что нашли время. (Python 3.7.0) Я начинающий в Python и занимаюсь обучением Mesa, так как хочу создать агентную модель для исследования.

У меня возникает следующая проблема: когда я запускаю следующий код, каждый раз должен появляться случайный график, показывающий богатство 10 агентов в модели. Все агенты начинают с богатства 1 и случайным образом обмениваются (= дают богатство) друг с другом. Тем не менее, график всегда один и тот же и показывает стопку со значением 10! Я думаю, что в определении agent_wealth что-то не так, но я взял это прямо из учебника.

from mesa_tutorial import * #import all definitions from mesa_tutorial
import matplotlib.pyplot as plt
model = MoneyModel(10)
for i in range(10):
  model.step()
agent_wealth = [a.wealth for a in model.schedule.agents]
plt.hist(agent_wealth)
plt.show()

В результате на следующем участке: неслучайный сюжет со стеком 10

Вот определение модели

class MoneyModel(Model): # define MoneyModel as a Subclass of Model
'''A model with some number (N) of agents'''
  def __init__(self, N):
      #Create N agents
      self.num_agents = N
      self.schedule = RandomActivation(self) #Executes the step of all agents, one at a time, in random order.         
      for i in range(self.num_agents): #loop with a range of N = number of agents           
          a = MoneyAgent(i, self) # no idea what happens here, a = agent?            
          self.schedule.add(a) #adds a to the schedule of the model       

  def step(self):
      '''Advance the model by one step'''         
      self.schedule.step()

1 Ответ

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

Можете ли вы опубликовать свой класс Moneyagent в этом классе, агенты должны произвольно обменивать деньги. Смотрите функцию шага ниже.

# model.py
class MoneyAgent(Agent):
    """ An agent with fixed initial wealth."""
    def __init__(self, unique_id, model):
        super().__init__(unique_id, model)
        self.wealth = 1

    def step(self):
        if self.wealth == 0:
            return
        other_agent = random.choice(self.model.schedule.agents)
        other_agent.wealth += 1
        self.wealth -= 1

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

...