Está en la página 1de 23

Ejercicio 3.1.

Asignación de transporte de hexano


Considere el ejercicio 6 del capítulo de programación lineal, donde trata la
asignación de transporte de una compañía que es dueña de tres biorefinerías la
cual usa hexano como solvente en el proceso. Las tres biorefinerías están
localizadas en las ciudades A, B y C. el hexano está disponible de 4 proveedores
con instalaciones de fábrica de hexano en las ciudades 1, 2, 3 y 4. La tabla 3.1
registra los requerimientos diarios para hexano en las tres biorefinerías, y la tabla
3.2 proporciona las capacidades de producción de los 4 proveedores.
Tabla 3.1. Requerimientos diarios de hexano por las refinerías.

Biorefinería Requerimiento diario (ton)


A 6
B 1
C 10

El costo de transportar una tonelada de hexano desde cada planta de


abastecimiento a cada biorefinería está dado en la tabla 3.3. El número que figura
en la intersección de un proveedor y consumidor es el costo de transporte por
tonelada.
Se quiere desarrollar y resolver una formulación de optimización que determine la
asignación optima de hexano desde los proveedores a las biorefinerías para
minimizar el costo total de transporte mientras cumple con los requerimientos de las
biorefinerías.
Tabla 3.2. Capacidades de producción diaria de proveedores de hexano.

Instalaciones de producción Producción diaria (ton)


1 7
2 5
3 3
4 6

Tabla 3.3. Costos de transporte, $/ton.

Proveedor Abastecimiento Abastecimiento Abastecimiento


biorefinería A biorefinería B biorefinería C
1 20 10 50
2 30 0 80
3 110 60 150
4 70 10 90
Solución
Representación diagramática del problema:

7 𝑡𝑜𝑛
P1 𝑋1𝐴
6 𝑡𝑜𝑛
A
5 𝑡𝑜𝑛
P2
1 𝑡𝑜𝑛
B
3 𝑡𝑜𝑛
P3

10 𝑡𝑜𝑛
6 𝑡𝑜𝑛 C
P4

Recuerde que las variables de decisión son las toneladas diarias de hexano desde
cada proveedor hasta cada biorefinería consumidora. La tabla 3.4 registra los
términos utilizados para estas variables de decisión (ton/día), que también se
muestran en el diagrama.
Tabla 3.4. Variables de decisión para las cantidades transportadas (ton/día).

Proveedor biorefinería A biorefinería B biorefinería C


1 𝑋1𝐴 𝑋1𝐵 𝑋1𝐶
2 𝑋2𝐴 𝑋2𝐵 𝑋2𝐶
3 𝑋3𝐴 𝑋3𝐵 𝑋3𝐶
4 𝑋4𝐴 𝑋4𝐵 𝑋4𝐶

Función objetivo
Se desea minimizar los costos de transporte, por tanto, la función objetivo es la
siguiente:
𝐶𝑇𝑜𝑡 = 20𝑋1𝐴 + 10𝑋1𝐵 + 50𝑋1𝐶 + 30𝑋2𝐴 + 0𝑋2𝐵 + 80𝑋2𝐶 + 110𝑋3𝐴 + 60𝑋3𝐵
+ 150𝑋3𝐶 + 70𝑋4𝐴 + 10𝑋4𝐵 + 90𝑋4𝐶 (3.1)

Restricciones:
Demanda hexano Biorefinerías
𝑋1𝐴 + 𝑋2𝐴 + 𝑋3𝐴 + 𝑋4𝐴 = 6 𝐸𝑐. 3.2
𝑋1𝐵 + 𝑋2𝐵 + 𝑋3𝐵 + 𝑋4𝐵 = 1 𝐸𝑐. 3.3
𝑋1𝐶 + 𝑋2𝐶 + 𝑋3𝐶 + 𝑋4𝐶 = 10 𝐸𝑐. 3.4
Disponibilidad de hexano proveedores
𝑋1𝐴 + 𝑋1𝐵 + 𝑋1𝐶 ≤ 7 𝐸𝑐. 3.5
𝑋2𝐴 + 𝑋2𝐵 + 𝑋2𝐶 ≤ 5 𝐸𝑐. 3.6
𝑋3𝐴 + 𝑋3𝐵 + 𝑋3𝐶 ≤ 3 𝐸𝑐. 3.7
𝑋4𝐴 + 𝑋4𝐵 + 𝑋4𝐶 ≤ 6 𝐸𝑐. 3.8
Restricción de no negatividad
𝑋1𝐴 ≥ 0, 𝑋1𝐵 ≥ 0, … , 𝑋4𝐶 ≥ 0
Solución con LINGO
La formulación en LINGO es dada por el siguiente programa
TITLE ASIGNACION DE TRANSPORTE DE HEXANO;

!VARIABLES
X1A, X1B, X1C
X2A, X2B, X2B
X3A, X3C, X3C
X4A, X4B, X4C

FUNCION OBJETIVO;

[COSTOSDETRANSPORTE] Min = 20*X1A + 10*X1B + 50*X1C + 30*X2A + 0*X2B


+ 80*X2C + 110*X3A + 60*X3B + 150*X3C+ 70*X4A + 10*X4B + 90*X4C;

