stepsim-python基于step的仿真包

stepsim的Python项目详细描述


关于

stepsim是用python编写的基于step的轻量级仿真模块。 它可以对离散系统进行简单的实时仿真。斯特普西姆 支持分步模拟或运行到中断条件 发生。

模拟由容器转换器组成。a容器 存储特定类型的离散数量的单位。aconverter绘制 一个或多个容器中的单元,并将结果传递给另一个容器 集装箱。

stepsim甚至不尝试进行任何并行处理。它 按固定顺序处理转换器循环。

先决条件

python(在python 3.1.2和2.6.5上测试) http://www.python.org

安装

解压缩文件,然后在命令行运行

python setup.py install

运行测试

打开shell/dos窗口,导航到stepsim目录,然后运行

python -m doctest README

文档

要阅读api文档,请打开shell/dos窗口,导航到 stepsim目录,然后运行

pydoc stepsim

您可以使用

pydoc -w stepsim

示例

首先导入STEPSIM模块:

>>> import stepsim

要获得详细输出,请激活登录控制台:

>>> stepsim.log_to_stdout()
>>> stepsim.loglevel("debug")

现在创建一些容器:

>>> cashbox = stepsim.Container("cashbox", "EUR", 10)
>>> storage = stepsim.Container("storage", "parts")

然后创建一个转换器并设置牵引输出比:

>>> buyer = stepsim.Converter("buyer", 2, (cashbox, 3), (storage, 2))
buyer: Adding source 'cashbox', drawing 3 EUR per step.

从任何转换器列表中,我们都可以得到一个仿真里程碑列表 导致结束条件(不显式创建 模拟):

>>> stepsim.loglevel("info")
>>> stepsim.milestones("storage == 3", [buyer])
------------------------------
Milestones to achieve storage == 3:
<BLANKLINE>
Milestone:
6 EUR in cashbox (10 delivered, 166.67%)
total: 100.0%
<BLANKLINE>
Milestone:
3.0 parts in storage (0 delivered, 0.0%)
total: 0.0%
------------------------------
[<Milestone (cashbox: 6) 100.0%>, <Milestone (storage: 3.0) 0.0%>]

让我们创建一个模拟:

>>> stepsim.loglevel("debug")
>>> s = stepsim.Simulation(buyer)
Adding converter 'buyer' to simulation.
Current containers: ['cashbox', 'storage']
>>> s
<Simulation, converters: [<buyer: converting from ['cashbox'] to storage>], containers: [<cashbox: 10 EUR in stock>, <storage: 0 parts in stock>]>

step()方法用于将模拟提前一步:

>>> stepsim.loglevel("info")
>>> s.step()
buyer: Drawing 3 EUR from cashbox.

也可以检查中间的条件。模拟 实例提供了一种方便的方法来使用字符串来执行此操作 描述条件:

>>> s.check("cashbox == 10")
False
>>> s.check("cashbox != 10")
True
>>> s.check("storage >= 0")
True

可以评估它将采取多少步骤,直到 满足条件:

>>> stepsim.be_quiet()
>>> s.estimate_finish("storage == 2", 100)
4

在幕后,这将运行模拟的副本。最大值 步长值将防止在不可能的情况下挂起:

>>> s.estimate_finish("cashbox < 1", 100)
100

当您移除转换器时,它的最后一步将被还原。请注意 这不会倒带模拟步进计数器。

>>> stepsim.log_to_stdout()
>>> stepsim.loglevel("debug")
>>> s.step()
buyer: Conversion in progress, 2 steps left.
Active Container of buyer: None
>>> s.remove_converter("buyer")
reverting last draw from 'buyer'
buyer: returning 3 EUR to cashbox.
Removing converter 'buyer' from simulation.
Current containers: []

可以限制转换器将 交付。

>>> buyer.set_max_units(3)
buyer: setting max_units to 3

请注意,此命令将重置已发送单元的计数器。

通过逐步模拟,我们可以检查转换器 停止。

>>> s.add_converter(buyer)
Adding converter 'buyer' to simulation.
Current containers: ['cashbox', 'storage']
>>> s.step()
buyer: Ready to draw resources
buyer: Drawing 3 EUR from cashbox.
cashbox has 7 EUR left now.
buyer: Setting processing countdown to 2 steps
Active Container of buyer: <cashbox: 7 EUR in stock>
>>> s.step()
buyer: Conversion in progress, 2 steps left.
Active Container of buyer: None
>>> s.step()
buyer: Conversion in progress, 1 steps left.
Active Container of buyer: None
>>> s.step()
buyer: Delivering 2 parts to storage.
storage stock is 2 parts now.
buyer has delivered 2 units since last reset.
Active Container of buyer: <storage: 2 parts in stock>
>>> s.step()
buyer: delivered 2 units and would deliver 2 next step, max units is 3, no action.
>>> s.step()
buyer: delivered 2 units and would deliver 2 next step, max units is 3, no action.

