00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "solver_config.h"
00022
00023 #include <ilcplex/ilocplex.h>
00024
00025 using namespace Udine;
00026
00027 Config::Config(IloEnv &env, char *pathToInstance, const char *configIdentifier)
00028 : path(pathToInstance),
00029 configId(configIdentifier) {
00030
00031 globalStart = std::time(NULL);
00032
00033 strategy = ContractAlgorithm;
00034 contractTimelimit = 3600;
00035
00036 for (int m = 0; m < ModelTypeLen; m++) {
00037 params.push_back(IloCplex::ParameterSet(env));
00038 weights.push_back(ObjectiveWeights(1, 5, 2, 1));
00039 anytimeDivingOnset[m] = 0;
00040 }
00041
00042 featureUse[UseSpecialOrderedSets] = false;
00043 featureUse[UseStaticCliqueCutsAtSurface] = true;
00044 featureUse[UseStaticCliqueCutsInDives] = true;
00045 featureUse[UseDisaggregation] = false;
00046 featureUse[UseStaticImpliedBounds] = true;
00047 featureUse[UseStaticPatternEnumeration] = false;
00048 featureUse[UseHeuristicCompactnessAtSurface] = false;
00049 featureUse[UseHeuristicCompactnessInDayDives] = true;
00050 featureUse[UseNeighbourhoodLogging] = true;
00051 featureUse[UseLowerBoundLogging] = true;
00052 featureUse[UseSolutionLogging] = true;
00053 featureUse[UseDynamicCutsAtSurface] = false;
00054 featureUse[UseZeroRoomStability] = false;
00055 featureUse[UsePreprocessingFriendlyFormulation] = false;
00056 featureUse[UseAdditionalVariables] = true;
00057 featureUse[UseLpFilesExport] = false;
00058 featureUse[UseRoomSoftfixing] = false;
00059 featureUse[UseMRoomAggegation] = false;
00060 featureUse[UseSpreadOnlyNeighbourhoods] = false;
00061 featureUse[UseObjectiveComponents] = true;
00062
00063 featureUseFrequency[CutsFromPregeneratedCliques] = 5;
00064 featureUseFrequency[CutsFromPregeneratedPatterns] = 5;
00065 featureUseFrequency[CutsFromTriangles] = 5;
00066
00067 featureUseCount[FixDayDiveFromSurface] = 3;
00068 featureUseCount[FixPeriodDiveFromSurface]= 3;
00069 featureUseCount[FixPeriodDiveFromFixDay] = 3;
00070
00071 for (int p = 0; p < ModelTypeLen; p++) {
00072 params[p].setParam(IloCplex::ObjDif, 1);
00073 params[p].setParam(IloCplex::WorkMem, 512);
00074 upperBounds[p] = -1;
00075 }
00076 }
00077
00078 bool Config::getParam(FeatureUse f) {
00079 assert(f >= 0 && f < FeatureUseLen);
00080 return featureUse[f];
00081 }
00082
00083 int Config::getFrequency(FeatureUseFrequency f) {
00084 assert(f >= 0 && f < FeatureUseFrequencyLen);
00085 return featureUseFrequency[f];
00086 }
00087
00088 int Config::getCount(FeatureUseCount c) {
00089 assert(c >= 0 && c < FeatureUseCountLen);
00090 return featureUseCount[c];
00091 }
00092
00093 ObjectiveWeights Config::getWeights(ModelType t) {
00094 assert(t >= 0 && t < ModelTypeLen);
00095 return weights[t];
00096 }
00097
00098 time_t Config::elapsed() {
00099 return (std::time(NULL) - globalStart);
00100 }
00101
00102 void Config::addSolutionCost(ModelType t, int v) {
00103 if ((upperBounds[t] < 0) || (v == std::min(upperBounds[t], v))) {
00104 upperBounds[t] = v;
00105 params[t].setParam(IloCplex::CutUp, v - 0.5);
00106 if (t == FixPeriod && (upperBounds[FixDay] < 0) || (v == std::min(upperBounds[FixDay], v))) {
00107 upperBounds[FixDay] = v;
00108 params[FixDay].setParam(IloCplex::CutUp, v - 0.5);
00109 }
00110 }
00111 }
00112
00113 void Config::apply(IloCplex &cplex, ModelType t) {
00114 assert(t >= 0 && t < ModelTypeLen);
00115 cplex.setParameterSet(params[t]);
00116 }
00117
00118 std::ostream & Udine::operator<< (std::ostream &out, ModelType &type) {
00119 assert(type >= 0 && type < ModelTypeLen);
00120 switch (type) {
00121 case Monolithic: out << "Monolithic"; break;
00122 case Surface: out << "Surface"; break;
00123 case FixPeriod: out << "FixPeriod"; break;
00124 case FixDay: out << "FixDay"; break;
00125 }
00126 return out;
00127 }