!RESTRICCIONES;

X1A + X2A + X3A + X4A = 6;


X1B + X2B + X3B + X4B = 1;
X1C + X2C + X3C + X4C = 10;
X1A + X1B + X1C <= 7;
X2A + X2B + X2C <= 5;
X3A + X3B + X3C <= 3;
X4A + X4B + X4C <= 6;
X1A >=0;
X1B >=0;
X1C >=0;
X2A >=0;
X2B >=0;
X2C >=0;
X3A >=0;
X3B >=0;
X3C >=0;
X4A >=0;
X4B >=0;
X4C >=0;

Resolviendo usando LINGO, se obtiene la siguiente solución optima


Objective value: 840.0000

Variable Value Reduced Cost


X1A 1.000000 0.000000
X1B 0.000000 40.00000
X1C 6.000000 0.000000
X2A 5.000000 0.000000
X2B 0.000000 20.00000
X2C 0.000000 20.00000
X3A 0.000000 50.00000
X3B 0.000000 50.00000
X3C 0.000000 60.00000
X4A 0.000000 10.00000
X4B 1.000000 0.000000
X4C 4.000000 0.000000

Row Slack or Surplus Dual Price


COSTOSDETRANSPORTE 840.0000 -1.000000
DEMANDAA 0.000000 -60.00000
DEMANDAB 0.000000 -10.00000
DEMANDAC 0.000000 -90.00000
DISPONIBILIDADPROV1 0.000000 40.00000
DISPONIBILIDADPROV2 0.000000 30.00000
DISPONIBILIDADPROV3 3.000000 0.000000
DISPONIBILIDADPROV4 1.000000 0.000000
9 1.000000 0.000000
10 0.000000 0.000000
11 6.000000 0.000000
12 5.000000 0.000000
13 0.000000 0.000000
14 0.000000 0.000000
15 0.000000 0.000000
16 0.000000 0.000000
17 0.000000 0.000000
18 0.000000 0.000000
19 1.000000 0.000000
20 4.000000 0.000000

Como se puede observar en el reporte de la solución de LINGO, la función objetivo


