Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“无”不是发电机;Python中的El-Farol算法_Python_Class_Generator_Netlogo - Fatal编程技术网

&引用;“无”不是发电机;Python中的El-Farol算法

&引用;“无”不是发电机;Python中的El-Farol算法,python,class,generator,netlogo,Python,Class,Generator,Netlogo,我正在用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

我正在用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
->
gen\u loc
->
najlepsza
(英语-最佳)->
do\u 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()
导入simpy
随机输入
输入数学
将matplotlib.pyplot作为plt导入
将numpy作为np导入
导入matplotlib.colors
从gridplot导入gridplot
白色\绿色=matplotlib.colors.ListedColormap([“绿色”、“白色”])
plt.寄存器\u cmap(cmap=白色\u绿色)
类代理:
定义初始(自我,村庄):
self.village=村庄
self.color=1
self.loc=self.gen_loc()
self.village.env.process(self.move())
def gen_loc(自身):
如果self.najlepsza()0.33:
self.loc=(random.randrange(0,数学层(self.village.village_dim/2)-1,
random.randrange(0,self.village.village_dim)))
如果self.loc不在self.village.occumped内:
self.village.och[self.loc]=self
其他:
self.loc=(random.randrange(数学层(self.village.village\u dim/2)、self.village.village\u dim),
random.randrange(0,数学层(self.village.village_dim/2)-1))
如果self.loc不在self.village.occumped内:
self.village.och[self.loc]=self
def najlepsza(自身):

如果self.village.env.now根据,则
过程
方法需要一个生成器参数,但是您没有从
移动
方法中产生任何结果,因此您会得到错误。

将新属性添加到
初始化
方法之外的类实例被认为是一个非常坏的习惯,但您还是这样做了。应在初始化步骤中创建所有属性。如果没有正确的值,请将它们设置为
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()