时间分布和在任何逻辑中花费的时间

Time Distribution and time spent in process in anylogic

我正在研究生产模型,其中原始 material 的输入是按小时计算的,我 运行 8 小时的模型(1 个班次)所以基本上 16 小时的资源闲置。当我没有使用计划部分和 运行 模型 8 * 7 小时(56 小时)时,每个作业的时间测量都很好,但现在当我安排输出时,它也包括空闲时间。那么我如何才能只计算繁忙时间才能看到一个工作在车间中花费的平均时间(从原始material到完成好。

This the time spent by a job in a process it should be 34-16= approx 18

首先,请注意:虽然您声明您 运行 8 小时轮班,但早上 8 点到下午 6 点的时间段实际上是 10 小时,所以我将在此解决方案中忽略它,而是假设轮班实际上是 8 小时 运行 从 9:00 到 17:00.

下面是一个用来测试的简单模型(模型时间单位是SECONDS):

完成这项工作有 4 个要素:

  1. Service 必须配置为允许抢占任务恢复,这是通过使用 Priorities / preemption 选项完成的,如下所示:

  1. ResourcePool 必须配置为 'End of Shift' 抢占,如下所示:

  1. 真实时间的计算(不包括轮班之间的停滞时间)在 f_calcTATsec 函数中完成:
// get 'Service' enter time for that agent
double startTime = col_startTimesSec.get(_agent);

// calculate time spent
double timeSpent = time() - startTime;

traceln("%.2f: agent spent %.2f in service", time(), timeSpent);
traceln("%.2f: 8hrs is %.2f, 16hrs is %.2f", 
    time(), (8 * hour()), (16 * hour()));

// below is a ternary statement which says:
//   if 'timeSpent' is less than 8 hrs then use it
//   otherwise 
//      exclude whole 16 hr periods (can be more than 1) 
//      and use the remainder
double trueTimeSpent = timeSpent <= (8 * hour()) ? 
    timeSpent :
    timeSpent % (16 * hour());

// return time spent
traceln("%.2f: returning %.2f", time(), trueTimeSpent);
return trueTimeSpent;
  1. Service对象需要配置记录col_startTimeSec集合中每个Agent的进入时间,然后调用f_calcTATsec() 函数退出时,即 On enter = col_startTimesSec.put(agent, time()); and On exit = double trueTimeSpentSec = f_calcTATsec(agent);

When i was not using the schedule part and running the model for 8 *7 hours ( 56 hours) then the time measurement for each job is fine but now when i schedule the output it include the idle time also

所以我假设您正在使用 TimeMeasureStart/End 块来进行系统时间测量。他们只是计算从开始块到结束块的经过时间,因此永远不会考虑“不应该计算的时间”。您不必使用这些块来计算时间;通常,您将相关的开始时间存储在流经流程的(自定义)代理类型中,然后根据需要计算相关的经过时间(例如,在服务块退出时,伪代码是“当前时间 - 时间 - entry = 块中经过的时间").

不过,首先,您需要更清楚地了解要计算的指标及其原因。您想要排除正在进行的(可能是抢占的)作业等待资源 return 轮班的时间。但是,那些正在排队 等待资源然后下班的作业呢?如果有多种可能的资源可以用于不同的轮班模式怎么办?更普遍的等待资源的作业(当资源轮班时)怎么样?

听起来您可能真正想要的是两者

  • 工作工作 花费的时间(比较等待任何事情)。
  • 经过的时间作业花费 等待 某事(通常是 Seize/Service 块中的资源 - 不仅仅是当任务被 shift-end 抢占时 - 但可以是其他等待机制,例如使用 Wait 块)。

后者就是总运行时间减去前者。

所以有多种方法可以解决这个问题。可能最简单的方法是保留您的总运行时间(通过 TimeMeasureStart/End 块),然后单独计算工作时间:将其作为变量存储在作业代理中,并添加到它具有 [=78= 的每个块中](例如,对于没有抢占的服务块,使用从占用到退出的持续时间,对于延迟块,使用从进入到退出的持续时间)。

要处理轮班结束抢占任务等待资源return轮班的情况,您可以使用服务块的“任务暂停”和“任务恢复”操作触发当任务暂停(由于抢占)或恢复(当原始资源可用时,如果这是您选择的抢占选项)。

这需要一个额外的变量来存储“当前持续时间开始时间”。

明确地说:

  • 在您的工作代理类型中输入 double 变量 cumulativeWorkingTimeMins
  • 在您的工作代理类型中输入 double 可变 currentWorkStartTimeMins

...对于服务块(处理抢占情况)

  • 'On seize unit'(或'On enter delay')agent.currentWorkStartTimeMins = time(MINUTE);
  • 的动作
  • 'On task suspended' agent.cumulativeWorkingTimeMins += (time(MINUTE) - agent.currentWorkStartTimeMins);
  • 的操作
  • 'On task resumed' agent.currentWorkStartTimeMins = time(MINUTE);
  • 的操作
  • 'On exit' agent.cumulativeWorkingTimeMins += (time(MINUTE) - agent.currentWorkStartTimeMins);
  • 的操作

[注意变量名中指定的单位要明确,获取当前时间时明确指定单位;这确保了代码对于更改模型时间单位是健壮的。]

注意:如果您真的只想减去抢占作业等待下班资源的时间return(并且没有其他等待时间)——这作为一个指标似乎没有意义——你仍然可以使用上面的变体来做到这一点,它只捕获等待时间。

(您还需要在作业完成后将相关的最终数字存储在某些 HistogramData 元素或类似元素中,以便能够在图表中显示此数据:TimeMeasureEnd 块会自动在他们的 distribution 变量中捕获此直方图数据,但是,当您自己计算时间时,您需要自己为图表存储数据。)