obtuvo un valor de 840, es decir, un costo mínimo de transporte de $840, ésta
solución es la misma que se obtuvo utilizando el solver de Excel en el capítulo 1,
así mismo, el proveedor 1 abastece a las plantas A y C, el proveedor 2 solamente
abastece a la planta A, el proveedor 3 no abastece a ninguna planta y, por último,
el proveedor 4 abastece a las plantas B y C.
En el “solution report” de LINGO encontramos (además de otras líneas) dos tablas.
La primera tabla muestra los valores óptimos de las variables, que están en la
columna llamada “value”, la segunda columna llamada “Reduced cost”, indica lo que
empeoraría la función objetivo (es decir, lo que disminuiría si el problema es de
maximizar o lo que aumentaría si es de minimizar) sin en lugar de haber exigido que
la variable correspondiente fuera no negativa ( X ≥ 0 ) se hubiera exigido X ≥ 1, por
ejemplo:
Se ha visto en la solución que no conviene transportar hexano del proveedor 1 a la
planta B, pero si se exigiera transportar 1 tonelada ( es decir, si se exigiera
𝑋1𝐵 ≥ 1) los costos aumentarían $40, en general, por cada tonelada que se
transporte del proveedor 1 a la biorefinería B, el costo aumentaría $40.
Así mismo, también podemos decir que, si se transportara hexano del proveedor 2
a la planta B, los costos aumentarían en $20, en general, por cada tonelada que se
transporte del proveedor 2 a la biorefinería B, el costo aumentaría $20
Ahora bien, Como conviene transportar hexano del proveedor 1 a la biorefinería C,
si se exigiera transportar al menos una tonelada (𝑋1𝐶 ≥ 1) se seguiría transportando
6 toneladas, con lo que la solución sería la misma y los costos no variarían. Por eso
el coste reducido es 0.
Sería un error muy grave interpretar el coste reducido igual a 0 como que si en lugar
de transportar 6 toneladas de hexano del proveedor 1 a la biorefinería C se decidiera
transportar 7 toneladas los ingresos serían los mismos.
En la segunda tabla, para las filas asociadas a las restricciones, la columna “Slack"
contiene la variable de holgura de la restricción correspondiente, es decir, la
diferencia entre el valor que toma la restricción y el valor máximo o mínimo que
puede tomar. En nuestro ejemplo:
La holgura de la restricción sobre la demanda de la biorefinería A es 0, lo cual
significa que los proveedores abastecerán la demanda de 6 toneladas de la
biorefinería A (siempre le entregarán lo demandado). Igualmente, para las
biorefinerías B y C.
La holgura de la restricción sobre la disponibilidad del proveedor 1 es 0, lo cual
significa que el proveedor 1 entrega a las biorefinerías toda su producción diaria de
7 ton disponibles (no sobrará nada), igualmente para el proveedor 2 el cual entrega
toda su producción diaria de 5 toneladas.
La holgura del proveedor 3 es de 3, lo que significa que el proveedor 3 le sobrarán
3 toneladas de hexano diario, es decir, en este caso como la producción es 3
toneladas le sobrará esa misma cantidad.
La holgura del proveedor 4 es de 1, lo que significa que el proveedor 4 le sobrará 1
tonelada de hexano diario, es decir, de las 6 toneladas diarias que produce
entregará 5 y le sobrará 1 tonelada.
la columna “Dual Price” indica lo que mejoraría o empeoraría la función objetivo por
cada unidad que se pudiera aumentar el término independiente de la restricción
correspondiente. En nuestro ejemplo:
Por cada tonelada más de hexano que pudiera demandar la biorefinería A, los
costos aumentarían en $60. Así mismo, Por cada tonelada más de hexano que
pudiera demandar la biorefinería B, los costos aumentarían en $10, y para la
biorefinería C, los costos aumentarían $90. De esta forma, en el caso de un aumento
en la demanda de hexano, a la compañía le interesaría que dicho incremento se
produzca en la biorefinería B.
En cuanto a la disponibilidad de los proveedores, por cada tonelada más de hexano
producida del proveedor 1 y 2, los costos se reducirían en $40 y $30
respectivamente.
Como los proveedores 3 y 4 les sobra hexano, producir 1 tonelada más de hexano
no ayudaría en nada, la solución sería la misma y los costos también. Por eso el
precio dual es 0.
Ejercicio 3.2 Reciclo de agua en la planta de ácido fórmico (lineal) (pág. 96,
103 y 282-Mahmoud)
Considere el proceso de fabricación de ácido fórmico (CHOOH) mostrado en la
figura 3.2. La biomasa se gasifica para producir una mezcla de gas de síntesis. Se
utiliza un separador sólido-gas para eliminar las partículas denominadas cenizas
volantes. Para evitar el problema de la eliminación de residuos sólidos de las
cenizas volantes mientras se agrega valor, el agua se mezcla con las cenizas
volantes para producir una pasta que se puede usar en la fabricación de materiales
de construcción (por ejemplo, al hacer ladrillos o proporcionar un relleno para
asfalto). Los gases calientes que salen del separador sólido-gas se separan en
diferentes corrientes, incluyendo una corriente de monóxido de carbono que se usa
como un reactivo en la fabricación de ácido fórmico. El enfriamiento con agua se
utiliza para enfriar los gases calientes, dejando el separador de gas sólido. La
corriente de monóxido de carbono que sale del sistema de separación de gases se
hace reaccionar con metanol para dar formiato de metilo (HCOOCH3) a través de
la siguiente reacción de carbonilación en presencia de un catalizador de base fuerte:
𝐶𝐻3 𝑂𝐻 + 𝐶𝑂 ⟶ 𝐻𝐶𝑂𝑂𝐶𝐻3
El formiato de metilo se recupera usando una columna de destilación. Luego, se usa
agua para hidrolizar el formiato de metilo a ácido fórmico y metanol como sigue:
𝐻𝐶𝑂𝑂𝐶𝐻3 + 𝐻2 𝑂 ⟶ 𝐻𝐶𝑂𝑂𝐻 + 𝐶𝐻3 𝑂𝐻

Figura 3.2. Diagrama de bloques del proceso de ácido fórmico


Se utiliza una red de separación para recuperar el ácido fórmico y producir una
corriente de agua destilada y otra corriente de compuestos orgánicos.
Hay tres sumideros de proceso que utilizan agua fresca: el estabilizador de cenizas
volantes, la columna de enfriamiento y el reactor de hidrólisis. Actualmente, se utiliza
un total de 9500 kg/h de agua fresca en enfriamiento e hidrólisis. Dos corrientes de
proceso (fuentes) se consideran para reciclaje: el efluente de enfriamiento y el agua
destilada. Un total de 7000 kg/h de agua residual se descarga como efluente de
enfriamiento y agua destilada. Se desea utilizar el reciclo directo para reducir el uso
de agua fresca y la descarga de aguas residuales. Las siguientes restricciones
definen los rangos aceptables para los caudales y las concentraciones alimentadas
a los dos sumideros del proceso.
Estabilizador de cenizas volantes
500 ≤ 𝑓𝑙𝑢𝑗𝑜 𝑑𝑒 𝑎𝑔𝑢𝑎 𝑎𝑙𝑖𝑚𝑒𝑛𝑡𝑎𝑑𝑎 𝑎𝑙 𝑒𝑠𝑡𝑎𝑏𝑖𝑙𝑖𝑧𝑎𝑑𝑜𝑟 𝑑𝑒 𝑐𝑒𝑛𝑖𝑧𝑎𝑠 (𝑘𝑔⁄ℎ) ≤ 600
0.0 ≤ 𝑐𝑜𝑛𝑐𝑒𝑛𝑡𝑟𝑎𝑐𝑖ó𝑛 𝑑𝑒 𝑖𝑚𝑝𝑢𝑟𝑒𝑧𝑎𝑠 (% 𝑝⁄𝑝) ≤ 10.0

