1 Modelo de una sola meta

En este ejemplo se abordará el modelo de una sola meta, en el cual se busca minimizar las desviaciones en torno a un objetivo particular, para esto, se tomará como base el ejercicio 5 de la página 350 del libro de Investigación de Operaciones de Hamdy A. Taha (Taha, 2004), el cual, a la letra dice:

Mantel produce un carro de juguete, cuyo ensamble final debe tener cuatro ruedas y dos asientos.La fábrica que produce las partes funciona durante tres turnos diarios. La tabla siguiente muestra las cantidades producidas de cada parte por corrida de producción, durante los tres turnos:

Turno Ruedas Asientos
1 500 300
2 600 280
3 640 360

En el caso ideal, la cantidad de ruedas producidas es exactamente el doble de la cantidad de asientos. Sin embargo, como las tasas de producción varían de un turno a otro, podría no alcanzarse la proporción exacta. A Mantel le interesa determinar la cantidad de corridas de producción en cada turno tal que se minimice el desbalanceo de producción de las partes. Las limitaciones de capacidad restringen la cantidad de corridas entre 4 y 5 en el turno 1, entre 10 y 20 en el turno 2, y entre 3 y 5 en el turno 3. Formule el problema como modelo de programación de metas.

1.1 Definición de conjuntos

En el caso de la modelación de metas, se requerirán dos conjuntos de variables, las de decisión, que definirán el resultado final del planteamiento, y las de desviación, mismas que por su naturaleza son variables no básicas, éstas variables se definen en función de las metas. En este caso, se requiere un total de de tres variables de decisión, ya que son el mismo número de turnos, y se requiere una variable de desviación, por que está involucrada una sola meta. Los conjunto se definen de la siguiente manera:

\[I=\{i|1,...,3\}\] \[J=\{j|1\}\]

1.2 Definición de las variables de decisión

Las variables de decisión deben ser planteadas en términos del número de corridas por turno necesarias para balancear las tasas de producción, y, por su naturaleza, deberán ser planteadas como variables enteras o discretas, quedando definidas de la siguiente manera:

\[{x_i=~Número~de~corridas~en~el~turno~i,~i=1,2,3}\] \[{s_j^{+,-}}=~Variables~de~desviación\] En este caso, se asignan los signos \(+\) y \(-\), mismos que representan las desviaciones por encima o por abajo del valor dela meta. Para efectos del modelado matemático, se sustituirá el signo \(+\) por el subíndice \(1\) y el signo \(-\) por el subíndice \(2\).

1.3 Definición de la meta

La meta u objetivo que se persigue en este planteamiento es minimizar las desviaciones por efecto de las variaciones naturales de corrida a corrida en el proceso, en el entendido que si estas desvaciones ocurren, la proporción del deseable no se cumplirán, generando sobrantes, tanto de ruedas como de asientos, entonces, para fijar la meta, procederemos bajo el siguiente planteamiento lógico:

La proporción deseada obedece a la relación entre el número de ruedas y el número de asientos, en un propoción 2 a 1, es decir, por cada par de asientos, debe existir una razon proporcional a las ruedas, definiéndose de la siguiente manera:

\[Ruedas~\alpha~Asientos\] Como la razón es 2 a 1, entonces podemos escribir una igualdad de la siguiente manera:

\[Ruedas=2Asientos\]

Es decir, por cada par se asientos, requeriremos 4 ruedas para armar el carrito de juguete. Para modelar esta relación en términos de las variables de decisión, debemos entender los coeficientes que se encuentran en la tabla, en donde, por ejemplo, se producen \(500 {\frac{ruedas}{corrida~en~el~turno~1}}\), por lo tanto, al multiplicar por el número de corridas a programar, las unidades quedan definidas solo en términos de las ruedas, así mismo, en el caso de los asientos, para el turno 1, se producen \(300 {\frac{asientos}{corrida~en~el~turno~1}}\), de manera similar, multiplicando este coeficiente por el número de corridas a programar en el turno 1, las unidades quedan congruentes con el número total de asientos. Por lo tanto, el modelado matemático de la meta se define a continuación:

\[2Asientos=Ruedas\]
Tomando los coeficientes de la tabla de datos:

\[2(300{x_1}+280{x_2}+360{x_3})=(500{x_1}+600{x_2}+640{x_3})\]
Simplificando la expresión:

