在 Python 中使用 Mesa 库时,是否可以在多代理系统中定义子代理?
Is there anyway to define subagents in a multiagent system while using Mesa library in Python?
我正在尝试使用 Mesa 库在 python 中编写一个多代理系统,虽然该库对像我这样的初学者来说很棒(不像 Spade 之类的东西,我发现它太复杂了),我不知道如何使用该库定义子代理。
这是一个非常基本的代理系统的基本代码
from mesa import Agent
from mesa import Model
import random
class Device(Agent):
def __init__(self, unique_id, model, energy, threshold, status):
super().__init__(unique_id, model)
self.energy = energy
self.threshold = threshold
self.status = 0
def _cost(self, price):
self.elec_cost = price*self.energy
def run(self, price):
print('price:', price)
self._cost(price)
if self.elec_cost > self.threshold:
self.status = 0
elif self.elec_cost <= self.threshold:
self.status = 1
def getStatus(self):
if self.status == 1:
return 'on'
elif self.status == 0:
return 'off'
class Fan(Device):
def __init__(self, unique_id, model, energy=0.06, threshold=0.55, status=0):
super().__init__(unique_id, model, energy, threshold, status)
class Light(Device):
def __init__(self, unique_id, model, energy=0.06, threshold=0.55, status=0):
super().__init__(unique_id, model, energy, threshold, status)
class HVAC(Device):
def __init__(self, unique_id, model, energy=3, threshold=31, status=0):
super().__init__(unique_id, model, energy, threshold, status)
class HomeModel(Model):
def __init__(self):
self.fan1 = Fan(1, self)
self.fan2 = Fan(2, self)
self.light1 = Light(3, self)
self.light2 = Light(4, self)
def run(self):
self.price = get_Price()
self._run(self.fan1)
self._run(self.fan2)
self._run(self.light1)
self._run(self.light2)
def _run(self, x):
x.run(self.price)
print(x.unique_id, 'is: ', x.getStatus())
def get_Price():
priceSet = [8, 9, 7, 9, 7, 7, 6, 8, 9, 7, 7, 10, 13, 4, 7, 9, 7, 9, 10, 11, 14, 13]
return random.choice(priceSet)
model = HomeModel()
model.run()
我想测试的是,我想看看我是否可以将它扩展到一个社区,而不是只有一个房子的模型,所以我希望将每个房子定义为一个代理一个完整模型的模型,其中电器作为该房屋的子代理。我想过让每个房子都成为代理并将设备定义为子代理,但是代理的每个实例都将其所属模型的实例作为参数,所以我对如何在房屋代理中定义设备代理感到困惑。
我知道也可能有其他方法可以做到这一点,但我对 python 还比较陌生(使用它还不到 3 个月),所以我无法弄清楚其他方法可能是什么。如果有人能在这里指导我,我将不胜感激。
我会添加一个家庭 class,里面有设备。然后将主页添加到您的代理时间表。
例如:
class Home(Agent):
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
self.fan1 = Fan(1, self)
self.fan2 = Fan(2, self)
self.light1 = Light(3, self)
self.light2 = Light(4, self)
class HomeModel(Model):
def __init__(self):
self.schedule = RandomActivation(self)
for i in range(some_number_of_houses):
a = Home(i, self) #This will then add a house with the devices you want
# an object within an object
我正在尝试使用 Mesa 库在 python 中编写一个多代理系统,虽然该库对像我这样的初学者来说很棒(不像 Spade 之类的东西,我发现它太复杂了),我不知道如何使用该库定义子代理。
这是一个非常基本的代理系统的基本代码
from mesa import Agent
from mesa import Model
import random
class Device(Agent):
def __init__(self, unique_id, model, energy, threshold, status):
super().__init__(unique_id, model)
self.energy = energy
self.threshold = threshold
self.status = 0
def _cost(self, price):
self.elec_cost = price*self.energy
def run(self, price):
print('price:', price)
self._cost(price)
if self.elec_cost > self.threshold:
self.status = 0
elif self.elec_cost <= self.threshold:
self.status = 1
def getStatus(self):
if self.status == 1:
return 'on'
elif self.status == 0:
return 'off'
class Fan(Device):
def __init__(self, unique_id, model, energy=0.06, threshold=0.55, status=0):
super().__init__(unique_id, model, energy, threshold, status)
class Light(Device):
def __init__(self, unique_id, model, energy=0.06, threshold=0.55, status=0):
super().__init__(unique_id, model, energy, threshold, status)
class HVAC(Device):
def __init__(self, unique_id, model, energy=3, threshold=31, status=0):
super().__init__(unique_id, model, energy, threshold, status)
class HomeModel(Model):
def __init__(self):
self.fan1 = Fan(1, self)
self.fan2 = Fan(2, self)
self.light1 = Light(3, self)
self.light2 = Light(4, self)
def run(self):
self.price = get_Price()
self._run(self.fan1)
self._run(self.fan2)
self._run(self.light1)
self._run(self.light2)
def _run(self, x):
x.run(self.price)
print(x.unique_id, 'is: ', x.getStatus())
def get_Price():
priceSet = [8, 9, 7, 9, 7, 7, 6, 8, 9, 7, 7, 10, 13, 4, 7, 9, 7, 9, 10, 11, 14, 13]
return random.choice(priceSet)
model = HomeModel()
model.run()
我想测试的是,我想看看我是否可以将它扩展到一个社区,而不是只有一个房子的模型,所以我希望将每个房子定义为一个代理一个完整模型的模型,其中电器作为该房屋的子代理。我想过让每个房子都成为代理并将设备定义为子代理,但是代理的每个实例都将其所属模型的实例作为参数,所以我对如何在房屋代理中定义设备代理感到困惑。
我知道也可能有其他方法可以做到这一点,但我对 python 还比较陌生(使用它还不到 3 个月),所以我无法弄清楚其他方法可能是什么。如果有人能在这里指导我,我将不胜感激。
我会添加一个家庭 class,里面有设备。然后将主页添加到您的代理时间表。
例如:
class Home(Agent):
def __init__(self, unique_id, model):
super().__init__(unique_id, model)
self.fan1 = Fan(1, self)
self.fan2 = Fan(2, self)
self.light1 = Light(3, self)
self.light2 = Light(4, self)
class HomeModel(Model):
def __init__(self):
self.schedule = RandomActivation(self)
for i in range(some_number_of_houses):
a = Home(i, self) #This will then add a house with the devices you want
# an object within an object