Columna de enfriamiento
3000 ≤ 𝑓𝑙𝑢𝑗𝑜 𝑑𝑒 𝑎𝑔𝑢𝑎 𝑑𝑒 𝑒𝑛𝑓𝑟𝑖𝑎𝑚𝑖𝑒𝑛𝑡𝑜 𝑎𝑙𝑖𝑚𝑒𝑛𝑡𝑎𝑑𝑎 𝑎 𝑙𝑎 𝑐𝑜𝑙𝑢𝑚𝑛𝑎 (𝑘𝑔⁄ℎ) ≤ 3500
0.0 ≤ 𝑐𝑜𝑛𝑐𝑒𝑛𝑡𝑟𝑎𝑐𝑖ó𝑛 𝑑𝑒 𝑖𝑚𝑝𝑢𝑟𝑒𝑧𝑎𝑠 (% 𝑝⁄𝑝) ≤ 3.0

Reactor de hidrolisis
3000 ≤ 𝑓𝑙𝑢𝑗𝑜 𝑑𝑒 𝑎𝑔𝑢𝑎 𝑑𝑒 𝑒𝑛𝑓𝑟𝑖𝑎𝑚𝑖𝑒𝑛𝑡𝑜 𝑎𝑙𝑖𝑚𝑒𝑛𝑡𝑎𝑑𝑎 𝑎 𝑙𝑎 𝑐𝑜𝑙𝑢𝑚𝑛𝑎 (𝑘𝑔⁄ℎ) ≤ 3500
La tabla 3.5 resume los datos para los sumideros de proceso. La tabla 3.6
proporciona los datos para las fuentes de proceso organizadas en orden ascendente
de concentración de impurezas.
Tabla 3.5. Datos de sumidero para el problema de ácido fórmico
Máxima fracción Máxima carga de
Flujo
Sumidero másica de entrada de entrada de impurezas
(Kg/h)
impurezas (Kg/h)
Reactor de
6000 0.0100 60
hidrolisis
Columna de
3000 0.0300 90
enfriamiento
Estabilizador de
500 0.1000 50
cenizas volantes
Tabla 3.6. Datos de la fuente para el problema de ácido fórmico
Máxima fracción másica Máxima carga de
Flujo
Fuente de entrada de entrada de impurezas
(Kg/h)
impurezas (Kg/h)
Agua destilada 4000 0.0175 70
Efluente de
3000 0.0600 180
enfriamiento

Solución
El objetivo aquí es minimizar el uso de agua dulce. Se designa entonces el flujo del
agua como Fresh. Por lo tanto, la función objetivo se puede expresar como:
Función objetivo
Minimizar: Fresh
La velocidad de flujo del agua es la suma de las velocidades de flujo del agua
utilizada en los tres sumideros del proceso (j =3, reactor de hidrólisis, columna de
enfriamiento y estabilizador de cenizas volantes), que se denominan FreshHydro,
FreshQuen, FreshSta, respectivamente. Por lo tanto,
Fresh = FreshHidro + FreshQuen + FreshSta Ec.3.9
Al considerar el reciclo directo, el problema tiene dos fuentes de proceso (i = 2, agua
destilada y efluente de enfriamiento). Cada una de las fuentes de proceso se divide
y alimenta a los tres sumideros de proceso. Además, las fuentes de proceso no
recirculadas se descargan al sistema de tratamiento de residuos. Sea el flujo del
agua destilada designado como FDest y los flujos de agua destilada suministrada a
los tres sumideros del proceso y al tratamiento de aguas residuales como:
FDestHydro, FDestQuen, FDestSta, y FDestWaste.
Por lo tanto, la restricción de división de fuente para el agua destilada se puede
escribir como:
FDest = FDestHydro + FDestQuen + FDestSta + FDestWaste Ec.3.10
Similarmente, La restricción de división para la fuente de descarga de efluentes está
dada por:
FEflue = FEflueHydro + FEflueQuen + FEflueSta + FEflueWaste Ec.3.11
A continuación, se representa el punto de mezcla de las fuentes divididas y les
asignan a los sumideros. Las siguientes son las restricciones de equilibrio de flujo y
componentes para el agua y el contaminante que ingresa a cada sumidero:
Reactor de hidrolisis
FDestHydro + FEflueHydro + FreshHidro = 6000 Ec.3.12
FDestHydro ∗ 0.0175 + FEflueHydro ∗ 0.06 ≤ 6000 ∗ 0.01 Ec.3.13

Columna de enfriamiento
FDestQuen + FEflueQuen + FreshQuen = 3000 Ec.3.14
FDestQuen ∗ 0.0175 + FEflueQuen ∗ 0.06 ≤ 3000 ∗ 0.03 Ec.3.15

Estabilizador de cenizas volantes


FDestSta + FEflueSta + FreshSta = 500 Ec.3.16
FDestSta ∗ 0.0175 + FEflueSta ∗ 0.06 ≤ 500 ∗ 0.1 Ec.3.17

Del mismo modo, el flujo total que va a tratamiento de residuos está dado por:
Waste = FDestWaste + FEflueWaste Ec.3.18

También se necesitan restricciones adicionales para garantizar la no negatividad de


las variables y los límites adecuados en la alimentación a los sumideros.

Solución con LINGO


La formulación de este problema en LINGO es dada por el siguiente programa
TITLE PLANTA DE ÁCIDO FÓRMICO;

