【问题标题】:Writing a simulation program in Python用 Python 编写模拟程序
【发布时间】:2015-08-22 17:02:17
【问题描述】:

我目前正忙于用 Python 编写模拟。我正在模拟改变叉车在仓库中存放托盘的逻辑对行驶距离的影响。我在看 5 辆叉车,每辆叉车都被分配到一份工作清单中,并使用数学模型来分配存放托盘的位置。存放托盘的区域被分成更小的子部分。所有 5 辆叉车使用相同的存储区域,但一次只允许一辆叉车进入一个子区域。

我目前面临的问题是编写代码的最佳方式是什么,以便这 5 辆叉车同时完成工作,同时跟踪每辆叉车在存储区域中的位置以及可用的托盘位置。

到目前为止,我已经编写了用于数学模型和单个叉车移动的代码。我目前正在试验多处理以允许所有 5 辆叉车并行移动。所以我创建了 5 个流程,每个叉车一个,然后在每个流程中我运行我的数学模型以找到最佳的托盘放置位置。但是,要进行移动,我需要有一个全局列表,其中包含所有其他叉车的位置以及可用的存储位置的信息。

那么你们认为如何最简单地跟踪有关叉车位置和存储位置的信息?多处理也是我应该解决这个问题的方向吗?

提前谢谢你。

【问题讨论】:

    标签: python multiprocessing simulation


    【解决方案1】:

    你的问题很笼统,所以我最多只能给你一个笼统的答案。

    有像kleptojoblib这样的代码提供函数调用的动态缓存,所以你可以将一个函数声明为“缓存”,它会存储结果(所以你不必重新计算给定相同的输入)。我提到这一点是因为klepto 提供了对内存、磁盘或数据库的存储抽象……因此您可以将结果缓存/存档到磁盘上的文件或数据库后端——这两者都可以通过并行进程访问(和在数据库的情况下,分布式计算资源上的进程)。 joblib 仅适用于文件后端,选项有限,但代码更成熟。

    kleptojoblib 都非常常用于存储和进程之间的某种形式的优化或预测科学类型问题的通信——这看起来就像你在做的那样。

    有较低级别的“自己滚动”解决方案,例如选择数据库模块并使用它,或写入文件,或使用pickle 将对象转储到磁盘……但joblibklepto 是旨在简化流程。

    https://github.com/uqfoundation/klepto

    https://github.com/joblib/joblib

    【讨论】:

    • 感谢您的回复。一般的答案是完美的。我正在努力让多个处理器共享信息,所以我想知道多处理是否会成为前进的方向。从我读到你的链接 klepto 可能会非常方便。
    • 以上代码与multiprocessing一起工作,所以这是一个选项。我不能说multiprocessing 是否是并行处理的正确选择,但是……因为这是一个权衡设置并行工作程序的开销与您打算并行运行的模拟函数的计算成本的问题。
    • 如果不使用多处理来使用多线程,您会怎么看?我在某处读到多线程并没有真正并行运行,但只有在计算变得激烈时才会引人注目。在我的进程/线程中发生的所有事情都是根据某个等式对作业列表(大约 30 个条目)进行排序,等待一段时间(完成作业的时间),然后在全局数组中更新作业。
    • 对于非常便宜的并行操作,由于启动多个进程而不是多个线程的开销,多线程可以比多处理快得多。在这种情况下,这可能是两条路线中更好的一条。您可以随时通过time.time(或%timeit 来自IPython)进行检查。
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 2011-01-24
    • 1970-01-01
    • 2021-04-07
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多