制造业维修模拟

maintsim的Python项目详细描述


维护sim

maintsim可用于对离散制造系统建模,其中组件随时间降级并接受维护。用户可以定义系统的配置和参数,以及要执行的维护策略。它建立在simpy离散事件模拟包上。

安装Maintsim

PIP安装维护

使用此软件包

要求

除了python 3.6+,maintsim还依赖以下包:

建立制造系统

工作流首先创建由以下参数定义的系统对象:

配置参数
  • 处理时间-串行线中每台机器的处理时间列表。
  • 间隔时间-部件到达系统中第一台机器之间的时间。默认值为1,这可确保第一台机器不会饿死。
  • 缓冲区大小-每台机器的缓冲区大小列表,或所有机器的缓冲区大小的整数值。默认值为1。对于n台机器,有n-1个缓冲区。

故障参数
  • 故障模式-当前为"降级"。每台机器都有相同的降级模式。默认情况下,机器不会降级。
    • "降级"-机器降级根据离散状态马尔可夫过程发生。目前只支持马尔可夫退化。需要指定故障参数,如下小节所述。
  • 计划的故障-模拟时间内发生的计划故障列表。每个窗体(位置、时间、持续时间)。计划故障不符合维护能力限制,且未与随机故障一起进行彻底测试。

马尔可夫退化参数

使用failure\u params参数指定降级模式有几个选项,应该作为字典传递。

  • 恒定降级速率-作为降级速率键的值传递,可以是单个浮点或每台机器的浮点列表。该值是在每个时间步降级一个单位的概率,因此应介于0和1之间。创建上双向退化转换矩阵。
  • 失败状态-如果指定了降级率,则每台计算机的最大运行状况(失败)状态可以作为失败状态键的值传递。默认失败状态为10。
  • 完整的降级转换矩阵-可以指定为一个numpy数组(在这种情况下,每台机器将受到相同的降级配置文件)或作为降级转换键的值的每台机器的数组列表。

如果failure_mode='降级'被传递到系统对象,则必须定义降级率降级转换。超过恒定降解速率的降解曲线尚未经过彻底测试。

维护参数

  • 维护策略-当前为'cm''cbm'
    • 'cm'-"纠正性维护"是默认策略,根据降级模式的确定,机器只有在完全故障时才能进行维修。
    • 'cbm'-"公司"基于状态的维护",一旦机器的状态达到规定的阈值,就会执行预防性维护。
  • 维护参数-定义指定维护策略的参数。对于cbm,计划维护的阈值列表。
    • 目前每台机器有11个健康状态,0表示完全健康,10表示故障状态。维护阈值应在此范围内。
  • repair_params-一个基于修复类型的scipy.stats冻结的修复时间离散分布的字典。
    • 例如,repair_params={'cm':stats.randint(10,20),'cbm':stats.randint(20,40)}
  • 维护容量可同时执行的最大维护作业数。当前,如果同时计划的维护作业数超过容量,则将以先进先出(FIFO)的方式进行处理。
  • 维护成本-按类型列出每种维护作业的成本字典。

系统状态参数

这些参数可以设置为在模拟之前初始化系统状态。默认情况下,系统以空缓冲区和运行状况良好的计算机开始。

  • 初始剩余处理-每台机器的剩余处理时间列表。默认情况下,这等于机器没有零件时的总处理时间。
  • 初始缓冲区-每个缓冲区的初始级别列表。
  • 初始运行状况-每台机器的初始运行状况列表。 当前未自动验证初始系统状态的有效设置。

创建自定义维护计划程序

系统对象可以接受一个附加的调度程序对象,该对象将确定当要维护的机器数量超过维护容量时如何安排维护作业。默认情况下,系统将使用由scheduler类定义的fifo调度程序。还可以创建继承自maintsim.scheduler类的自定义计划程序。这个新类应该包含一个choose\u next方法,该方法接受当前维护队列作为参数。然后,此方法应返回要分配维护的机器对象列表。每次从作业中释放维护资源时,都会执行choose\u next方法。

使用蒙特卡罗树搜索的自定义调度程序的示例(由mctsmcts包实现)如下所示:

importmaintsimimportmctsclassMCTSScheduler(maintsim.Scheduler):'''    Resolves maintenance scheduling conflicts using Monte Carlo tree search.    '''def__init__(self,time_limit=None,iteration_limit=None,**kwds):'''        Must specify either a time limit (in seconds) or iteration limit for the        MCTS.        '''super().__init__(**kwds)self.limit={}iftime_limitanditeration_limit:print('Error: cannot specify time and iteration limit.')eliftime_limit:self.limit['timeLimit']=time_limit*1000else:self.limit['iterationLimit']=iteration_limitdefchoose_next(self,queue):# formulate and solve MCTSmcts_schedule=mcts.mcts(**self.limit)best_action=mcts_schedule.search(initialState=MaintenanceState(self.system))next_machine=[self.system.machines[best_action-1]]returnnext_machine

模拟系统

当系统被实例化时,它将通过创建必要的对象来初始化,这些对象包括simpy环境、维护资源、机器和缓冲区。可以使用以下参数调用系统的simulate方法来运行模拟:

  • 标题-模拟的平铺,用于命名保存的任何文件。
  • 预热时间采集数据之前模拟运行的时间。有助于在观察前确保系统处于稳定状态。
  • sim_time-预热完成后模拟运行的持续时间。指标将根据这段时间内的系统性能来确定。
  • seed-模拟的随机种子。给定的种子应该总是产生相同的结果。
  • 详细-布尔型。true将打印模拟运行的摘要。false将抑制所有打印输出,如果正在运行许多复制,则可能首选打印输出。

模拟数据 西弗拉l创建数据帧以记录模拟运行的数据,并存储为系统对象的属性。

  • 状态数据-每一时间步骤中每台机器的剩余处理时间和缓冲级别。
  • 生产数据-每一时间步每台机器的生产量(单位)和吞吐量(单位/时间)。
  • 机器数据-每一时间步骤中每台机器的状态,包括机器是否正常工作、被阻塞或缺料。
  • 队列数据-每个时间步骤等待维护的机器数。
  • 维护数据-维护活动的日志,包括活动发生的时间、活动类型(纠正、预防等)、活动是什么(故障或维修)、持续时间或故障时间。

迭代模拟

一个系统可以使用系统进行多次模拟。迭代模拟法。此方法的参数为:

  • 复制-运行模拟的次数。
  • 预热时间采集数据之前模拟运行的时间。性能统计信息仅在经过此时间后收集。
  • sim_time-将模拟每个复制的持续时间。
  • 目标所有复制完成后将返回的目标值。选项包括:
    • 生产-以系统单位表示的生产量。
    • ppl-指定模拟时间内系统的永久生产损失。
    • 可用性-系统中机器的总体可用性百分比。
  • verbose-truefalse决定是否在完成所有复制后显示摘要统计信息。

一个简单的例子

以下是实施CBM政策的最小示例:

>>>importmaintsim>>>fromscipyimportstats>>>>>>system=maintsim.System(process_times=[3,5,4],...buffer_sizes=5,...failure_mode='degradation',...failure_params={'degradation rate':[0.25,0.1,0.2]},...maintenance_policy='CBM',...maintenance_params={'CBM threshold':[8,6,7]},...repair_params={'CM':stats.randint(20,30),...'CBM':stats.randint(10,20)},...maintenance_capacity=1)>>>system.simulate(warmup_time=100,sim_time=500)Simulationcompletein0.89sUnitsproduced:31Systemavailability:68.93%

计划功能

计划的主要功能包括

  • 模拟迭代的并行化
  • 提高了迭代模拟的效率
  • 导出系统模型以供重用

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

推荐PyPI第三方库


热门话题
JavaSpring重定向请求处理程序   SwingJava:拆分字符串并将其放入文本区域的   Java:标记“”上出现语法错误,此标记后面应为表达式   web服务Java RestService从日志文件写入和读取数据   java如何将ArrayList<String>转换为char数组,然后向后打印每个单词?   java SimpleDataFormat解析返回年终日期   加密Java aes解密bytebuffer,包括填充为空字节   java有没有办法从特定的if语句调用变量?   java从更新返回到渲染   spring GRPC Java登录测试   java为什么下面的代码不工作(StringBuffer.toString!=null)   java是一种可行的模式吗?   使用Spring集成测试的JavaOSGi片段   java jCommander为未知和未使用的值引发异常?   在imageView的editText中输入的java图像URL