Documente Academic
Documente Profesional
Documente Cultură
En P4, los modelos de programacin dinmica se deben ingresar en lenguaje VISUAL BASIC, para lo cual se debe tener en cuenta
las siguientes consideraciones:
1. Definicin de mdulo:
Se efectan en la Zona General del Mdulo empleando la sentencia DIM y separadas por una coma. Por ejemplo, si desea declarar
las variables M y N; un vector llamado PESO de 6 elementos y una matriz llamada UTILIDAD de 10 filas por 5 columnas:
3. Sentencias Selectivas:
El modelador puede incluir comentarios en cualquier parte del modelo, los cuales no son tomados en cuenta por el compilador de
VISUAL BASIC. Para ello se emplea la sentencia REM o un apstrofe. Los comentarios aparecen de color verde, por ejemplo:
Cuando aparezca un mensaje de error, hay que hacer clic en el botn Debug que aparece en dicho mensaje. De esa manera, Visual
Basic seala la lnea que origina el error con fondo amarillo.
Variable no definida: En ese caso, Visual Basic seala la variable, vector o matriz que no se ha definido. Solucin: Ir a la Zona
General del Mdulo y declarar la variable, vector o matriz no definida (sentencia DIM).
Subndice fuera de rango: Esto sucede cuando el vector o la matriz no tiene el tamao suficiente para asignarle todos los datos
que necesita. Solucin: Ir a la Zona General del Mdulo y aumentar la cantidad de filas si se trata de un vector o la cantidad de
filas y columnas si se trata de una matriz. Asimismo, revisar si la cantidad de datos que debe ir en cada vector o matriz es la
correcta.
If Then sin End If: Sucede cuando se omite la lnea End If cuando se usa If Then. Solucin: Incluir End If en la parte del modelo
donde se est usando If Then.
Procedimiento FILLARRAY: Permite cargar un vector o una matriz con datos. Su sintaxis es la siguiente:
Call FILLARRAY(Peso, {13, 10, 12, 15, 11}, 0) equivale a las siguientes instrucciones:
Peso(0) = 13
Peso(1) = 10
Peso(2) = 12
Peso(3) = 15
Peso(4) = 11
Funcin IVALSET: Permite llenar un conjunto numrico, especificando lmite inferior, lmite superior e incremento. Su
sintaxis es la siguiente:
Ejemplos:
7. La constante BIGM:
2
Representa un nmero muy grande (3.4 x 1038), el cual se emplea para penalizar un contorno que no se desea como
solucin. Si se trata de un modelo de maximizacin, el contorno se castiga con un nmero muy negativo: f(s) = BIGM. Si
se trata de un modelo de minimizacin, el contorno se castiga con un nmero muy grande: f(s) = BIGM.
Aparecer el mensaje Do you want to load P4 now?. Hacer clic en Aceptar: Aparece el mensaje de bienvenida:
Hacer clic en Aceptar. Usted deber trabajar en la ventana que dice OUTPUTS:
3
II. Descripcin de la barra de conos de P4.
Grabar modelo
como
Ayuda
Nuevo modelo
Resolver modelo
Abrir modelo
1. Una vez cargado P4 en Excel, en el archivo Outputs, hacer clic en el cono New Model de la barra de conos de P4:
cono New Model
Barra de conos de P4
3. Aparecen a continuacin la ventana de entorno Visual Basic, la cual muestra el mdulo en donde se programar el modelo.
4
4. A continuacin, se recomienda grabar el modelo creado. Para ello, deber regresar a Excel, archivo Otuputs, y hacer clic en
el cono Save model de la barra de conos de P4.
Archivo
Outputs
cono: Save
Model
5. Aparece un cuadro de dilogo en el cual se especifica la ruta y el nombre del archivo que representa al modelo. Slo
escriba el nombre, P4 por defecto asigna la extensin (.BAS), luego hacer clic en el botn Guardar
6. Se recomienda grabar peridicamente el modelo, para ello simplemente hacer clic en el cono Save Model (repetir
solamente el paso 4)
5
Algunos ejemplos modelados en P4
Problema de la alforja: Se dispone de un camin de 10 t de capacidad para trasladar 4 bultos. Se desea determinar los bultos a trasladar de
manera que se maximice el valor total que se traslada:
Bulto Nro. 1 2 3 4
Peso ( t ) 3 6 7 5
Valor (Miles de $) 7 16 19 15
Option Explicit
'Dim 'list of new variables
Dim PESO(1 To 5), VALOR(1 To 5)
Sub Preliminary_Definitions()
Call FILLARRAY (PESO, "{3, 6, 7, 5}", 1)
Call FILLARRAY (VALOR, "{7, 16, 19, 15}", 1)
End Sub
Sub Economic_Return()
ad(s) = d * VALOR(s1)
End Sub
Sub Model_Structure()
NSV = 2
NCT = 2
End Sub
Sub Starting_State()
s1 = 1
s2 = 10
End Sub
Sub Decision_Set()
DS = "{0,1}"
End Sub
Sub Transition_Function()
sn1 = s1 + 1
sn2 = s2 - d * PESO(s1)
End Sub
Sub State_Constraints()
Ct1 = (sn1 <= 5)
Ct2 = (sn2 >= 0)
End Sub
Sub Return_Function()
Rd(s) = ad(s) + f(sn)
End Sub
Sub Recursive_Equation()
f(s) = maxim(Rd(s))
End Sub
Sub Boundary_Conditions()
f(s) = 0
End Sub
6
Problema de asignacin de recursos: Se tienen 4 proyectos de inversin y un presupuesto de 8 millones. La utilidad en cada proyecto (en
millones de $) se muestra a continuacin. Se debe determinar cunto se debe invertir en cada proyecto, si slo se invierte en mltiplos de
milln.
Cantidad a invertir (En millones de $)
Proyecto
0 1 2 3 4 5 6 7 8
1 0 3 7 10 12 13 14 14 14
2 0 1 2 4 8 13 17 19 20
3 0 2 4 6 8 10 12 14 16
4 0 1 3 6 9 12 14 16 17
Option Explicit
'Dim 'list of new variables
Dim UTILIDAD(1 To 5, 0 To 8)
Sub Preliminary_Definitions()
Call FILLARRAY(UTILIDAD, "{ {0,3,7,10,12,13,14,14,14} , {0,1,2,4,8,13,17,19,20} , {0,2,4,6,8,10,12,14,16} ,
{0,1,3,6,9,12,14,16,17} }", 1, 0)
End Sub
Sub Economic_Return()
ad(s) = UTILIDAD(s1,d)
End Sub
Sub Model_Structure()
NSV = 2
NCT = 2
End Sub
Sub Starting_State()
s1 = 1
s2 = 8
End Sub
Sub Decision_Set()
DS = IVALSET(0, 8)
End Sub
Sub Transition_Function()
sn1 = s1 + 1
sn2 = s2 - d
End Sub
Sub State_Constraints()
Ct1 = (sn1 <= 5)
Ct2 = (sn2 >= 0)
End Sub
Sub Return_Function()
Rd(s) = ad(s) + f(sn)
End Sub
Sub Recursive_Equation()
f(s) = maxim(Rd(s))
End Sub
Sub Boundary_Conditions()
f(s) = 0
End Sub
7
Problema de carga de bultos: Se dispone de un camin de 10 t de capacidad para trasladar 4 tipos de bultos. Se desea determinar cuntos
bultos de cada tipo se van a trasladar de manera que se maximice el valor total que se traslada:
Tipo de bulto 1 2 3 4
Peso ( t ) 3 6 7 5
Valor (Miles de $) 7 16 19 15
Option Explicit
Dim PESO(1 To 5), VALOR(1 To 5)
Sub Preliminary_Definitions()
Call FILLARRAY (PESO, "{3, 6, 7, 5, 0}", 1)
Call FILLARRAY (VALOR, "{7, 16, 19, 15, 0}", 1)
End Sub
Sub Economic_Return()
ad(s) = d * VALOR(s1)
End Sub
Sub Model_Structure()
NSV = 2
NCT = 2
End Sub
Sub Starting_State()
s1 = 1
s2 = 10
End Sub
Sub Decision_Set()
DS = IVALSET(0,10)
End Sub
Sub Transition_Function()
sn1 = s1 + 1
sn2 = s2 - d * PESO(s1)
End Sub
Sub State_Constraints()
Ct1 = (sn1 <= 5)
Ct2 = (sn2 >= 0)
End Sub
Sub Return_Function()
Rd(s) = ad(s) + f(sn)
End Sub
Sub Recursive_Equation()
f(s) = maxim(Rd(s))
End Sub
Sub Boundary_Conditions()
f(s) = 0
End Sub
8
Programa de produccin e inventario: La demanda de un artculo para los prximos 4 meses es de 900, 800, 1000, 1200 unidades
respectivamente. Los costos unitarios de produccin son de 2, 3, 4 y 6 ($) respectivamente, con una capacidad normal de produccin de 900
unidades. Dicha capacidad puede extenderse hasta en 200 unidades, para los cuales los costos de produccin son 2.5, 5, 6.5 y 8 ($)
respectivamente. La produccin se efecta en mltiplos de 100 unidades. El inventario inicial es nulo y se desea ese mismo nivel para fines del
cuarto mes. La capacidad de almacenamiento es de 300 unidades y el costo de almacenamiento es nulo. Determine el programa ptimo de
produccin que satisfaga la demanda mensual y minimice los costos de produccin y de inventario.
Option Explicit
Dim DEMANDA(1 To 5), CUN(1 To 5), CUE(1 To 5)
Sub Preliminary_Definitions()
Call FILLARRAY(DEMANDA, "{900,800,1000,1200}", 1)
Call FILLARRAY(CUN, "{2, 3, 4, 6}", 1)
Call FILLARRAY(CUE, "{2.5, 5, 6.5, 8}", 1)
End Sub
Sub Economic_Return()
If d <= 900 Then
ad(s) = d * CUN(s1) + 0*sn2
Else
ad(s) = 900 * CUN(s1) + (d - 900) * CUE(s1) + 0*sn2
End If
End Sub
Sub Model_Structure()
NSV = 2
NCT = 2
End Sub
Sub Starting_State()
s1 = 1
s2 = 0
End Sub
Sub Decision_Set()
DS = IVALSET(0, 1100, 100)
End Sub
Sub Transition_Function()
sn1 = s1 + 1
sn2 = s2 + d DEMANDA(s1)
End Sub
Sub State_Constraints()
Ct1 = (sn1 <= 5)
Ct2 = (sn2 >= 0 And sn2 <= 300)
End Sub
Sub Return_Function()
Rd(s) = ad(s) + f(sn)
End Sub
Sub Recursive_Equation()
f(s) = minim(Rd(s))
End Sub
Sub Boundary_Conditions()
If s2 = 0 Then
f(s) = 0
Else
f(s) = BigM
End If
End Sub