Escolar Documentos
Profissional Documentos
Cultura Documentos
Eliseo Melgarejo
http://www.udec.cl/~eliseomelgarejo
Agradecimientos Rodrigo Linfati M.
http://www.linfati.cl
Contenidos
Contexto Nuevo Proyecto en Visual C++ Comandos bsicos Programacin lineal Programacin entera
Familia ILOG
Metodos de Solucin
Visual C++
Es un entorno de desarrollo integrado (IDE) para lenguajes de programacin C, C++ y C++/CLI
Cuenta con una versin Express, llamada Microsoft Visual C++ Express Edition, la cual es gratuita y se puede descargar desde el sitio de Microsoft.
Visual C++ ocupa librerias como por ejemplo libreras de Ilog Cplex
Programacin Lineal
Base c++
try { }
Definicin de ambiente
Antes de crear cualquier modelo se debe crear un objeto de la clase IloEnv, conocido como Enviroment dentro de la funcin main. IloEnv env; env.end();
Definicin de modelo
Luego de crear el Enviroment debemos crear un modelo dentro de try IloModel modelo(env);
Definicin de variables
Tipos de variables
IloInt IloFloat IloBool
Ej
IloNumArray vector (env, 5); vector[i] , para toda i=1,..,5 IloBool vector;
IloNumArray data(env, 3, 1.0, 2.0, 3.0); cout << data << endl; [1.0, 2.0, 3.0]
Definicin de variables
Variables de decisin
IloNumVarArray IloIntVarArray IloBoolVarArray
Longitud arreglo
Limite superior
Ej
Definicin de variables
Expresiones IloExpr Ej: IloExpr fo = 2*x[0]+3*x[1]; IloExpr expr(env); for (int i = 0; i < x.getSize(); ++i) expr += c[i] * x[i]; (particular) (general)
Longitud arreglo
expr.end();
(liberar memoria)
Definicin de variables
Expresiones IloExpr Ej2: IloInt sizeX=5; IloNumVarArray x(env,sizeX,0,IloInfinity); IloNumArray c(env,sizeX); for (IloInt i=0; i<sizeX; i++) { c[i]=i; IloExpr sum = IloScalProd(c,x); }
Definicin de variables
modelo.add(IloMinimize(env, expr));
Restricciones
Restriciones
Expresin
Metodo1: modelo.add(2*x[0] + x[1] <= 18 ); modelo.add(2*x[0] + 3*x[1] <= 42 ); modelo.add(3*x[0] + x[1] <= 24 );
Restricciones
Restriciones Metodo2:
Limite inferior (env,LI,expr,LS) Limite superior
Expresin
IloRange r1(env,15, 2*x[0] + x[1] , 18 )); IloRange r2(env,2*x[0] + 3*x[1] , 42 )); IloRange r3(env,24, 3*x[0] + x[1])); modelo.add(r1); modelo.add(r2); modelo.add(r3);
Restricciones
Restriciones
Limite inferior Limite superior Expresin
range.add(IloRange(env, 4, 2*x[0] + x[1] , 18 )); range.add(IloRange(env, 2, 2*x[0] + 3*x[1] , 42 )); range.add(IloRange(env, 0, 3*x[0] + x[1] , 24 )); modelo.add(range);
Cmo resolver?
IloCplex cplex ( env ); cplex.setOut(env.getNullStream()); // omitir para problemas grandas para ver como avanza la solucion cplex.extract(modelo); cplex.exportModel ( salida.lp" ); env.out() << "Variables binarias: " << cplex.getNbinVars() << endl; env.out() << "Variables Enteras: " << cplex.getNintVars() << endl; env.out() << "Filas - Restricciones: " << cplex.getNrows() << endl; env.out() << "Columnas - Variables: " << cplex.getNcols() << endl; if ( !cplex.solve() ) { env.error() << "No se pudo resolver :-(" << endl; throw ( -1 ); } env.out() << "Es optimo ? = " << cplex.getStatus() << endl; env.out() << "Valor de fo = " << cplex.getObjValue() << endl; env.out() << "Se demoro = " << env.getTime() << endl; } catch (IloException& ex) { cerr << "Error Cplex: " << ex << endl; } catch (...) { cerr << "Error Cpp" << endl; } env.end(); return 0;
Ejercicios
Practicando..
IloNumVarArray muchasx(env, Nlargo, 0, IloInfinity); cout << muchasx << endl << endl; IloExpr suma = IloSum(muchasx); cout << suma << endl << endl; IloNumArray costos(env,Nlargo); for (IloInt i=0; i<Nlargo; ++i) { costos[i]=i; } IloExpr producto = IloScalProd(costos,muchasx); cout << producto << endl << endl; //qu muestra en producto?? Para Nlargo=4?
Probemos!
Un fabricante de puertas elabora dos tipos de puertas, Puerta Estndar y Puerta de Lujo. Para su elaboracin utiliza los recursos horas-operario y horas-prensa, de los cuales se dispone de 30 y 40 horas para la prxima semana, respectivamente Las caractersticas del proceso hacen que una puerta estndar utilice 1 hora-operario y 2 horas-prensa, mientras que una puerta de lujo ocupa 2 horas-operario y 2 horas prensa. Las utilidades para puertas estndar son de $7 por unidad, mientras que son de $12 para las de lujo.
Probemos!
Mx z = 7 * X1 + 12 * X2 X1 + 2 * X2 <= 30 (Restriccin de horas operarios) 2 * X1 + 2 * X2 <= 40 (Restriccin de horas prensa) X1 >= 0 X2 >= 0
Probemos!
try{ IloModel modelo(env); //funcin objetivo IloNumVarArray x(env, 2, 0, IloInfinity ); IloNumArray c(env, 2, 7, 12); IloExpr expr(env); for (int i = 0; i < x.getSize(); ++i) expr += c[i] * x[i];
modelo.add(IloMaximize(env, expr));
expr.end();
Probemos!
Probemos!
Mx z = 7 * X1 + 12 * X2 X1 + 2 * X2 <= 30 (Restriccin de horas operarios) 2 * X1 + 2 * X2 <= 40 (Restriccin de horas prensa) X1 >= 0 X2 >= 0
EJEMPLO 2
Una empresa manufacturera ha discontinuado la produccin de cierta lnea de productos no provechosa. Esto cre un exceso considerable en la capacidad de produccin. El gerente est considerando dedicar esta capacidad en exceso a uno o ms de tres productos; llammoslo productos 1, 2 y 3. La capacidad disponible de las mquinas, que podra limitar la produccin y los requerimientos por unidad de producto, se resume como sigue:
Ejemplo2
El departamento de ventas indica que el potencial de ventas para los productos 1 y 2 es mayor que la tasa de produccin mxima y que el potencial de ventas para el producto 3 es de 20 unidades por semana. La utilidad unitaria sera de $30, $12 y $ 15 respectivamente, para los productos 1, 2 y 3.
Modelo
X1: Cantidad producida del producto 1 en horas disponibles X2: Cantidad producida del producto 2 en horas disponibles X3: Cantidad producida del producto 3 en horas disponibles. MAX Z = 30*X1 + 12*X2 + 15*X3 S/A 9*X1 + 3*X2 + 5*X3 <= 500 5*X1 + 4*X2 + 0*X3 <= 350 3*X1 + 0*X2 + 2*X3 <= 150
(Restriccin de horas de fresadora)
Ejercicio2(fo)
try {
IloModel modelo(env); //funcin objetivo IloNumVarArray x(env, 3, 0, IloInfinity ); IloNumArray c(env, 3, 30, 12, 15); IloExpr expr(env); for (int i = 0; i < x.getSize(); ++i) expr += c[i] * x[i]; modelo.add(IloMaximize(env, expr)); expr.end();
Ejercicio2
//restricciones IloArray <IloNumArray> matriz(env, 3); for (int i=0; i<3; ++i) { matriz[i] = IloNumArray(env, 3); } matriz[0][0]=9; matriz[0][1]=3; matriz[0][2]=5; matriz[1][0]=5; matriz[1][1]=4; matriz[1][2]=0; matriz[2][0]=3; matriz[2][1]=0; matriz[2][2]=2; cout << matriz << endl << endl; IloNumArray RHS(env,3,500,350,150);
Ejercicio2
IloRangeArray range(env);
Salida excel+duales
//pido mas info IloNumArray temp(env, x.getSize()); cplex.getValues( temp, x); cout << "x = "; cout << temp << endl; cplex.getDuals(temp, range); cout << "Dual: " << temp << endl; cplex.getReducedCosts(temp, x); cout << "Costos Reducidos: " << temp << endl; cplex.getSlacks(temp, range ); cout << "Slacks: " << temp << endl; ofstream salida("salida.csv"); for (int i=0;i<x.getSize();++i) { salida << cplex.getValue(x[i]) << ", "; salida << endl; salida.close();
Solucin Ej 2
Solucin Ej 2