    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}