001package net.sf.cpsolver.ifs.example.jobshop; 002 003import java.util.ArrayList; 004import java.util.List; 005 006import net.sf.cpsolver.ifs.model.Variable; 007 008/** 009 * Operation. <br> 010 * <br> 011 * Each operation has its number, job, machine and processing time 012 * 013 * @version IFS 1.2 (Iterative Forward Search)<br> 014 * Copyright (C) 2006 - 2010 Tomáš Müller<br> 015 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 016 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br> 017 * <br> 018 * This library is free software; you can redistribute it and/or modify 019 * it under the terms of the GNU Lesser General Public License as 020 * published by the Free Software Foundation; either version 3 of the 021 * License, or (at your option) any later version. <br> 022 * <br> 023 * This library is distributed in the hope that it will be useful, but 024 * WITHOUT ANY WARRANTY; without even the implied warranty of 025 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 026 * Lesser General Public License for more details. <br> 027 * <br> 028 * You should have received a copy of the GNU Lesser General Public 029 * License along with this library; if not see 030 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>. 031 */ 032public class Operation extends Variable<Operation, Location> { 033 private Job iJob = null; 034 private Machine iMachine = null; 035 private int iProcessingTime = 0; 036 private int iOperationNumber = 0; 037 038 /** 039 * Constructor 040 * 041 * @param job 042 * job 043 * @param machine 044 * machine 045 * @param operationNumber 046 * operation number 047 * @param processingTime 048 * processing time 049 */ 050 public Operation(Job job, Machine machine, int operationNumber, int processingTime) { 051 super(null); 052 iJob = job; 053 iMachine = machine; 054 iProcessingTime = processingTime; 055 iOperationNumber = operationNumber; 056 } 057 058 /** Get job */ 059 public Job getJob() { 060 return iJob; 061 } 062 063 /** Get job number */ 064 public int getJobNumber() { 065 return iJob.getJobNumner(); 066 } 067 068 /** Get operation number */ 069 public int getOperationNumber() { 070 return iOperationNumber; 071 } 072 073 /** Get machine */ 074 public Machine getMachine() { 075 return iMachine; 076 } 077 078 /** Get machine number */ 079 public int getMachineNumber() { 080 return iMachine.getMachineNumber(); 081 } 082 083 /** Get processing time */ 084 public int getProcessingTime() { 085 return iProcessingTime; 086 } 087 088 /** Get the preceeding operation (if any) */ 089 public Operation getPrecedingOperation() { 090 return (iOperationNumber == 0 ? null : iJob.getOperation(iOperationNumber - 1)); 091 } 092 093 /** Get the subsequent operation (if any) */ 094 public Operation getSubsequentOperation() { 095 return (iOperationNumber + 1 == iJob.countOperations() ? null : iJob.getOperation(iOperationNumber + 1)); 096 } 097 098 /** Get minimal starting time */ 099 public int getMinStartTime() { 100 if (iOperationNumber == 0) 101 return 0; 102 else 103 return getPrecedingOperation().getMinStartTime() + iProcessingTime; 104 } 105 106 /** Get maximal starting time */ 107 public int getMaxStartTime() { 108 if (iOperationNumber + 1 == iJob.countOperations()) 109 return ((JobShopModel) getModel()).getTotalNumberOfSlots() - iProcessingTime; 110 else 111 return getSubsequentOperation().getMaxStartTime() - iProcessingTime; 112 } 113 114 /** Compares two operations -- job number and operation number must match */ 115 @Override 116 public boolean equals(Object o) { 117 if (o == null || !(o instanceof Operation)) 118 return false; 119 Operation op = (Operation) o; 120 return getJobNumber() == op.getJobNumber() && getOperationNumber() == op.getOperationNumber(); 121 } 122 123 /** Initialozation -- fills the variable's domain */ 124 public void init() { 125 setValues(computeValues()); 126 } 127 128 private List<Location> computeValues() { 129 List<Location> ret = new ArrayList<Location>(); 130 for (int i = getMinStartTime(); i <= getMaxStartTime(); i++) 131 ret.add(new Location(this, i)); 132 return ret; 133 } 134 135 /** string representation -- for debuging and printing purposes */ 136 @Override 137 public String toString() { 138 return getName(); 139 } 140 141 /** 142 * Operation's name (e.g., O[2,4] where 2 is the job number and 4 is the 143 * operation number 144 */ 145 @Override 146 public String getName() { 147 return "O[" + getJobNumber() + "," + getOperationNumber() + "]"; 148 } 149}