Está en la página 1de 7

Programación lineal.

(PROC LP)
Se trata de encontrar valores x1, x2... xn que optimicen la función objetivo z= c1x1+c2x2+...+cnxn y que
satisfagan las restricciones lineales ai1x1+...+ainxn ∝bi para i= 1,2,...,m, donde ∝ puede ser ≤,≥ o =.
Frecuentemente también se imponen las condiciones xj≥0 ∀j =1,2,...,n.

De forma más desarrollada tenemos que:


optimizar z= c1x1+c2x2+...+cnxn
sujeto a:
a11x1+...+a1nxn ∝ b1
.................................
am1x1+...+amnxn ∝bm
xj ≥ 0 ∀j=1,...,n.
TERMINOLOGÍA:
z = c1x1+...+cnxn --> función objetivo
c1, c2, c3,..., cn --> coeficientes /beneficios
b1, b2, ..., bn --> demandas
aij --> coeficientes tecnológicos
ai1x1+...+a1nxn ∝ b1 --> restricciones tecnológicas.

SAS.
MAXIMIZAR X2
sujeto a:
2x1-x2≥ -2
x1+2x2≤8

data uno;
input _ID_ $ x1 x2 _TYPE_ $ _RHS_;
datalines;
z 0 1 max .
r1 2 -1 ge -2
r2 1 2 le 8
;
proc lp data=uno tableauprint;
run;
Variable Summary Current Tableau

INV(B)*R r1 r2
Col Variable Status Type Price Activity Reduced
Name Cost R_COSTS . -0.2 -0.4
1 x1 BASIC NON- 0 0.8 0 x2 3.6 0.2 0.4
NEG
x1 0.8 -0.4 0.2
2 x2 BASIC NON- 1 3.6 0
NEG PHASE_1_ 0 0 0

3 r1 SURPLUS 0 0 -0.2 z 3.6 0.2 0.4

4 r2 SLACK 0 0 -0.4

Constraint Summary

Row Constraint Name Type S/S Col Rhs Activity Dual


Activity

1 Z OBJECTVE . 0 3.6 .

2 r1 GE 3 -2 -2 -0.2

3 r2 LE 4 8 8 0.4
El máximo de esta función se alcanza en 3,6; y las variables x1 y x2 toman los valores de 0,8 y 3,6
respectivamente.
- "_TYPE_" --> indica el tipo de de desigualdad.
- "_ID_" --> nombre de las restricciones.
- "_RHS_" --> recoge los términos del lado derecho de las restricciones.
- PROC LP opciones --> "TABLEAUPRINT" = muestra la tabla final del simplex.
- LE = menor o igual que
- GE = mayor o igual que
- EQ = igual que

Programación NO lineal. (PROC NLP)


Optimizar f (x1,x2,...,xn)
sujeto a las restricciones:
ci(x1,x2,...,xn)=0 ∀𝑖 ∈ {1,...,me}
ci(x1,x2,...,xn) ≥ ∀𝑖 ∈ {me+1,...,m}
li ≤xi ≤ui ∀𝑖 ∈ {1,...,n}
(x1,x2,...,xn) ∈ Rn

SAS.
Minimizar f = -2x1-2x2-2x3+( x1^2+ x2^2+ x3^2)
sujeto a:
x1+ x2+ x3 ≤ 1
12x1+6x2 ≤ 7
xj ≥ 0

proc nlp;
min f;
decvar x1 x2 x3;
nlincon y1<=1, y2<=7;
y1=x1+x2+x3;
y2=12*x1+6*x2;
lincon x1>=0;
lincon x2>=0;
lincon x3>=0;
f = -2*x1-2*x2-2*x3+(x1**2+x2**2+x3**2);
run;

Optimization Results
Parameter Estimates
N Parameter Estimate Gradient Gradient
Objective Lagrange
Function Function
1 x1 0.333333 -1.333333 -2.22045E-16
2 x2 0.333333 -1.333333 -2.22045E-16
3 x3 0.333333 -1.333333 0
Value of Objective Function = -1.666666667

El valor objetivo de la función es -1.666666667cuando todos los valores estimados son 0.3333.

