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("*****************************");
		}
		
	}


附件为事件为数组和链表的形式。

你可能感兴趣的:(工作,制造,J#)