Min=Fresh;
Fresh=FreshHydro+FreshQuen+FreshSta;

FDest=4000;
FDest=FDestHydro+FDestQuen+FDestSta+FDestWaste;

FEflue=3000;
FEflue=FEflueHydro+FEflueQuen+FEflueSta+FEflueWaste;

FDestHydro + FEflueHydro + FreshHydro =6000;


FDestHydro*0.0175+FEflueHydro*0.06 <=6000*0.01;

FDestQuen+FEflueQuen+FreshQuen =3000;
FDestQuen*0.0175+FEflueQuen*0.06 <=3000*0.03;
FDestSta + FEflueSta + FreshSta =500;
FDestSta*0.0175+FEflueSta*0.06 <=500*0.1;

Waste=FDestWaste + FEflueWaste;

Resolviendo con LINGO, se obtiene la siguiente solución optima


Objective value: 3666.667

Variable Value Reduced Cost


FRESH 3666.667 0.000000
FRESHHYDRO 2571.429 0.000000
FRESHQUEN 1095.238 0.000000
FRESHSTA 0.000000 1.000000
FDEST 4000.000 0.000000
FDESTHYDRO 3428.571 0.000000
FDESTQUEN 571.4286 0.000000
FDESTSTA 0.000000 0.7083333
FDESTWASTE 0.000000 0.7083333
FEFLUE 3000.000 0.000000
FEFLUEHYDRO 0.000000 0.000000
FEFLUEQUEN 1333.333 0.000000
FEFLUESTA 500.0000 0.000000
FEFLUEWASTE 1166.667 0.000000
WASTE 1166.667 0.000000

Row Slack or Surplus Dual Price


1 3666.667 -1.000000
2 0.000000 -1.000000
3 0.000000 0.7083333
4 0.000000 -0.7083333
5 0.000000 0.000000
6 0.000000 0.000000
7 0.000000 -1.000000
8 0.000000 16.66667
9 0.000000 -1.000000
10 0.000000 16.66667
11 0.000000 0.000000
12 20.00000 0.000000
13 0.000000 0.000000

Como se puede observar en el reporte de la solución de LINGO, la función


objetivo obtuvo un valor de 3666.67, es decir, un uso mínimo de agua dulce de
3667 kg/h. Se puede observar en la solución que al utilizar el reciclo directo, nos
ahorramos una gran cantidad de agua dulce, de 9500 kg/h que se usaba antes de
la optimización ahora se usa 3667 kg/h, es decir, un ahorro de 5833 kg/h de agua
dulce. La figura 3.3a muestra la implementación de esta solución.
Figura 3.3a. Implementación de los objetivos para el proceso de ácido fórmico (todos los números
representan el flujo desde la fuente hasta el sumidero en kg/h)

Ahora bien, ¿Pero es esta la única implementación posible de los objetivos?


Examinemos otro arreglo. Suponga que se asigna toda el agua dulce (3667 kg/h) al
reactor de hidrólisis.
FreshHidro = 3666.667
Entonces, resolviendo nuevamente el programa en LINGO con la nueva restricción
se obtiene:
Objective value: 3666.667

Variable Value
FRESH 3666.667
FRESHHYDRO 3666.667
FRESHQUEN 0.000000
FRESHSTA 0.000000
FDEST 4000.000
FDESTHYDRO 1882.352
FDESTQUEN 2117.648
FDESTSTA 0.000000
FDESTWASTE 0.000000
FEFLUE 3000.000
FEFLUEHYDRO 450.9805
FEFLUEQUEN 882.3525
FEFLUESTA 500.0000
FEFLUEWASTE 1166.667
WASTE 1166.667

La figura 3.3b muestra esta solución.


Se pueden generar otras soluciones asignando varios valores de una división
asignada a un sumidero y resolviendo el programa de optimización revisado.

Figura 3.3b. Implementación alternativa de los objetivos para el proceso de ácido fórmico (todos los
números representan el flujo desde la fuente hasta el sumidero en kg/h)
Ejercicio 3.3. Asignación de una red de flujos
En este problema, se resolverá el ejercicio 2.1 del capítulo de MILP utilizando
LINGO, en este caso, se va a presentar como llamar variables binarias en la
formulación de LINGO.
En este problema se quiere asignar corrientes a intercambiadores de calor y el costo
(hasta cierto punto) de hacerlo se detalla la tabla 3.7.
Tabla 3.7. Costos de transferencia

Intercambiadores
Corrientes 1 2 3 4
A 94 1 54 68
B 74 10 88 82
C 73 88 8 76
D 11 74 81 21

Cada elemento en la tabla 3.7 representa el costo de transferir la corriente i al


intercambiador j. ¿cómo se puede minimizar el costo si cada corriente va
únicamente a un solo intercambiador?
Solución
En este problema de asignación lo que se quiere encontrar son las corrientes que
pasan por cada intercambiador, es decir, una corriente pasará solamente por un
intercambiador, minimizando los costos.
El número total de n corrientes e intercambiadores son 4. Se define entonces 𝑐𝑖𝑗
como el costo de asignar la corriente i en el intercambiador j. Entonces, el problema
de asignación queda de la siguiente forma:
𝑛 𝑛

