哪个类应该存储查找表? [关闭]

2024-04-25

世界上有不同地点的代理,但任何地点都只有一个代理。每个特工都知道他在哪里,但我还需要快速检查给定位置是否有特工。因此,我还维护了一张从位置到代理的地图。我在决定这张地图属于哪里时遇到问题:class World, class Agent(作为类属性)或其他地方。

下面我放了查找表,agent_locations, in class World。但现在代理必须打电话world.update_agent_location每次他们搬家的时候。这很烦人;如果我稍后决定跟踪代理的其他信息(除了他们的位置)怎么办?我是否需要添加对整个世界对象的回调Agent code?

class World:
  def __init__(self, n_agents):
    # ...
    self.agents = []
    self.agent_locations = {}
    for id in range(n_agents):
      x, y = self.find_location()
      agent = Agent(self,x,y)
      self.agents.append(agent)
      self.agent_locations[x,y] = agent
  def update_agent_location(self, agent, x, y):
    del self.agent_locations[agent.x, agent.y]
    self.agent_locations[x, y] = agent
  def update(self): # next step in the simulation
    for agent in self.agents:
      agent.update() # next step for this agent
  # ...

class Agent:
  def __init__(self, world, x, y):
    self.world = world
    self.x, self.y = x, y
  def move(self, x1, y1):
    self.world.update_agent_location(self, x1, y1)
    self.x, self.y = x1, y1
  def update():
    # find a good location that is not occupied and move there
    for x, y in self.valid_locations():
      if not self.location_is_good(x, y):
        continue
      if self.world.agent_locations[x, y]: # location occupied
        continue
      self.move(x, y)

我可以改为agent_locations in class Agent作为类属性。但这仅在我有一个时才有效World目的。如果我稍后决定实例化多个World对象,查找表需要是世界特定的。

我确信有更好的解决方案...

编辑:我在代码中添加了几行来展示如何agent_locations用来。请注意,它只能从内部使用Agent对象,但我不知道这种情况是否会永远保持下去。


好吧,我想我可以提供我的答案,这可能更多的是一种意见,而不是明确的“这样做”(我没有接受过任何正式的编程培训)。

我觉得你agent_locations应该是每个的成员World实例。

我尝试主要从界面角度进行思考。在我看来,世界级应该负责管理你的世界的资源,在本例中是空间。自从World是空间经理,代理商应该询问他们的world如果空间可用(即未占用),则彼此不存在。因此,我认为你的self.location_is_good更合适的称呼是self.world.is_location_available(x, y) [1]

这使得世界很自然地负责查找给定空间的可用性。世界级还可能有其他变量来决定空间是否可用。如果那里有灌木丛怎么办?或者其他的东西。您可能已经有某种桌子可供您使用(x, y)每个世界的坐标。 “被占用”可以是这些对象的属性。

此外:你的世界已经知道每个代理的状态(通过[(agent.x, agent.y) for agent in self.agents][2])。这agent_locationsdict 本质上是这些属性的索引或缓​​存,因此属于World.

关于将状态送回的痛苦World...好吧,你不会通过以下方式解决这个问题Agent而是这样做。但做update_agent_location(self, agent, x, y)是完全多余的,因为x == agent.x; y == agent.y(如果你颠倒你调用它的行)。你可以在 World 中简单地使用一种方法,update_agent_state(self, agent),World 可以使用它来更新其索引。您甚至可以提交一个额外的参数来描述状态更改的类型(如果您不想每次都更新所有属性)。

class World(object):
  # ...
  def update_agent_state(self, agent, state_change=None):
    # Update properties based on what changed, or
    # drop state_change param and update everything everytime
    if state_change == Agent.LOCATION_CHANGE:
      self.agent_locations[agent.x, agent.y] = agent
    elif state_change == Agent.WHATEVER:
      pass

class Agent(object):
  LOCATION_CHANGE = 1

  def update(self):
    for x, y in self.valid_locations():
      if not self.can_move_to(x, y)
        continue

      self.move(x, y)

  def can_move_to(self, x, y):
    """Determines if x, y is a location where we can move."""
    if not self.world.is_location_available(x, y):
      return False
    if not self.has_money_to_travel_to(x, y):
      return False

    return True

  def move(self, x, y):
    """Moves to x, y and notifies world of state change."""
    self.x = x
    self.y = y

    self.world.update_agent_state(self, Agent.LOCATION_CHANGE)

类似的东西(阅读我的脚注)。

[1] 当然,除非空间是自由的,否则位置的“好坏”取决于其他变量。例如。如果您只应搬到 (x, y),如果 1) 该位置可用并且 2) 代理有 1000 美元支付机票,那么您应该有Agent.can_move_to(x, y)它反过来调用世界的方法,并检查它的钱包。

