    001package net.sf.cpsolver.ifs.example.jobshop;
    002
    003import java.util.Set;
    004
    005import net.sf.cpsolver.ifs.model.Constraint;
    006
    007/**
    008 * Job constraint. <br>
    009 * <br>
    010 * Each job contians a given set of operations (variables). A job constraint is
    011 * satisfied, if all operations of the job do not overlap in time and are
    012 * processed in the given order.
    013 *
    014 * @version IFS 1.2 (Iterative Forward Search)<br>
    015 *          Copyright (C) 2006 - 2010 Tomáš Müller<br>
    016 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
    017 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
    018 * <br>
    019 *          This library is free software; you can redistribute it and/or modify
    020 *          it under the terms of the GNU Lesser General Public License as
    021 *          published by the Free Software Foundation; either version 3 of the
    022 *          License, or (at your option) any later version. <br>
    023 * <br>
    024 *          This library is distributed in the hope that it will be useful, but
    025 *          WITHOUT ANY WARRANTY; without even the implied warranty of
    026 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    027 *          Lesser General Public License for more details. <br>
    028 * <br>
    029 *          You should have received a copy of the GNU Lesser General Public
    030 *          License along with this library; if not see
    031 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
    032 */
    033public class Job extends Constraint<Operation, Location> {
    034    private int iJobNumber = 0;
    035    private int iDueTime = -1;
    036
    037    /**
    038     * Constructor
    039     *
    040     * @param jobNumber
    041     *            job number
    042     */
    043    public Job(int jobNumber) {
    044        super();
    045        iJobNumber = jobNumber;
    046    }
    047
    048    /**
    049     * Set due time
    050     */
    051    public void setDueTime(int dueTime) {
    052        iDueTime = dueTime;
    053    }
    054
    055    /**
    056     * Get due time
    057     */
    058    public int getDueTime() {
    059        return iDueTime;
    060    }
    061
    062    /**
    063     * Get job number
    064     */
    065    public int getJobNumner() {
    066        return iJobNumber;
    067    }
    068
    069    /**
    070     * Count job operations for the job (i.e., the number of variables in this
    071     * constraint)
    072     */
    073    public int countOperations() {
    074        return variables().size();
    075    }
    076
    077    /**
    078     * Get operation of the given index (0..countOperations()-1)
    079     */
    080    public Operation getOperation(int opNumber) {
    081        return variables().get(opNumber);
    082    }
    083
    084    /**
    085     * Adds conflicting operations into the set of conflicts.
    086     */
    087    @Override
    088    public void computeConflicts(Location location, Set<Location> conflicts) {
    089        for (Operation o : assignedVariables()) {
    090            if (o.getOperationNumber() == location.variable().getOperationNumber())
    091                continue;
    092            Location l = o.getAssignment();
    093            if (o.getOperationNumber() < location.variable().getOperationNumber()) {
    094                if (!l.before(location))
    095                    conflicts.add(l);
    096            } else {
    097                if (!l.after(location))
    098                    conflicts.add(l);
    099            }
    100        }
    101    }
    102
    103    /**
    104     * True if there is an operation from the same job which violates with the
    105     * given assignment.
    106     */
    107    @Override
    108    public boolean inConflict(Location location) {
    109        for (Operation o : assignedVariables()) {
    110            if (o.getOperationNumber() == location.variable().getOperationNumber())
    111                continue;
    112            Location l = o.getAssignment();
    113            if (o.getOperationNumber() < location.variable().getOperationNumber()) {
    114                if (!l.before(location))
    115                    return true;
    116            } else {
    117                if (!l.after(location))
    118                    return true;
    119            }
    120        }
    121        return false;
    122    }
    123
    124    /**
    125     * True if the two assignments (placement of opeartions of the same job in
    126     * time) violates each other.
    127     */
    128    @Override
    129    public boolean isConsistent(Location location1, Location location2) {
    130        Operation operation1 = location1.variable();
    131        Operation operation2 = location2.variable();
    132        if (operation1.getOperationNumber() < operation2.getOperationNumber()) {
    133            if (location1.before(location2))
    134                return true;
    135        } else {
    136            if (location2.before(location1))
    137                return true;
    138        }
    139        return false;
    140    }
    141
    142    /**
    143     * String representation -- for debuging and printing purposes
    144     */
    145    @Override
    146    public String toString() {
    147        return "J" + iJobNumber;
    148    }
    149
    150    /**
    151     * Name of the job (e.g. J10 where 10 is the job number)
    152     */
    153    @Override
    154    public String getName() {
    155        return "J" + iJobNumber;
    156    }
    157}