\[600{x_1}+560{x_2}+720{x_3}=500{x_1}+600{x_2}+640{x_3}\] \[600{x_1}+560{x_2}+720{x_3}-500{x_1}-600{x_2}-640{x_3}=0\] Quedando simplificada la ecuación de la siguiente manera:

\[100{x_1}-40{x_2}+80{x_3}=0\] A ésta última expresión matemática se le agregan las variables de desviación, quedando escrita de manera definitiva como:

\[100{x_1}-40{x_2}+80{x_3}+{s_{11}}-{s_{12}}=0\] Como cualquier desviación de la proporción es indeseable, dado que generaría tanto exceso de asientos como de ruedas, la función objetivo se centrará en minimizar ambas variables de desviación, quedando definida la función objetivo de la siguiente manera:

\[Min~G={s_{11}}+{s_{12}}\]

1.4 Definición del sistema de restricciones

El sistema de restricciones debe incluir a la expresión que limita la relación entre las ruedas y los asientos, así como la representación de las limitaciones de capacidad planteadas en el enunciado, así que, el sistema de restricciones queda definido de la siguiente manera:

\[100{x_1}-40{x_2}+80{x_3}+{s_{11}}-{s_{12}}=0\] \[4~{\leq}~{x_1}~{\leq}~5\] \[10~{\leq}~{x_2}~{\leq}~20\] \[3~{\leq}~{x_3}~{\leq}~5\]

\[{x_i}~{\geq}~0~{\forall}~i=1,...,3\] \[s_{ij}>=0,~\forall~i=1~\forall~j=1,2\] \[{x_i~\rightarrow~Entera}\]

1.5 Modelación en lenguaje R

Para resolver este planteamiento, utilizaremos el siguiente código:

library(ROI)
## ROI: R Optimization Infrastructure
## Registered solver plugins: nlminb, glpk.
## Default solver: auto.
library(ROI.plugin.glpk)
library(ompr)
## Warning: package 'ompr' was built under R version 4.1.2
library(ompr.roi)
## Warning: package 'ompr.roi' was built under R version 4.1.2
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.1.2
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
modelo_1M=MIPModel()%>%
  add_variable(x[i],i=1:3,type = "integer")%>%
  add_variable(s[i,j],i=1,j=1:2,type = "integer")%>%
  set_objective(s[1,1]+s[1,2],sense = "min")%>%
  add_constraint(100*x[1]-40*x[2]+80*x[3]+s[1,1]-s[1,2]==0)%>%
  set_bounds(x[i],lb=4,ub=5,i=1)%>%
  set_bounds(x[i],lb=10,ub=20,i=2)%>%
  set_bounds(x[i],lb=3,ub=5,i=3)%>%
  add_constraint(x[i]>=0,i=1:3)%>%
  add_constraint(s[i,j]>=0,i=1,j=1:2)
solucion_1M=solve_model(modelo_1M,with_ROI(solver = "glpk",verbose=TRUE))
## <SOLVER MSG>  ----
## GLPK Simplex Optimizer, v4.65
## 6 rows, 5 columns, 10 non-zeros
##       0: obj =   0.000000000e+00 inf =   2.400e+02 (1)
##       1: obj =   0.000000000e+00 inf =   0.000e+00 (0)
## *     3: obj =   0.000000000e+00 inf =   0.000e+00 (0)
## OPTIMAL LP SOLUTION FOUND
## GLPK Integer Optimizer, v4.65
## 6 rows, 5 columns, 10 non-zeros
## 5 integer variables, none of which are binary
## Integer optimization begins...
## Long-step dual simplex will be used
## +     3: mip =     not found yet >=              -inf        (1; 0)
## +     3: >>>>>   0.000000000e+00 >=   0.000000000e+00   0.0% (1; 0)
## +     3: mip =   0.000000000e+00 >=     tree is empty   0.0% (0; 1)
## INTEGER OPTIMAL SOLUTION FOUND
## <!SOLVER MSG> ----
get_solution(solucion_1M,x[i])
##   variable i value
## 1        x 1     4
## 2        x 2    16
## 3        x 3     3
get_solution(solucion_1M,s[i,j])
##   variable i j value
## 1        s 1 1     0
## 2        s 1 2     0

Dado lo anterior, para que logre estabilizar la tasa de producción deberán programarse \({x_1^*=3~corridas}\), \({x_2^*=16~corridas}\) y \({x_3^*=3~corridas}\).

Taha, H. A. (2004). Investigación de Operaciones (7a ed.). México: Pearson-Prentice Hall.