001    package ifs.example.rpp;
002    
003    import ifs.model.*;
004    import java.util.*;
005    
006    /**
007     * RPP model.
008     * <br><br>
009     * The random placement problem (RPP; for more details, see <a href='http://www.fi.muni.cz/~hanka/rpp/'>http://www.fi.muni.cz/~hanka/rpp/</a>) 
010     * seeks to place a set of randomly generated rectangles (called objects) of different sizes into a larger rectangle
011     * (called placement area) in such a way that no objects overlap and all objects’ borders are parallel to the border 
012     * of the placement area. In addition, a set of allowable placements can be randomly generated for each object. 
013     * The ratio between the total area of all objects and the size of the placement area will be denoted as the filled area ratio.
014     * <br><br>
015     * RPP allows us to generate various instances of the problem similar to a trivial timetabling problem. The correspondence is 
016     * as follows: the object corresponds to a course to be timetabled – the x-coordinate to its time, the y-coordinate to its classroom. 
017     * For example, a course taking three hours corresponds to an object with dimensions 3x1 (the course should be taught in one 
018     * classroom only).  Each course can be placed only in a classroom of sufficient capacity – we can expect 
019     * that the classrooms are ordered increasingly in their size so each object will have a lower bound on its y-coordinate.
020     * 
021     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
022     * @version 1.0
023     */
024    public class RPPModel extends Model {
025        /** Constructor. */
026        public RPPModel() {
027            super();
028        }
029        
030        /** Returns rectangle of the given name */
031        public Rectangle getRectangle(String name) {
032            for (Enumeration i = variables().elements(); i.hasMoreElements();) {
033                Variable v = (Variable)i.nextElement();
034                if (v instanceof Rectangle && name.equals(((Rectangle)v).getName()))
035                    return (Rectangle)v;
036            }
037            return null;
038        }
039        
040    }