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第三方库


热门话题
有没有一种简单的方法可以从Java中相同接口的多个实现中创建级联函数?   活动MQ和Amazon MQ之间的java差异   java如何在使用来自webfront的jackson配对json字符串时忽略无效值并设置空值?   java如何确定JMock模拟对象正在模拟哪个类?   java Tarjan的周期检测:缺少周期   JRadioButton名称的名称空间Java操作侦听器   安卓我可以读取Java中嵌套的公共静态抽象类中的公共静态final字段吗   即使终端配置正确,Java也无法显示Unicode字符   java如何使用JPA条件查询编写此查询?   需要帮助为这个Java程序开发一个合适的打印方法吗   图片哪里可以找到java ImageIo源代码?   java正则表达式查找方法调用   java组织。jvnet。哈德逊。测验JellyTestSuiteBuilder$JellyTestSuite异常:不兼容ClassChangeError:实现类   从div到PDF?JavaEE、jQuery、PGSQL   JVM(Java虚拟机)是一种抽象机器。   spring如何使用用户名和密码来构建URL,以使用基本Java身份验证访问RESTAPI?   java合并2个链表   使用ServerSocket引发java ConnectException   java IBM JMS MQ在MQM头中添加用户ID