001package org.cpsolver.ifs.example.jobshop; 002 003import org.cpsolver.ifs.model.Value; 004 005/** 006 * Location of an operation. <br> 007 * <br> 008 * Each location has its start time. 009 * 010 * @version IFS 1.3 (Iterative Forward Search)<br> 011 * Copyright (C) 2006 - 2014 Tomáš Müller<br> 012 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 013 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br> 014 * <br> 015 * This library is free software; you can redistribute it and/or modify 016 * it under the terms of the GNU Lesser General Public License as 017 * published by the Free Software Foundation; either version 3 of the 018 * License, or (at your option) any later version. <br> 019 * <br> 020 * This library is distributed in the hope that it will be useful, but 021 * WITHOUT ANY WARRANTY; without even the implied warranty of 022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 023 * Lesser General Public License for more details. <br> 024 * <br> 025 * You should have received a copy of the GNU Lesser General Public 026 * License along with this library; if not see 027 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>. 028 */ 029public class Location extends Value<Operation, Location> { 030 private int iStartTime = -1; 031 032 /** 033 * Constructor 034 * 035 * @param op 036 * parent operation 037 * @param startTime 038 * start time 039 */ 040 public Location(Operation op, int startTime) { 041 super(op); 042 iStartTime = startTime; 043 } 044 045 /** 046 * Get start time of the location 047 * @return start time of the location 048 */ 049 public int getStartTime() { 050 return iStartTime; 051 } 052 053 /** 054 * Get finishing time of the location (start time + operation processing 055 * time) 056 * @return finishing time of the location 057 */ 058 public int getFinishingTime() { 059 return iStartTime + (variable()).getProcessingTime() - 1; 060 } 061 062 /** 063 * Start time of the location 064 */ 065 @Override 066 public double toDouble() { 067 return iStartTime; 068 } 069 070 /** 071 * String representation (operation name = start time) 072 */ 073 @Override 074 public String toString() { 075 return variable().getName() + "=" + iStartTime; 076 } 077 078 /** 079 * Name -- start time 080 */ 081 @Override 082 public String getName() { 083 return String.valueOf(iStartTime); 084 } 085 086 /** 087 * Returns true if overlap with the given location 088 * @param anotherLocation given location 089 * @return true if overlap with the given location 090 */ 091 public boolean overlap(Location anotherLocation) { 092 if (getStartTime() + variable().getProcessingTime() <= anotherLocation.getStartTime()) 093 return false; 094 if (anotherLocation.getStartTime() + anotherLocation.variable().getProcessingTime() <= getStartTime()) 095 return false; 096 return true; 097 } 098 099 /** 100 * Returns true if before the given location 101 * @param anotherLocation given location 102 * @return true if before the given location 103 */ 104 public boolean before(Location anotherLocation) { 105 if (getStartTime() + variable().getProcessingTime() <= anotherLocation.getStartTime()) 106 return true; 107 return false; 108 } 109 110 /** 111 * Returns true if after the given location 112 * @param anotherLocation given location 113 * @return true if after the given location 114 */ 115 public boolean after(Location anotherLocation) { 116 return anotherLocation.before(this); 117 } 118}