00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef UDINE_MODEL
00022 #define UDINE_MODEL
00023
00024 #include <vector>
00025 #include <set>
00026 #include <map>
00027 #include <utility>
00028
00029 #include <ilcplex/ilocplex.h>
00030
00031 #include "solver_config.h"
00032 #include "loader.h"
00033 #include "conflicts.h"
00034 #include "neighbourhood.h"
00035 #include "variables.h"
00036
00037 ILOSTLBEGIN
00038
00039 namespace Udine {
00040
00041 class Model {
00042
00043 protected:
00044 Instance &instance;
00045 IloEnv env;
00046 IloModel model;
00047 Variables vars;
00048 IloRangeArray constraints;
00049 IloExpr obj;
00050 Graph conflictGraph;
00051 Neighbourhood &definition;
00052 Config &config;
00053
00054
00055 virtual void generateHardConstraints();
00056 virtual void generateMinCourseDays();
00057 virtual void generateCompactness();
00058 virtual void generateRoomStability();
00059 virtual void generateCoursePeriods();
00060 virtual void generateNeighbourhood();
00061 virtual void generateObjectiveComponents();
00062 virtual void generateObjective();
00063
00064 public:
00065 Model(IloModel &modelToGenerate, Config &c, Instance &i, Graph &g, Neighbourhood &def)
00066 : vars(modelToGenerate.getEnv(), c, i, def), constraints(modelToGenerate.getEnv()), obj(modelToGenerate.getEnv()),
00067 env(modelToGenerate.getEnv()), model(modelToGenerate), instance(i), conflictGraph(g), definition(def), config(c) {
00068
00069
00070 generateHardConstraints();
00071
00072
00073 generateRoomStability();
00074 if (def.type != FixPeriod)
00075 generateCompactness();
00076 if (def.type == Surface || def.type == Monolithic)
00077 generateMinCourseDays();
00078
00079
00080 if (def.type != Surface && config.getParam(UseAdditionalVariables))
00081 generateCoursePeriods();
00082
00083
00084 if (def.type == FixPeriod || def.type == FixDay)
00085 generateNeighbourhood();
00086
00087 if (config.getParam(UseObjectiveComponents)) generateObjectiveComponents();
00088 else generateObjective();
00089
00090 model.add(constraints);
00091 model.add(IloMinimize(env, obj));
00092 }
00093 virtual ~Model() {}
00094
00095 friend class StrategyI;
00096 friend class CutManagerI;
00097 friend class SolutionSavingStrategyI;
00098 friend class SolutionPolishingStrategyI;
00099 };
00100
00101 }
00102
00103 #endif // UDINE MODEL