IBM ILOG Solver User's Manual > More on Modeling > Reducing Symmetry: Configuring Racks > Complete program |
Complete program |
INDEX
![]() |
The complete program follows. You can also view it online in the file YourSolverHome/examples/src/rack.cpp.
#include <ilsolver/ilosolverint.h> ILOSTLBEGIN const IloInt nbRackTypes = 2; const IloInt maxSlots = 16; enum {power, price, nbSlot}; IloInt Racks[3][nbRackTypes+1] = { { 0, 150, 200 }, { 0, 150, 200 }, { 0, 8, 16 } }; const IloInt nbCardTypes = 4; const IloInt nbRack = 5; IloInt nbCards[nbCardTypes] = {10, 4, 2, 1}; class Rack { public: IloIntVar _type; IloIntVar _price; IloIntVarArray _counters; Rack(IloModel model, IloIntArray cardPower); }; Rack::Rack(IloModel model, IloIntArray cardPower) { IloEnv env = model.getEnv(); _type = IloIntVar(env, 0, nbRackTypes); _counters = IloIntVarArray(env, nbCardTypes, 0, maxSlots); _price = IloIntVar(env, 0, 10000); IloIntArray prices(env, nbRackTypes + 1); IloIntArray rackPower (env, nbRackTypes + 1); IloIntArray rackSlot (env, nbRackTypes + 1); for (IloInt i=0; i<nbRackTypes + 1; i++) { prices[i] = Racks[price][i]; rackPower[i] = Racks[power][i]; rackSlot[i] = Racks[nbSlot][i]; } model.add(_price == prices(_type)); model.add(IloScalProd(_counters, cardPower) <= rackPower(_type)); model.add(IloSum(_counters) <= rackSlot(_type)); } int main () { IloEnv env; try { IloModel model(env); IloIntArray cardPower(env, (int)nbCardTypes, 20, 40, 50, 75); Rack* racks[nbRack]; IloInt i,j; for (i = 0; i < nbRack; i++) racks[i] = new Rack(model, cardPower); // all cards must be plugged for(j = 0; j < nbCardTypes; j++){ IloIntVarArray vars(env,nbRack); for(i = 0; i < nbRack; i++) vars[i] = racks[i]->_counters[j]; model.add(IloSum(vars) == nbCards[j]); } // remove symmetries for(i = 1; i < nbRack; i++){ model.add(racks[i]->_type >= racks[i-1]->_type); model.add(IloIfThen(env, racks[i-1]->_type == racks[i]->_type, racks[i-1]->_counters[0] <= racks[i]->_counters[0])); } // cost constraints IloIntVarArray prices(env, nbRack); for(i=0;i<nbRack;i++) prices[i] = racks[i]->_price; IloObjective objective = IloMinimize(env, IloSum(prices)); model.add(objective); IloGoal goal = IloGoalTrue(env); for(i=0;i<nbRack;i++){ goal = goal && IloInstantiate(env, racks[i]->_type); goal = goal && IloGenerate(env, racks[i]->_counters); } IloSolver solver(model); if (solver.solve(goal)) { solver.out() << endl << "Found an " << solver.getStatus()<< " solution at cost " << solver.getValue(objective) << endl << endl; for(i = 0; i < nbRack; i++) { if (solver.getValue(racks[i]->_type) !=0) { solver.out() << "Rack " << i << endl << "Type : " << solver.getValue(racks[i]->_type) << endl << "Price : " << solver.getValue(racks[i]->_price) << endl << "Counters : "; for (j = 0; j < nbCardTypes; j++) solver.out() << solver.getValue(racks[i]->_counters[j]) << " "; solver.out() << endl << endl; } } } else solver.out() << "No solution" << endl; solver.printInformation(); for (i = 0; i < nbRack; ++i) delete racks[i]; } catch (IloException& ex) { cout << "Error: " << ex << endl; } env.end(); return 0; }
Executing this program with those data produces the following output. The optimal solution is found very rapidly, but the proof of optimality takes 100 times longer.
© Copyright IBM Corp. 1987, 2009. Legal terms. | PREVIOUS NEXT |