如何解决在由集合组成的网络中找到半径为n的代理的有效方法
上下文是基于 agent的模型,下面的代码示例是agent的基类。该代理具有“邻居”属性,该属性包含一个字典,该字典由一个键,网络名称和一个值,一组组成,该值包含该网络中的邻居。
我要提出的问题与方法有关:Agent.agents_in_radius()
。此方法应该在网络中存在的距离d
处查找代理。
示例:
给出一个如下组成的网络: 代理0通过“友谊”连接连接到代理1 代理1通过“友谊”连接连接到代理2
与(A)代理商0距离(d)1的代理商: 特工1
与(A)代理商0相距(d)2的代理商: 代理1,代理2
目前,我已经实现了此功能Agent.agents_in_radius()
,该功能除了效率不高外,甚至无法扩展(除非存在if条件,否则我无法要求距离n)。 有没有更有效,更可扩展的方法?
from numpy.random import default_rng
class Agent:
max_id = 0
network_names = [
'sibling','offspring','parent','partner','household','friendship','criminal','professional','school']
agents = list()
rng = default_rng()
def __init__(self):
self.networks_init()
self.unique_id = Agent.max_id
Agent.max_id = Agent.max_id + 1
Agent.agents.append(self)
def __repr__(self):
return "Agent: " + str(self.unique_id)
def networks_init(self):
"""
Initializes networks empty
:return: None
"""
self.neighbors = {i: set() for i in Agent.network_names}
def random_links(self):
"""
Adds random agents within sets
:return: None
"""
for net in Agent.network_names:
for i in range(0,Agent.rng.integers(0,min(len(Agent.agents),10))):
self.neighbors.get(net).add(Agent.rng.choice(Agent.agents))
self.neighbors.get(net).discard(self)
def _agents_in_radius1(self,context=network_names):
"""
Search for agents at a distance 1 from self. Those "self" reach by taking a single step
:param context: str,the network context
:return: set
"""
agents_in_radius = set()
for net in context:
if self.neighbors.get(net):
for agent in self.neighbors.get(net):
agents_in_radius.add(agent)
return agents_in_radius
def agents_in_radius(self,d,context=network_names):
"""
Search for agents at a distance d from self. Exclusively the agents that I reach by taking "d" steps.
:param d: int,distance
:param context: str,the network context
:return: set
"""
radius_1 = self._agents_in_radius1()
if d == 1:
return radius_1
if d >= 2:
radius_2 = set()
for agent_lv1 in radius_1:
for agent_lv2 in agent_lv1._agents_in_radius1(context):
radius_2.add(agent_lv2)
if d == 2:
radius_2.remove(self)
return radius_2
if d >= 3:
radius_3 = set()
for agent_lv2 in radius_2:
for agent_lv3 in agent_lv2._agents_in_radius1(context):
radius_3.add(agent_lv3)
if d == 3:
return radius_3
if __name__ == "main":
for a in range(100):
agent = Agent()
agent.random_links()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。