NOTA: si el valor objetivo es cero o alguna restricción no se cumple al realizar el problema, una posible
solución es añadir después del PROC NLP la sentencia "TECHNIQUE=QUANEW".
- DECVAR --> funciones (variables de decisión en procesos interactivos.
- LINCON --> restricciones lineales.
- NLINCON --> restricciones no lineales.
Problema del transporte. (PROC TRANS)
El problema del transporte es un tipo particular del problema de programación lineal.
En el problema del transporte existe solución factible si y solo si la oferta no es inferior a la demanda.

SAS.
La empresa XXX tiene tres fábricas donde manufactura su producto P, con capacidades de producción
de 25,25 y 10. Debe surtir a 4 almacenes con demandas de 20, 15,20 y 5. Los costos de enviar desde
cualquier fábrica a cualquier almacén se pueden ver en la tabla de abajo.
Costo de Transporte

euro/unidad Almacén 1 Almacén 2 Almacén 3 Almacén 4


Fábrica 1 2 2 0 4
Fábrica 2 5 9 8 3
Fábrica 3 6 4 3 2
¿Cuánto se debe enviar desde cada fábrica a cada almacén con el fin de obtener e mínimo costo de
transporte?
data ejercicio1;
input fabrica $ manufactura almacen1-almacen4;
datalines;
. . 20 15 20 5
fabrica1 25 2 2 0 4
fabrica2 25 5 9 8 3
fabrica3 10 6 4 3 2
;
run;
proctrans COST=ejercicio1 out=salida1;
tailnode fabrica;
headnose almacen1-almacen4;
supplymanufactura;
run;
procprintdata= salida1;
run;

Obs fabrica manufactura almacen1 almacen2 almacen3 almacen4 _DUAL_

1 _DEMAND_ . 20 15 20 5 .

2 fabrica1 25 0 5 20 0 -3

3 fabrica2 25 20 0 0 5 0

4 fabrica3 10 0 10 0 0 -1

5 _DUAL_ . 5 5 3 3 .
Para que el costo sea mínimo en cuanto al transporte, la fábrica 1 debe mandar 5 unidades al almacén 2
y 20 unidades al almacén 3; la fábrica 2 debe mandar 20 unidades al almacén 1 y 5 unidades al almacén
4; y por último, la fábrica 3 debe mandar 10 unidades al almacén 2.

PROC TRANS opciones (CAPACITY --> conjunto de datos conteniendo las capacidades de los arcos,
MINFLOW --> conjunto de datos conteniendo los flujos mínimos de los arcos, NOTHRUKEY --> descarta
un exceso de oferta o demanda)
HEADNONE variables (variables de destino, cabecera de la tabla)
SUPPLY variables (variable de oferta)
TAILNOIDE variable (variable origen)
/*ejercicio1 -->programacion lineal*/
data e1pl;
input _ID_ $ x11-x14 x21-x24 x31-x34 _TYPE_
$ _RHS_; SolutionSummary
datalines;
z 2 2 0 4 5 9 8 3 6 4 3 2 min .
r1 1 1 1 1 0 0 0 0 0 0 0 0 le 25 Terminated Successfully
r2 0 0 0 0 1 1 1 1 0 0 0 0 le 25 ObjectiveValue 165
r3 0 0 0 0 0 0 0 0 1 1 1 1 le 10
r4 1 0 0 0 1 0 0 0 1 0 0 0 ge 20
r5 0 1 0 0 0 1 0 0 0 1 0 0 ge 15
Phase 1 Iterations 7
r6 0 0 1 0 0 0 1 0 0 0 1 0 ge 20
r7 0 0 0 1 0 0 0 1 0 0 0 1 ge 5 Phase 2 Iterations 3
;
proclp data = e1pl tableauprint; Phase 3 Iterations 0
run;
IntegerIterations 0

Variable Summary IntegerSolutions 0

Col Variable Name Status Type Price Activity ReducedCost Initial Basic Feasible Variables 9

1 x11 ALTER NON-NEG 2 0 0 Time Used (seconds) 0

2 x12 BASIC NON-NEG 2 5 0 Number of Inversions 3

3 x13 BASIC NON-NEG 0 20 0

4 x14 NON-NEG 4 0 4 Epsilon 1E-8

5 x21 BASIC NON-NEG 5 20 0 Infinity 1.797693E308

6 x22 NON-NEG 9 0 4 MaximumPhase 1 Iterations 100

7 x23 NON-NEG 8 0 5 MaximumPhase 2 Iterations 100

8 x24 BASIC NON-NEG 3 5 0 MaximumPhase 3 Iterations 99999999

9 x31 NON-NEG 6 0 2 MaximumIntegerIterations 100

10 x32 BASIC NON-NEG 4 10 0 Time Limit (seconds) 120

11 x33 NON-NEG 3 0 1

12 x34 DEGEN NON-NEG 2 0 0

13 r1 SLACK 0 0 3

14 r2 DEGEN SLACK 0 0 0

15 r3 SLACK 0 0 1

16 r4 SURPLUS 0 0 5

17 r5 SURPLUS 0 0 5

18 r6 SURPLUS 0 0 3

19 r7 SURPLUS 0 0 3
El mínimo se alcanza en 165 (valor objetivo); y las variables toman los siguientes valores:

x11 x12 x13 x14


0 5 20 0
x21 x22 x23 x24
20 0 0 5
x31 x32 x33 x34
0 10 0 0
Problema de la asignación lineal. (PROC ASSIGN)
El problema de la asignación lineal es un tipo especial de problema de programación lineal en el que se
asignan recursos destinados a la realización de tareas.
Para que cualquier aplicación se ajuste a un problema de la asignación deben cumplirse las siguientes
soluciones:
- El número de asignados es igual al número de tareas
- Cada asignado se asigna exactamente a una tarea
- Cada tarea debe realizarla exactamente un asignado
- Existe un coste cij asociado con el asignado i que realiza la tarea j
- El objetivo es determinar cómo deben hacerse las asignaciones para minimizar coste

MÉTODO HUNGARO.
Existen cuatro operarios que se pueden asignar al trabajo con tres máquinas. Un estudio de tiempos y
movimientos ha arrojado los siguientes tiempos por operario para las tres máquinas. Indicar qué
operario debe trabajar en qué máquina y cuál de ellos no será asignado a ninguna.
Encontrar la asignación de operarios a máquinas que minimice el tiempo total.

Máquina 1 Máquina 2 Máquina 3


Operario 1 10 7 9
Operario 2 7 5 8
Operario 3 9 8 10
Operario 4 8 9 7

SAS.
/*ejercicio3 -->asignacion*/
data ejercicio3;
input operario $ maquina1-maquina3;
datalines;
operario1 10 7 9
operario2 7 5 8
operario3 9 8 10
operario4 8 9 7
;
procassign data=ejercicio3 out=salida22;
cost maquina1-maquina3;
id operario;
run;
procprintdata=salida22;
run;
Obs operario maquina1 maquina2 maquina3 _ASSIGN_ _FCOST_ Para que la asignación sea óptima, al
1 Operario1 10 7 9 maquina2 7 operario 1 se le debe de asignar la
segunda máquina; al operario 2 se le
2 Operario2 7 5 8 maquina1 7 debe de asignar la primera máquina;
3 Operario3 9 8 10 0 al operario 4 se le debe de asignar la
tercera máquina; y por último, al
4 Operario4 8 9 7 maquina3 7
operario 3 no se le asigna ninguna
/*ejercicio3--> transporte*/ máquina, por lo que queda ocioso.
data e3trans;
input o $ oferta maquina1-maquina3;
datalines;
. . 1 1 1
o1 1 10 7 9
o2 1 7 5 8
o3 1 9 8 10
o4 1 8 9 7
;
run;
proctrans COST=e3trans out=salida9 nothrunet;
tailnode o;
headnose maquina1-maquina3;
supplyoferta;
run;
procprintdata= salida9;
run;

Obs o oferta maquina1 maquina2 maquina3 _DUAL_


1 _DEMAND_ . 1 1 1 .

2 o1 1 0 0 0 0

3 o2 1 0 1 0 -2

4 o3 1 1 0 0 0

5 o4 1 0 0 1 -1

6 _DUAL_ . 9 7 8 .

Según el problema de transporte, al operario 1 no se le debe de asigna ninguna máquina (por lo que
queda ocioso); al operario 2 se le debe de asignar la segunda máquina (ya que el operario 2 oferta una
unidad y ésta se “manda” a la maquina 2); al operario 3 se le debe de asignar la primera máquina (ya
que el operario 3 oferta una unidad y ésta se “manda” a la máquina 1); y por último, al operario 4 se le
debe de asignar la tercera máquina(ya que el operario 3 oferta una unidad y ésta se “manda” a la
máquina 3).
Como podemos observar, esta solución no coincide con el método de asignación, pero más tarde
veremos al realizar el método húngaro que existen dos soluciones óptimas para asignar las máquinas a
cada operario.

/*ejercicio3 -->progrmacion lineal*/


data e3pl;
input _ID_ $ x11-x14 x21-x24 x31-x34 x41-x44 _TYPE_ $ _RHS_;
datalines;
z 10 7 9 0 7 5 8 0 9 8 10 0 8 9 7 0 min .
r1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 eq 1
r2 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 eq 1
r3 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 eq 1
r4 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 eq 1
r5 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 eq 1
r6 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 eq 1
r7 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 eq 1
r6 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 eq 1
proclp data = e3pl tableauprint;
run;
Resumen de la solución

Terminación correcta

Valor objetivo 21

Iteraciones de fase 1 0

Iteraciones de fase 2 4

Iteraciones de fase 3 0

Iteraciones de enteros 0

Soluciones de enteros 0

Variable viable básica inicial 9

Tiempo empleado (segundos) 0

Número de inversiones 3

Epsilon 1E-8

Infinito 1.797693E308

Iteraciones máximas de la fase 1 100

Iteraciones máximas de la fase 2 100

Iteraciones máximas de la fase 3 99999999

Iteraciones enteras máximas 100


El mínimo se alcanza en 21 (valor objetivo); y las variables toman los Límite temporal (segundos) 120
siguientes valores:

x11 x12 x13 x14


0 0 0 1
x21 x22 x23 x24
0 1 0 0
x31 x32 x33 x34
1 0 0 0
x41 x42 x43 x44
0 0 1 0