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授权的。有关详细信息,请参见文件复制。
链接
启动板上的stepsim:https://launchpad.net/stepsim
Ohloh上的stepsim:https://www.ohloh.net/p/stepsim
免费代码上的stepsim:http://freecode.com/projects/stepsim
python包索引中的stepsim:http://pypi.python.org/pypi/stepsim