最大单位数设置为-1,转换器将交付 无限的数目。这是默认设置。

>>> buyer.set_max_units(-1)
buyer: setting max_units to -1

可以通过以下方法临时改变变频器的速度 给出临时步骤值和持续时间。此方法将返回 如果更改成功,则为true:

>>> buyer.set_temporary_steps(4, 4)
buyer: setting steps = 4 for 4 steps
buyer: setting remaining countdown to -1
True
>>> s.step()
buyer: Ready to draw resources
buyer: Drawing 3 EUR from cashbox.
cashbox has 4 EUR left now.
buyer: Setting processing countdown to 4 steps
Active Container of buyer: <cashbox: 4 EUR in stock>
>>> s.step()
buyer: Conversion in progress, 4 steps left.
Active Container of buyer: None
>>> s.step()
buyer: Conversion in progress, 3 steps left.
Active Container of buyer: None
>>> s.step()
buyer: Conversion in progress, 2 steps left.
Active Container of buyer: None
>>> s.step()
buyer: Conversion in progress, 1 steps left.
Active Container of buyer: None
>>> s.step()
buyer: Delivering 2 parts to storage.
storage stock is 4 parts now.
restoring buyer.steps to 2
buyer has delivered 2 units since last reset.
Active Container of buyer: <storage: 4 parts in stock>

我们可以从当前状态运行模拟直到结束条件 是满意的。在这种情况下,我们让它运行,直到买方不能购买任何 其他部分:

>>> s.run(lambda: not buyer.last_step_successful)
Starting simulation.
--- Step 15: -----------------------------------------------
buyer: Ready to draw resources
buyer: Drawing 3 EUR from cashbox.
cashbox has 1 EUR left now.
buyer: Setting processing countdown to 2 steps
Active Container of buyer: <cashbox: 1 EUR in stock>
--- Step 16: -----------------------------------------------
buyer: Conversion in progress, 2 steps left.
Active Container of buyer: None
--- Step 17: -----------------------------------------------
buyer: Conversion in progress, 1 steps left.
Active Container of buyer: None
--- Step 18: -----------------------------------------------
buyer: Delivering 2 parts to storage.
storage stock is 6 parts now.
buyer has delivered 4 units since last reset.
Active Container of buyer: <storage: 6 parts in stock>
--- Step 19: -----------------------------------------------
buyer: Ready to draw resources
buyer: Cannot draw 3 EUR from cashbox, only 1 left.
Active Container of buyer: None
--- Break condition met, simulation finished. ---------------
Final state after 19 steps:
<cashbox: 1 EUR in stock>
<storage: 6 parts in stock>

可以用点图语言导出模拟图(请参见 http://www.graphviz.org/):

>>> s.save_dot("part_buyer.dot")
Writing DOT file.
digraph {
    graph [size=5] ;
    node [fontsize=10, fontname="Bitstream Vera Sans"] ;
    "cashbox" [shape=box];
    "cashbox" -> "buyer" ;
    "storage" [shape=box];
    "buyer" -> "storage" ;
}
<BLANKLINE>

清理:

>>> import os
>>> os.remove("part_buyer.dot")

文件“making_cakes.py”显示了一个更详细的示例。它是 包含在zip存档中,并将安装在 “共享/doc/stepsim/examples”。

许可证

STEPSIM是根据GPL授权的。有关详细信息,请参见文件复制。

作者

弗洛里安·伯杰

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
junit无法从另一个java类访问方法   java Android打开对话框   使用JUnit的java测试控制台输出   java使用信号量从2个线程打印可选输出   在Java中,如何计算字符串开头出现的字符数   多线程单元测试Java多线程socket服务器   java如何使用aspectj创建jar?日食   java出现意外错误(类型=内部服务器错误,状态=500)。org/eclipse/jdt/internal/compiler/env/INameEnvironment   java重用Tomcat配置在节点之间发送消息   swing如何在Java中的表中的列中添加复选框   java为什么这个程序显示错误?   java在Android中将编码的base64图像转换为文件对象   带H2的java Hibernate不存储数据   mysql建议:使用JFrame的Java GUI   JavaAntlr没有为Scala语法提供正确的输出标记   数学Java把负数变成1,把正数变成1   java如何将网页中的小程序包含在不同的目录中?