我正在用Python编写Netlogo的El-Farol模型。但是,我一直收到这个错误,我不知道如何继续:
Traceback (most recent call last):
File "<ipython-input-444-99b2c0f618f2>", line 3, in <module>
village.run()
File "<ipython-input-441-cb8708c7230d>", line 143, in run
Agent(self)
File "<ipython-input-441-cb8708c7230d>", line 22, in __init__
self.village.env.process(self.move())
File "C:\Users\jkowalczyk002\AppData\Local\Continuum\Anaconda3\lib\site-packages\simpy\events.py", line 272, in __init__
raise ValueError('%s is not a generator.' % generator)
ValueError: None is not a generator.
消息表明move()函数有问题,但在我看来,它很好:
^{pr2}$它应该从move
->;gen_loc
->;najlepsza
(英语最好)->;do_baru
(E-到bar),但是它得到None
。在
完整代码:
import simpy
import random
import math
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors
from gridplot import GridPlot
white_green = matplotlib.colors.ListedColormap(["green","white"])
plt.register_cmap(cmap=white_green)
class Agent:
def __init__(self,village):
self.village = village
self.color = 1
self.loc = self.gen_loc()
self.village.env.process(self.move())
def gen_loc(self):
if self.najlepsza()<self.village.threshold:
self.loc = (random.randrange(math.floor(self.village.village_dim/2)+1,self.village.village_dim),
random.randrange(math.floor(self.village.village_dim/2)+1,self.village.village_dim))
if self.loc not in self.village.occupied:
self.village.occupied[self.loc] = self
elif random.random()>0.33:
self.loc =(random.randrange(0,math.floor(self.village.village_dim/2)-1,
random.randrange(0,self.village.village_dim)))
if self.loc not in self.village.occupied:
self.village.occupied[self.loc] = self
else:
self.loc =(random.randrange(math.floor(self.village.village_dim/2),self.village.village_dim),
random.randrange(0,math.floor(self.village.village_dim/2)-1))
if self.loc not in self.village.occupied:
self.village.occupied[self.loc] = self
def najlepsza(self):
if self.village.env.now<2:
strategia=[]
for j in range(village.liczbastr):
for i in range(village.memorysize):
strategia.append(random.random())
sumy=[]
for j in range(village.liczbastr):
sumy.append(sum(strategia[i+village.memorysize*j] for i in range(village.memorysize)))
strategia1=[]
for j in range(village.liczbastr):
for i in range(village.memorysize):
strategia1.append(strategia[i+j*village.memorysize]/sumy[j])
listypre=[strategia1[i:i+village.memorysize] for i in range(0, village.memorysize*village.liczbastr, village.memorysize)]
zestaw1=np.array(listypre)
historia1=village.historia
wynikstrat=[]
for j in range(village.liczbastr):
for k in range(village.memorysize):
wynikstrat.append(sum(historia1[-i-2-k]*zestaw1[j,-i-1] for i in range(village.memorysize)))
listypre=[]
listypre=[wynikstrat[i:i+village.memorysize] for i in range(0, village.memorysize*village.liczbastr, village.memorysize)]
tabela1=np.array(listypre)+10
wynik=village.memorysize*100
naj=village.liczbastr
pred=0
for j in range(village.liczbastr):
if (sum(abs(tabela1[j,i]-historia1[-i-1]) for i in range(village.memorysize)))<wynik:
wynik=sum(abs(tabela1[j,i]-historia1[-i-1]) for i in range(village.memorysize))
naj=j
pred=sum(historia1[-1-i]*zestaw1[naj,-i-1] for i in range(village.memorysize))
return(pred)
def do_baru(self):
return(self.najlepsza() <= self.village.threshold)
def move(self):
new_loc = self.gen_loc()
del self.village.occupied[self.loc]
self.loc = new_loc
self.village.data[self.loc] = 1
class Village:
def __init__(self, env, village_dim, memorysize, liczbastr,threshold):
self.village_dim = village_dim
self.memorysize = memorysize
self.liczbastr = liczbastr
self.threshold = threshold
self.env=env
self.historia=self.historialos()
def historialos(self):
if self.env.now<2:
historia=[]
for i in range(2*self.memorysize):
historia.append(random.randint(0,100))
return(historia)
def histupdate(self):
for i in range(2*self.memorysize):
self.historia[i-1]=self.historia[i]
self.historia[2*self.memorysize-1]=self.attendance()
return(self.historia)
def attendance(self):
attend=0
for v in self.occupied.values():
if v.do_baru():
attend = attend+1
def plot(self, start):
self.data = np.zeros((self.village_dim, self.village_dim))
for agent in self.occupied:
self.data[agent] = self.occupied[agent].color
self.gp = GridPlot(self.data, ["white", "green"])
def run(self):
self.occupied = dict()
agent_count = 100
print(self.historia)
for i in range(agent_count):
Agent(self)
self.env.process(self.plot())
self.histupdate()
env = simpy.Environment()
village = Village(env, 50,10,5,50)
village.run()
根据http://simpy.readthedocs.org/en/latest/api_reference/simpy.core.html#simpy.core.Environment.process,
process
方法需要一个生成器参数,但是您没有从move
方法中得到任何结果,因此会得到错误。在相关问题 更多 >
编程相关推荐