    001    package ifs.example.jobshop;
    002
    003    import ifs.model.*;
    004    import java.util.*;
    005
    006    /**
    007     * Machine constraint.
    008     * <br><br>
    009     * Each machine contians a given set of operations (variables).
    010     * A machine constraint is satisfied, if all operations on it do not overlap in time.
    011     *
    012     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
    013     * @version 1.0
    014     */
    015    public class Machine extends Constraint {
    016        private int iMachineNumber = -1;
    017
    018        /**
    019         * Constructor
    020         * @param machineNumber machine number
    021         */
    022        public Machine(int machineNumber) {
    023            super();
    024            iMachineNumber = machineNumber;
    025        }
    026
    027        /** Get machine number */
    028        public int getMachineNumber() { return iMachineNumber; }
    029
    030
    031        /**
    032         * Adds conflicting operations into the set of conflicts.
    033         */
    034        public void computeConflicts(Value value, java.util.Set conflicts) {
    035            Location location = (Location)value;
    036            Operation operation = (Operation)value.variable();
    037            for (Enumeration e=assignedVariables().elements();e.hasMoreElements();) {
    038                Operation o = (Operation)e.nextElement();
    039                if (o.getOperationNumber()==operation.getOperationNumber() && o.getJobNumber()==operation.getJobNumber()) continue;
    040                Location l = (Location)o.getAssignment();
    041                if (l.overlap(location)) conflicts.add(l);
    042            }
    043        }
    044
    045        /**
    046         * True if there is an operation from the machine which violates with the given assignment.
    047         */
    048        public boolean inConflict(Value value) {
    049            Location location = (Location)value;
    050            Operation operation = (Operation)value.variable();
    051            for (Enumeration e=assignedVariables().elements();e.hasMoreElements();) {
    052                Operation o = (Operation)e.nextElement();
    053                if (o.getOperationNumber()==operation.getOperationNumber() && o.getJobNumber()==operation.getJobNumber()) continue;
    054                Location l = (Location)o.getAssignment();
    055                if (l.overlap(location)) return true;
    056            }
    057            return false;
    058        }
    059
    060        /**
    061         * True if the two assignments (placement of opeartions of the machine in time) violates each other.
    062         */
    063        public boolean isConsistent(Value value1, Value value2) {
    064            return !((Location)value1).overlap((Location)value2);
    065        }
    066
    067        /** string representation -- for debuging and printing purposes */
    068        public String toString() { return getName(); }
    069
    070       /**
    071         * Name of the machine (e.g. M10 where 10 is the machine number)
    072         */
    073         public String getName() { return "M"+iMachineNumber; }
    074    }