4.多设备串联

某制造系统有5个工作站(station),任务到达的间隔时间服从以0.85小时为均值的指数分布。有1、2、3三种任务,他们出现的概率分别是:0.3,0.5,0.2。三种任务分别要完成4、3、5个流程,而且要求以一定的顺序在指定的工作站上进行。模拟3000小时的情形,统计每个工作站的平均等待时间。

思路:
事件:新任务到达和5个离开工作站事件
1.新任务到达:
安排下一个新任务的到达,确定本次任务的类型和到达工作站的次序,执行到达工作站i。
2.到达工作站i:
若设备忙,进入等待队伍,记录等待时间;若设备闲,占用设备,安排它服务完成离开的时间。
3.任务离开工作站:
若等待队伍为空,则设备设闲,下一次离开时间无穷;
若等待队伍不空,则安排队首占用设备,计算他的等待时间;
判断这个离开的任务是否完成所有的流程:
若没有,则确定下一个工作站,执行到达工作站j。

java程序:
到达系统:

private void arriveSystem(Event e) {
this.arriveTaskNumber++;
this.currentTime=e.getTime();

Event e1=new Event();
e1.setEventType(Event.arriveType);
e1.setTime(this.currentTime+this.GenerateExpRandom(theta1));
eventList.add(e1);

int taskType=this.generateTaskType();
Task task=new Task(this.arriveTaskNumber,this.currentTime,taskType);
task.setServiceTime(this.GenerateExpRandom(task.getServiceExp().getFirst()));
arriveStation(task);

}


执行到达工作站i:

private void arriveStation(Task arriveTask) {
//获得本工作站的编号
int stationNo=arriveTask.getDeviceNumbers().getFirst();
// System.out.println("stationNO:"+stationNo);
//System.out.println("is queue null:"+queue[stationNo].getQueue().isEmpty());

System.out.println("at "+this.currentTime+" taskId:"+arriveTask.getTaskId()+" taskType:"+arriveTask.getTaskType()+" arrive station:["+stationNo+"].");
if(statusBusy[stationNo]==true){
//设备忙

arriveTask.setArriveTime(this.currentTime);


}else{
//设备闲,由闲设忙
statusBusy[stationNo]=true;
//设定离开本工作站的时间
Event e=new Event();
e.setDepartStationNo(stationNo);
e.setEventType(Event.departType);
e.setTime(this.currentTime+arriveTask.getServiceTime());
eventList.add(e);
}

//流程和服务时间指数前移--设定下个到达的工作站和服务时间
arriveTask.getDeviceNumbers().removeFirst();
arriveTask.getServiceExp().removeFirst();
if(!arriveTask.getDeviceNumbers().isEmpty())
arriveTask.setServiceTime(this.GenerateExpRandom(arriveTask.getServiceExp().getFirst()));

queue[stationNo].getQueue().add(arriveTask);
//将刚到达的也放进队列,方便以后它离开给工作站时确定时间。
//这样以后实际的队列长度为queue的length-1
//放在最后以保存修改

}


离开工作站:

private void depart(Event e) {
this.currentTime=e.getTime();
int stationNo=e.getDepartStationNo();
Task departTask=queue[stationNo].getQueue().getFirst();
//System.out.println("should depart stationNO:"+stationNo+" but it really depart:"+departTask.getDeviceNumbers().getFirst());
queue[stationNo].getQueue().removeFirst();
//将这个即将离开该工作站的任务移除队列。

if(queue[stationNo].isQueueEmpty()){
statusBusy[stationNo]=false;

}else{

//计算等待时间
double totalWaitingTime=queue[stationNo].getTotalWaitingTime();
queue[stationNo].setTotalWaitingTime(totalWaitingTime+this.currentTime-departTask.getArriveTime());
int taskNumber=queue[stationNo].getTaskNumber();
queue[stationNo].setTaskNumber(taskNumber+1);

Task nextDepartTask=queue[stationNo].getQueue().getFirst();
Event e1=new Event();
e1.setDepartStationNo(stationNo);
e1.setEventType(Event.departType);
e1.setTime(this.currentTime+nextDepartTask.getServiceTime());
eventList.add(e1);

}

if(!departTask.getDeviceNumbers().isEmpty()){
//如果还有为完成的流程

this.arriveStation(departTask);
}else{
//任务完成,离开系统
System.out.println("*****************************");
System.out.println("at "+this.currentTime+" taskId:"+departTask.getTaskId()+" taskType:"+departTask.getTaskType()+" depart the system.");
System.out.println("*****************************");
}

}


附件为事件为数组和链表的形式。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值