001 package net.sf.cpsolver.ifs.example.tt;
002
003 import java.util.HashSet;
004 import java.util.Set;
005
006 import net.sf.cpsolver.ifs.model.Constraint;
007 import net.sf.cpsolver.ifs.model.Model;
008
009 /**
010 * Resource constraint
011 *
012 * @version IFS 1.2 (Iterative Forward Search)<br>
013 * Copyright (C) 2006 - 2010 Tomas Muller<br>
014 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
015 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
016 * <br>
017 * This library is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser General Public License as
019 * published by the Free Software Foundation; either version 3 of the
020 * License, or (at your option) any later version. <br>
021 * <br>
022 * This library is distributed in the hope that it will be useful, but
023 * WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
025 * Lesser General Public License for more details. <br>
026 * <br>
027 * You should have received a copy of the GNU Lesser General Public
028 * License along with this library; if not see
029 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
030 */
031 public class Resource extends Constraint<Activity, Location> {
032 private String iName = null;
033 private String iResourceId = null;
034 private Activity[] iResource;
035 private Set<Integer> iProhibitedSlots = new HashSet<Integer>();
036 private Set<Integer> iDiscouragedSlots = new HashSet<Integer>();
037 private int iType = TYPE_OTHER;
038
039 public static final int TYPE_ROOM = 0;
040 public static final int TYPE_INSTRUCTOR = 1;
041 public static final int TYPE_CLASS = 2;
042 public static final int TYPE_OTHER = 3;
043
044 public Resource(String id, int type, String name) {
045 super();
046 iResourceId = id;
047 iName = name;
048 iType = type;
049 }
050
051 @Override
052 public void setModel(Model<Activity, Location> model) {
053 super.setModel(model);
054 TimetableModel m = (TimetableModel)model;
055 iResource = new Activity[m.getNrDays() * m.getNrHours()];
056 for (int i=0;i<iResource.length;i++)
057 iResource[i] = null;
058 }
059
060 public String getResourceId() { return iResourceId; }
061 @Override
062 public String getName() { return iName; }
063 public int getType() { return iType; }
064 public Set<Integer> getProhibitedSlots() { return iProhibitedSlots; }
065 public Set<Integer> getDiscouragedSlots() { return iDiscouragedSlots; }
066 public void addProhibitedSlot(int day, int hour) {
067 iProhibitedSlots.add(((TimetableModel)getModel()).getNrHours()*day+hour);
068 }
069 public void addDiscouragedSlot(int day, int hour) {
070 iDiscouragedSlots.add(((TimetableModel)getModel()).getNrHours()*day+hour);
071 }
072 public boolean isProhibitedSlot(int day, int hour) {
073 return iProhibitedSlots.contains(((TimetableModel)getModel()).getNrHours()*day+hour);
074 }
075 public boolean isDiscouragedSlot(int day, int hour) {
076 return iDiscouragedSlots.contains(((TimetableModel)getModel()).getNrHours()*day+hour);
077 }
078 public void addProhibitedSlot(int slot) {
079 iProhibitedSlots.add(slot);
080 }
081 public void addDiscouragedSlot(int slot) {
082 iDiscouragedSlots.add(slot);
083 }
084 public boolean isProhibitedSlot(int slot) {
085 return iProhibitedSlots.contains(slot);
086 }
087 public boolean isDiscouragedSlot(int slot) {
088 return iDiscouragedSlots.contains(slot);
089 }
090 public boolean isProhibited(int day, int hour, int length) {
091 int slot = ((TimetableModel)getModel()).getNrHours()*day+hour;
092 for (int i=0;i<length;i++)
093 if (iProhibitedSlots.contains(slot+i)) return true;
094 return false;
095 }
096
097 @Override
098 public void computeConflicts(Location location, Set<Location> conflicts) {
099 Activity activity = location.variable();
100 if (!location.containResource(this)) return;
101 for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
102 Activity conf = iResource[i];
103 if (conf!=null && !activity.equals(conf))
104 conflicts.add(conf.getAssignment());
105 }
106 }
107
108 @Override
109 public boolean inConflict(Location location) {
110 Activity activity = location.variable();
111 if (!location.containResource(this)) return false;
112 for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
113 if (iResource[i]!=null) return true;
114 }
115 return false;
116 }
117
118 @Override
119 public boolean isConsistent(Location l1, Location l2) {
120 return !l1.containResource(this) || !l2.containResource(this) || !l1.hasIntersection(l2);
121 }
122
123 @Override
124 public void assigned(long iteration, Location location) {
125 super.assigned(iteration, location);
126 Activity activity = location.variable();
127 if (!location.containResource(this)) return;
128 for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
129 iResource[i] = activity;
130 }
131 }
132 @Override
133 public void unassigned(long iteration, Location location) {
134 super.unassigned(iteration, location);
135 Activity activity = location.variable();
136 if (!location.containResource(this)) return;
137 for (int i=location.getSlot(); i<location.getSlot()+activity.getLength(); i++) {
138 iResource[i] = null;
139 }
140 }
141 }