𝑀𝑖𝑛𝑖𝑚𝑖𝑧𝑎𝑟 𝑍 = ∑ ∑ 𝑐𝑖𝑗 𝑥𝑖𝑗 Ec. 3.19


𝑖=1 𝑗=1

Sujeto a
𝑛

∑ 𝑥𝑖𝑗 = 1 𝑗 = 1, … , 𝑛 Ec. 3.20


𝑖=1
𝑛

∑ 𝑥𝑖𝑗 = 1 𝑖 = 1, … , 𝑛 Ec. 3.21


𝑗=1
𝑥𝑖𝑗 ≥ 0 𝑖, 𝑗 = 1, … , 𝑛 Ec. 3.22

Aquí, i representa el índice para las n corrientes y j el índice para los n


intercambiadores. 𝑥𝑖𝑗 es la variable binaria que representa la existencia la corriente
i en el intercambiador j, es decir, 𝑥𝑖𝑗 = 1 si la corriente i es asignada al
intercambiador j, y 𝑥𝑖𝑗 = 0 si no lo es.

El problema entonces, consiste en minimizar los costos sujeto a las restricciones


anteriores. La variable 𝑥𝑖𝑗 se debe declarar como variable binaria mientras que la
variable 𝑐𝑖𝑗 como continua no negativa.

Solución con LINGO


La formulación de este problema en LINGO es dada por el siguiente programa
TITLE ASIGNACION DE RED DE FLUJOS;

MIN = XA1*94 + XA2*1 + XA3*54 + XA4*68 +


XB1*74 + XB2*10 + XB3*88 + XB4*82 +
XC1*73 + XC2*88 + XC3*8 + XC4*76 +
XD1*11 + XD2*74 + XD3*81 + XD4*21;

XA1 + XB1 + XC1 + XD1 = 1;


XA2 + XB2 + XC2 + XD2 = 1;
XA3 + XB3 + XC3 + XD3 = 1;
XA4 + XB4 + XC4 + XD4 = 1;

XA1 + XA2 + XA3 + XA4 = 1;


XB1 + XB2 + XB3 + XB4 = 1;
XC1 + XC2 + XC3 + XC4 = 1;
XD1 + XD2 + XD3 + XD4 = 1;

@BIN(XA1);
@BIN(XA2);
@BIN(XA3);
@BIN(XA4);
@BIN(XB1);
@BIN(XB2);
@BIN(XB3);
@BIN(XB4);
@BIN(XC1);
@BIN(XC2);
@BIN(XC3);
@BIN(XC4);
@BIN(XD1);
@BIN(XD2);
@BIN(XD3);
@BIN(XD4);
END
Resolviendo con LINGO, se obtiene la siguiente solución optima
Objective value: 97.00000

Variable Value Reduced Cost

XA1 0.000000 94.00000


XA2 0.000000 1.000000
XA3 0.000000 54.00000
XA4 1.000000 68.00000
XB1 0.000000 74.00000
XB2 1.000000 10.00000
XB3 0.000000 88.00000
XB4 0.000000 82.00000
XC1 0.000000 73.00000
XC2 0.000000 88.00000
XC3 1.000000 8.000000
XC4 0.000000 76.00000
XD1 1.000000 11.00000
XD2 0.000000 74.00000
XD3 0.000000 81.00000
XD4 0.000000 21.00000

Como se puede observar en el reporte de la solución de LINGO, la función objetivo