[2] 我假设你的self.agents = {}是一个错字,因为你不能append在字典上。你的意思是一个列表([]) 正确的?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪个类应该存储查找表? [关闭] 的相关文章

  • python中热图的层次聚类

    我有一个 NxM 矩阵 其值范围为 0 到 20 我可以使用 Matplotlib 和 pcolor 轻松获得热图 现在我想使用 scipy 应用层次聚类和树状图 我想重新排序每个维度 行和列 以显示哪些元素相似 根据聚类结果 如果矩阵是方
  • 引发 RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 导入 fitz 时目录 'static/' 不存在

    当我运行 extract img py 文件时出现此错误 RuntimeError f 目录 directory 不存在 运行时错误 导入 fitz 时不存在目录 static 我不明白为什么这会给我发回此错误消息 我之前看到过关于这个话题
  • 创建一个打开文件并创建字典的函数

    我有一个正在处理的文件 我想创建一个读取文件并将内容放入字典中的函数 然后该字典需要通过 main 函数传递 这是主程序 它无法改变 我所做的一切都必须与主程序配合 def main sunspot dict file str raw in
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • 使用字母而不是数字进行顺序计数[重复]

    这个问题在这里已经有答案了 我需要一种方法 将字符串 递增 到 z 然后将 aa 递增到 az 然后将 ba 递增到 bz 依此类推 就像 Excel 工作表中的列一样 我将向该方法提供前一个字符串 它应该增加到下一个字母 PSEUDO C
  • 对图像使用 Pixellib 自定义训练时出现 input_image 元形状错误

    我正在使用 Pixellib 来训练自定义图像实例分割 我创建了一个数据集 可以在下面的链接中看到 数据集 https drive google com drive folders 1MjpDNZtzGRNxEtCDcTmrjUuB1ics
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • 属性错误:类型对象“图像”没有属性“打开”

    Exception in Tkinter callback Traceback most recent call last File C Python34 lib tkinter init py line 1482 in call retu
  • Selenium:等到 WebElement 中的文本发生变化

    我在用着selenium使用Python 2 7 从网页上的搜索框检索内容 搜索框动态检索结果并在框本身中显示结果 from selenium import webdriver from selenium webdriver common
  • 当 DetailView 遇到时更新模型字段。 [姜戈]

    我有一个类似的 DetailViewviews py views py class CustomView DetailView context object name content model models AppModel templa
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • 在Python中计算结构体的CRC

    我有以下结构 来自 C 中的 NRPE 守护程序代码 typedef struct packet struct int16 t packet version int16 t packet type uint32 t crc32 value
  • Flask SQLAlchemy 与 MyPy - 模型类型错误

    我遇到了以下组合问题flask sqlalchemy and mypy 当我定义一个新的 ORM 对象时 例如 class Foo db Model pass where db是使用创建的数据库SQL炼金术应用于flask app mypy
  • 使用 Flask-SQLAlchemy 进行多对多多数据库连接

    我正在尝试使这个多对多联接与 Flask SQLAlchemy 和两个 MySQL 数据库一起工作 并且它非常接近 只是它为联接表使用了错误的数据库 这是基础知识 我有main db and vendor db 表格设置为main db u
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • 网页抓取 - 如何识别网页上的主要内容

    给定一个新闻文章网页 来自任何主要新闻来源 例如时报或彭博社 我想识别该页面上的主要文章内容 并丢弃其他杂项元素 例如广告 菜单 侧边栏 用户评论 在大多数主要新闻网站上都可以使用的通用方法是什么 有哪些好的数据挖掘工具或库 最好是基于Py
  • psutil:测量特定进程的CPU使用率

    我正在尝试测量进程树的 cpu 使用率 目前获取进程 没有子进程 的 cpu usage 就可以了 但我得到了奇怪的结果 import psutil p psutil Process PID p cpu percent 还给我float g
  • Jinja2中获取请求参数

    如何检索请求参数a在 Jinja2 模板中 http foo bar a 1 我这个答案有点晚了 但其他解决方案并没有真正考虑到您对 Flask 的使用 事实上 您将 Flask 与 Jinja2 一起使用 这使得您的情况与其他框架有点不同
  • 使 matplotlib 图形默认看起来像 R?

    Is there a way to make matplotlib behave identically to R or almost like R in terms of plotting defaults For example R t
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i

