Exemplo n.º 1
0
  /*
   * 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;
  }