    001    package ifs.example.jobshop;
    002
    003    import java.util.*;
    004    import ifs.model.*;
    005
    006    /**
    007     * Job constraint.
    008     * <br><br>
    009     * Each job contians a given set of operations (variables).
    010     * A job constraint is satisfied, if all operations of the job do not overlap in time and are processed in the given order.
    011     *
    012     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
    013     * @version 1.0
    014     */
    015    public class Job extends Constraint {
    016        private int iJobNumber = 0;
    017        private int iDueTime = -1;
    018
    019        /**
    020         * Constructor
    021         * @param jobNumber job number
    022         */
    023        public Job(int jobNumber) {
    024            super();
    025            iJobNumber = jobNumber;
    026        }
    027
    028        /**
    029         * Set due time
    030         */
    031        public void setDueTime(int dueTime) { iDueTime = dueTime; }
    032
    033        /**
    034         * Get due time
    035         */
    036        public int getDueTime() { return iDueTime; }
    037
    038        /**
    039         * Get job number
    040         */
    041        public int getJobNumner() { return iJobNumber; }
    042
    043        /**
    044         * Count job operations for the job (i.e., the number of variables in this constraint)
    045         */
    046        public int countOperations() { return variables().size(); }
    047
    048        /**
    049         * Get operation of the given index (0..countOperations()-1)
    050         */
    051        public Operation getOperation(int opNumber) { return (Operation)variables().get(opNumber); }
    052
    053        /**
    054         * Adds conflicting operations into the set of conflicts.
    055         */
    056        public void computeConflicts(Value value, Set conflicts) {
    057            Location location = (Location)value;
    058            Operation operation = (Operation)value.variable();
    059            for (Enumeration e=assignedVariables().elements();e.hasMoreElements();) {
    060                Operation o = (Operation)e.nextElement();
    061                if (o.getOperationNumber()==operation.getOperationNumber()) continue;
    062                Location l = (Location)o.getAssignment();
    063                if (o.getOperationNumber()<operation.getOperationNumber()) {
    064                    if (!l.before(location)) conflicts.add(l);
    065                } else {
    066                    if (!l.after(location)) conflicts.add(l);
    067                }
    068            }
    069        }
    070
    071        /**
    072         * True if there is an operation from the same job which violates with the given assignment.
    073         */
    074        public boolean inConflict(Value value) {
    075            Location location = (Location)value;
    076            Operation operation = (Operation)value.variable();
    077            for (Enumeration e=assignedVariables().elements();e.hasMoreElements();) {
    078                Operation o = (Operation)e.nextElement();
    079                if (o.getOperationNumber()==operation.getOperationNumber()) continue;
    080                Location l = (Location)o.getAssignment();
    081                if (o.getOperationNumber()<operation.getOperationNumber()) {
    082                    if (!l.before(location)) return true;
    083                } else {
    084                    if (!l.after(location)) return true;
    085                }
    086            }
    087            return false;
    088        }
    089
    090        /**
    091         * True if the two assignments (placement of opeartions of the same job in time) violates each other.
    092         */
    093        public boolean isConsistent(Value value1, Value value2) {
    094            Location location1 = (Location)value1;
    095            Operation operation1 = (Operation)value1.variable();
    096            Location location2 = (Location)value2;
    097            Operation operation2 = (Operation)value2.variable();
    098            if (operation1.getOperationNumber()<operation2.getOperationNumber()) {
    099                if (location1.before(location2)) return true;
    100            } else {
    101                if (location2.before(location1)) return true;
    102            }
    103            return false;
    104        }
    105
    106        /**
    107         * String representation -- for debuging and printing purposes
    108         */
    109        public String toString() { return "J"+iJobNumber; }
    110        /**
    111         * Name of the job (e.g. J10 where 10 is the job number)
    112         */
    113        public String getName() { return "J"+iJobNumber; }
    114    }