随机推荐

  • Eclipse:删除无法加载的插件

    每当我启动 Eclipse 副本时 都会收到以下错误消息 我对这些插件不感兴趣 无论如何我都不能使用 Java 8 因为我不会让你厌烦 所以安装它们是没有意义的 我进入 帮助 gt 安装详细信息 菜单 正如 SO 上的各种帖子中所建议的那样
  • 在 Android Studio MacOS 中清理项目时出现“ninja”错误

    我在 macos mojave 中使用 Android Studio 3 5 我有一个项目 在一个文件夹中包含 java 和 ndk 代码 我们称之为 project folder A 我复制了这个文件夹 将其重命名为 project fo
  • 将脚本库应用于时间轴

    这是我之前问题的后续 如果这个问题太复杂而无法在这里回答 我深表歉意 我试图能够在时间线视图中显示我的数据 我在这里找到了谷歌的时间线脚本 https developers google com chart interactive docs
  • 检查lua中是否存在目录?

    如何检查 lua 中是否存在目录 如果可能的话最好不使用 LuaFileSystem 模块 尝试做类似以下 python 行的事情 os path isdir path 这是一种在 Unix 和 Windows 上都适用的方式 无需任何外部
  • 从字符串中删除转义序列 '\' 以将其转换为 XmlDocument

    我有一个返回 struct 对象的 Web 服务 因此我得到以下 XML 字符串形式的响应 现在我需要将其加载到 XmlDocument 对象中 但如何删除字符串中的转义序列 每个 的 都会导致错误
  • AVPlayer - UILabel 在视频上不可见

    NSString urlPath NSURL videoUrl urlPath NSBundle mainBundle pathForResource fogLoop ofType mp4 videoUrl NSURL fileURLWit
  • Firebase 聚合属性值,无需获取所有相关文档

    我有以下 firebase 结构 company1 name Company One invoices invoice1 amount 300 currency EUR timestamp 1572608088 invoice2 amoun
  • 子类化 UICollectionViewCell 导致永远不会被选择

    我尝试对 UICollectionViewCell 进行子类化并从 nib 文件加载 id initWithFrame CGRect frame self super initWithFrame frame if self NSArray
  • 将 WebGL 应用程序部署为本机 iOS 或 Android 应用程序?

    有谁知道如何将 WebGL 应用程序部署为本机 iOS 或 Android 应用程序 商业中间件是可以接受的 但开放项目会更好 谢谢 作为 Joris 答案的延伸 这似乎是基于内森 德弗里斯的作品 http atnan com blog 2
  • 使用破折号显示 URL slug 时出现问题

    我为我的故事 URL 创建了一个带有破折号的 slug 例如 使用 slug 而不是 ID 来获取记录 https stackoverflow com questions 482636 fetching records with slug
  • 视频文件中的感兴趣区域

    这是我第一次在这里发帖 希望能得到积极的结果 因为我的研究已接近尾声 我想在我的代码中添加一个函数 该函数将仅处理视频文件的定义的感兴趣区域 我无法发布图片 因为我还没有声誉 但这里发布了同样的问题 gt http answers open
  • OpenCV的calcOpticalFlowPyrLK抛出异常

    一段时间以来 我一直在尝试使用 OpenCV 构建一个小型光流示例 除了函数调用 calcOpticalFlowPyrLK 之外 一切正常 该函数在控制台窗口中打印以下失败的断言 OpenCV错误 断言失败 mytype typ0 CV M
  • 将文本单词换行

    我使用下面的代码来包装长文本 由用户在文本区域中输入以进行评论 function addNewlines comments var result while trim comments length gt 0 result comments
  • 拖动并 connectToSortable 到 iframe 内的可排序 DIV 中

    我试图将一个元素从主页拖动到其中的 iframe 并在框架内使用可排序的 div 我能够使 div 可排序 并将可拖动的内容连接到可排序的内容 但元素放置的位置计算错误并在错误的位置排序 可能是因为iframe内的鼠标坐标与主页的位置不同
  • 数据列表验证中 Obj.length>0 错误

    我有一个脚本 我通过 tempmankey 在网站上运行它 该脚本基本上是在输入字段中插入数据列表 并根据数据列表选择的值更改其他输入值 code function bdi contains Truck No closest div nex
  • 如何检测Vista UAC是否启用?

    我需要我的应用程序根据是否启用 Vista UAC 来表现不同 我的应用程序如何检测用户计算机上的 UAC 状态 该注册表项应该告诉您 HKLM SOFTWARE Microsoft Windows CurrentVersion Polic
  • 定制 iPhone 键盘

    我需要 即客户要求 提供自定义键盘 供用户在文本字段和区域中输入文本 我已经有一些可以执行键盘操作并将测试附加到文本字段的东西 但是我想让它更通用并让它像标准的 iphone 键盘一样工作 即当用户选择可编辑文本控件时出现 目前我的控制器知
  • 使用 BrokeredMessage 从 Azure 服务总线队列 (v1) 反序列化强类型对象

    无论出于何种原因 我似乎无法弄清楚如何将我的对象从队列中取出并将其反序列化回它放入其中的内容 An账户事件DTO Azure函数成功将对象放入队列 FunctionName AccountCreatedHook public static
  • 从groupby中的列获取模式[重复]

    这个问题在这里已经有答案了 我试图获取 groupby 对象中列的模式 但出现此错误 incompatible index of inserted column with frame index 这是我遇到的问题 我不知道如何解决它 任何帮
  • 哪个类应该存储查找表? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 世界上有不同地点的代理 但任何地点都只有一个代理 每个特工都知道他在哪里 但我还需要快速检查给定位置是否有特工 因此 我还维护了一张从位置到代理