/* * Checks Deadline, total Time * return 3 => succeed (last task emergent) * return 2 => succeed (soft time window) * return 1 => succeed (strict time window) * return 0 => exceed return deadline * return -1 => time window conflict * * after check, the startT and finishT is updated correctly. */ public int check() { Calendar currentTime = (Calendar) nw.periodStartTimes[this.period].clone(); Calendar endTime = nw.periodEndTimes[this.period]; loadedDistance = emptyDistance = waitTime = softTimeWindowPenalty = 0; int taskSetSize = taskSet.size(); for (int i = 0; i < taskSetSize; i++) { Task currentTa = taskSet.elementAt(i); currentTa.emergent = false; Commodity c = currentTa.cmdt; int srcI = c.src.index, destI = c.dest.index, depotI = nw.depot.index; // dead heading to source node. if (i == 0) { // depot to src currentTime.add(Calendar.MINUTE, (int) nw.getTravelingTime(depotI, srcI)); emptyDistance += nw.getTravelingDistance(depotI, srcI); } else { // dest to src Commodity c2 = this.taskSet.elementAt(i - 1).cmdt; if (!c.src.equals(c2.dest)) { currentTime.add(Calendar.MINUTE, (int) nw.getTravelingTime(c2.dest.index, srcI)); emptyDistance += nw.getTravelingDistance(c2.dest.index, srcI); } } // Carrier just arrived at source node. if (currentTime.compareTo(c.availTime) < 0) { // arrive too early this.waitTime += (c.availTime.getTimeInMillis() - currentTime.getTimeInMillis()) / 1000 / 60; currentTime = (Calendar) c.availTime.clone(); } currentTa.startT = (Calendar) currentTime.clone(); // load time of commodity c currentTa.emergent = (int) ((c.deadline.getTimeInMillis() - currentTime.getTimeInMillis()) / 1000 / 60 - 120) // should arrive earlier, not just in time!! < nw.getTravelingTimeWithQueue(srcI, destI); // if (!currentTa.emergent) { currentTime.add(Calendar.MINUTE, c.src.loadTime); // } // src -> dest currentTime.add(Calendar.MINUTE, (int) nw.getTravelingTime(srcI, destI)); loadedDistance += nw.getTravelingDistance(srcI, destI); // unload ta1, task(s) finished // if (!currentTa.emergent) { currentTime.add(Calendar.MINUTE, c.dest.unloadTime); // } if (currentTime.compareTo(c.deadline) > 0) { // System.out.println("Too late to unload!"); return -1; } currentTa.finishT = (Calendar) currentTime.clone(); // if last task, go back to depot if (i == taskSetSize - 1) { // dest to depot currentTime.add(Calendar.MINUTE, (int) nw.getTravelingTime(destI, depotI)); this.emptyDistance += nw.getTravelingDistance(destI, depotI); } if (currentTime.compareTo(endTime) > 0) { if (i == taskSetSize - 1) { // emergent and it is last task if (currentTa.emergent) return 3; // Soft time window // double lateness = currentTime.getTimeInMillis() - endTime.getTimeInMillis(); // lateness = lateness / 1000 / 60; // // this.softTimeWindowPenalty = lateness / 2; // return 2; } else { return 0; } } // The delay is calculated, but not included in finish time; // This is put here because once a job is found to be delayed, // Only later jobs should be reconsidered, it is already to late // to change it if period deadline is missed. currentTime.add(Calendar.MINUTE, currentTa.getLateness()); } return 1; }