obtuvo un valor de 97, es decir, un costo mínimo de $97, ésta solución es la misma
que se obtuvo utilizando el solver de Excel en el capítulo MILP, así mismo, la
asignación de las corrientes quedó de la siguiente forma: la corriente A pasa por el
intercambiador 4, la corriente B con el intercambiador 2, la corriente C con el
intercambiador 3, y la corriente D con el intercambiador 1.
Como se puede ver en la formulación de LINGO, para invocar una variable binaria,
se utiliza el comando @BIN(X), donde X es la de variable binaria. Otra forma de
resolver este problema en LINGO es mediante el uso del comando SET (conjunto),
el cual simplifica las ecuaciones, de modo se puede escribir de forma compacta. El
uso de formulaciones de conjuntos es deseable en problemas donde se trata con
restricciones repetitivas. Más adelante se resolverán un par de problemas utilizando
el comando SET.
Ejercicio 3.4. Desarrollo de una formulación con el comando SET para el
problema de transporte 3.1
El problema 3.1 se ocupó del transporte de hexano desde los proveedores en las
ciudades 1, 2, 3 y 4 hasta las biorefinerías consumidoras ubicadas en las ciudades
A, B y C. La tabla 3.1 enumeró los requisitos diarios para el hexano en las tres
biorefinerías y la tabla 3.2 dio las capacidades de producción de los cuatro
proveedores. La Tabla 3.3 indica los costos ($ / tonelada) del envío de hexano desde
cada planta de suministro a cada biorefinería que consume.
Desarrolle y resuelva un programa de optimización utilizando formulaciones de
conjuntos (apéndice xxx) para determinar la asignación óptima de hexano de los
proveedores a las biorefinerías para minimizar el costo total de transporte y cumplir
con los requisitos de las biorefinerías.
Solución
El siguiente programa proporciona la formulación de optimización. Para ver el
programa en detalles, vaya al menú desplegable de LINGO, seleccione "Generate"
y luego seleccione "Display model" como se muestra en la Fig. 3.4.
SETS:
SOURCES/1..4/: Capacity;
DESTINATIONS/A B C/ :Demand;
CONNECTIONS (SOURCES, DESTINATIONS): Cost,
Flowrate;
ENDSETS
Min = @SUM (CONNECTIONS (i,j):
Cost(i,j)*Flowrate(i,j));
DATA:
Capacity = 7 5 3 6;
Demand = 6 1 10;
Cost = 20 10 50
30 0 80
110 60 150
70 10 90;
ENDDATA
! Supply Availability Constraints;
@FOR (SOURCES (i):
@SUM (DESTINATIONS (j):
Flowrate (i,j) )<= Capacity(i));
! Demand Constraints;
@FOR (DESTINATIONS (j):
@SUM (SOURCES (i):
Flowrate(i,j) )= Demand (j));
@FOR( SOURCES(i): @FOR( DESTINATIONS(j):
Figura 3.4. desplegando el modelo

El modelo mostrado se muestra en el siguiente Programa.


MODEL:
[_1] MIN= 20 * FLOWRATE_1_A + 10 * FLOWRATE_1_B + 50 * FLOWRATE_1_C + 30
*
FLOWRATE_2_A + 80 * FLOWRATE_2_C + 110 * FLOWRATE_3_A + 60 *
FLOWRATE_3_B + 150 *
FLOWRATE_3_C + 70 * FLOWRATE_4_A + 10 * FLOWRATE_4_B + 90 *
FLOWRATE_4_C;
[_2] FLOWRATE_1_A + FLOWRATE_1_B + FLOWRATE_1_C <= 7;
[_3] FLOWRATE_2_A + FLOWRATE_2_B + FLOWRATE_2_C <= 5;
[_4] FLOWRATE_3_A + FLOWRATE_3_B + FLOWRATE_3_C <= 3;
[_5] FLOWRATE_4_A + FLOWRATE_4_B + FLOWRATE_4_C <= 6;
[_6] FLOWRATE_1_A + FLOWRATE_2_A + FLOWRATE_3_A + FLOWRATE_4_A = 6;
[_7] FLOWRATE_1_B + FLOWRATE_2_B + FLOWRATE_3_B + FLOWRATE_4_B = 1;
[_8] FLOWRATE_1_C + FLOWRATE_2_C + FLOWRATE_3_C + FLOWRATE_4_C = 10;
[_9] FLOWRATE_1_A >= 0;
[_10] FLOWRATE_1_B >= 0;
[_11] FLOWRATE_1_C >= 0;
[_12] FLOWRATE_2_A >= 0;
[_13] FLOWRATE_2_B >= 0;
[_14] FLOWRATE_2_C >= 0;
[_15] FLOWRATE_3_A >= 0;
[_16] FLOWRATE_3_B >= 0;
[_17] FLOWRATE_3_C >= 0;
[_18] FLOWRATE_4_A >= 0;
[_19] FLOWRATE_4_B >= 0;
[_20] FLOWRATE_4_C >= 0;
END
Resolviendo con LINGO, se obtiene la siguiente solución optima
Objective value: 840.0000

Variable Value Reduced Cost

CAPACITY (1) 7.000000 0.000000


CAPACITY (2) 5.000000 0.000000
CAPACITY (3) 3.000000 0.000000
CAPACITY (4) 6.000000 0.000000
DEMAND (A) 6.000000 0.000000
DEMAND (B) 1.000000 0.000000
DEMAND (C) 10.00000 0.000000
COST (1, A) 20.00000 0.000000
COST (1, B) 10.00000 0.000000
COST (1, C) 50.00000 0.000000
COST (2, A) 30.00000 0.000000
COST (2, B) 0.000000 0.000000
COST (2, C) 80.00000 0.000000
COST (3, A) 110.0000 0.000000
COST (3, B) 60.00000 0.000000
COST (3, C) 150.0000 0.000000
COST (4, A) 70.00000 0.000000
COST (4, B) 10.00000 0.000000
COST (4, C) 90.00000 0.000000
FLOWRATE (1, A) 1.000000 0.000000
FLOWRATE (1, B) 0.000000 40.00000
FLOWRATE (1, C) 6.000000 0.000000
FLOWRATE (2, A) 5.000000 0.000000
FLOWRATE (2, B) 0.000000 20.00000
FLOWRATE (2, C) 0.000000 20.00000
FLOWRATE (3, A) 0.000000 50.00000
FLOWRATE (3, B) 0.000000 50.00000
FLOWRATE (3, C) 0.000000 60.00000
FLOWRATE (4, A) 0.000000 10.00000
FLOWRATE (4, B) 1.000000 0.000000
FLOWRATE (4, C) 4.000000 0.000000

Análisis de sensibilidad
Para problemas de programación lineal, LINGO puede ofrecer información adicional
sobre la solución. Para ello hacemos lo siguiente:
1. Ponemos en primer plano la ventana en la que hemos escrito el modelo (no la
que contiene la solución).
2. Vamos al menú LINGO - Range. Así se abrirá una nueva ventana con dos nuevas
tablas:
La primera tabla contiene, en su primera columna, el coeficiente de la función
objetivo de la variable correspondiente, y en las otras dos columnas lo que puede
aumentar y lo que puede disminuir dicho coeficiente para que la solución óptima
siga siendo la misma. La segunda tabla contiene, en su primera columna, el término
independiente de la restricción correspondiente, y en las otras dos columnas lo que
puede aumentar y lo que puede disminuir dicho coeficiente para que la solución
óptima tenga las mismas variables básicas.
Por ejemplo, el coste unitario de transporte entre el proveedor 1 y la biorefinería A
es de 20, y puede variar en el intervalo [0,30] sin que la solución del problema
cambie.
De forma similar, la producción diaria del proveedor 1 actualmente es de 7, pero
puede variar en el intervalo [6,11] y los precios sombra (holgura) seguirían siendo
los mismos.
(PDF) Una experiencia práctica de programación matemática con LINGO. Available
from:https://www.researchgate.net/publication/26428268_Una_experiencia_practic
a_de_programacion_matematica_con_LINGO [accessed May 30 2019].
Ejercicio 3.5. Desarrollo de una formulación con el comando SET para el
problema de transporte 3.2
El objetivo de este ejemplo es resolver el problema 3.2 utilizando la formulación de
conjuntos de LINGO descrita en el apéndice xxx. Los siguientes conjuntos se
definen primero:
FLOW_CONNECTIONS (SOURCE, SINKS): Conjunto de todas las conexiones
desde las fuentes a los sumideros
SINK: Conjunto de sumideros del proceso
SOURCE: Conjunto de fuentes del proceso

Con los siguientes índices para las fuentes y sumideros:


i: índice para fuentes
j: índice para sumideros
se definen ahora los siguientes símbolos:
F(j): Flujos de agua dulce que entra al sumidero j
Fresh: Flujo de agua dulce usada en todos los sumideros
G(j): Flujo que entra al sumidero j
Split (i, j): Flujo dividido de la fuente i al sumidero j
W(i): Flujo de una fuente i
Waste(i): Flujo de residuo de la fuente i
Waste_total: Flujo total de residuo de todas las fuentes
Xf: Concentración de impureza en el alimento
Y(i): Concentración de impureza en la fuente i
Z(j): Concentración de impureza que entra al sumidero j
Zmax(j): Máxima concentración permitida de impureza que entra al sumidero j

Solución con LINGO


La formulación de este problema en LINGO es dada por el siguiente programa
min=Fresh;
SETS:
SOURCES /1..2/: W, Y, Waste;
SINKS /1..3/: G, Zmax, Z, F;
FLOW_CONNECTIONS (SOURCES, SINKS): Split;
ENDSETS
DATA:
W=4000 3000;
Y=0.0175 0.0600;
G=6000 3000 500;
ZMAX=0.01 0.03 0.10;
ENDDATA
Fresh=@SUM(SINKS(j): F(j));
XF=0;
@FOR (SOURCES(i):
@SUM(SINKS(j): Split(i,j)) + Waste(i)=W(i));
@FOR (SINKS(j):
@SUM(SOURCES(i): Split(i,j)) + F(j)=G(j));
@FOR (SINKS(j):
@SUM( SOURCES(i): Split(i,j)*Y(i)) + F(j)*Xf=G(j)*Z(j));
@FOR (SINKS(j): Z(j)<=Zmax(j));
Waste_Total=@SUM(SOURCES(i): Waste(i));

La solución que se obtiene es la siguiente:

Objective value: 3666.667

Variable Value Reduced Cost


FRESH 3666.667 0.000000
XF 0.000000 0.000000
WASTE_TOTAL 1166.667 0.000000
W( 1) 4000.000 0.000000
W( 2) 3000.000 0.000000
Y( 1) 0.1750000E-01 0.000000
Y( 2) 0.6000000E-01 0.000000
WASTE( 1) 0.000000 0.7083333
WASTE( 2) 1166.667 0.000000
G( 1) 6000.000 0.000000
G( 2) 3000.000 0.000000
G( 3) 500.0000 0.000000
ZMAX( 1) 0.1000000E-01 0.000000
ZMAX( 2) 0.3000000E-01 0.000000
ZMAX( 3) 0.1000000 0.000000
Z( 1) 0.1000000E-01 0.000000
Z( 2) 0.3000000E-01 0.000000
Z( 3) 0.6000000E-01 0.000000
F( 1) 2571.429 0.000000
F( 2) 1095.238 0.000000
F( 3) 0.000000 1.000000
SPLIT( 1, 1) 3428.571 0.000000
SPLIT( 1, 2) 571.4286 0.000000
SPLIT( 1, 3) 0.000000 0.7083333
SPLIT( 2, 1) 0.000000 0.000000
SPLIT( 2, 2) 1333.333 0.000000
SPLIT( 2, 3) 500.0000 0.000000

Esta es la misma solución que se muestra en la figura 3.3b.

También podría gustarte