• No results found

Strategy for Solving the Numerical Dynamic Optimization Problem

3 An Industry Model

B. Strategy for Solving the Numerical Dynamic Optimization Problem

se repitan hasta que una condición deje de cumplirse, es muy similar a lo que sucede con un conductor de la formula uno, el cual estará dando vueltas hasta que la cantidad de vueltas que ha dado deje de ser insuficientes para ganar la carrera, dicho en un lenguaje más informático si la cantidad de vueltas que debe dar el vehículo son diez, podremos expresarlo como mientras la cantidad de vueltas sea menor a 10, entonces debe seguir corriendo, pues en informática eso se expresa tal

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

cual como lo hemos mencionado. Veamos un ejemplo de uno de los ciclos más utilizados, el cual recibe como nombre el ciclo “mientras” al que de ahora en adelante lo conoceremos por su traducción al inglés while.

While

while(vuelta<10) { vuelta++; } tiempo++;

Aquí la ejecución ocurrirá de la siguiente forma, lo primero que hará while será evaluar si el valor de la variable vuelta es o no menor a 10, si el valor fuese por ejemplo 11, la condición no se cumplirá y para este caso se comportará muy similar al if dejando de ejecutar todo lo que se encuentre entre el inicio y cierre de bloques de manera que la variable vuelta no se incremente, sin embargo si el valor es 8, la condición será verdadera lo que provocará que si se ejecute todo lo que esta dentro de los bloques haciendo entonces el incremento de la variable. Cuando haya finalizado el incremento el while a diferencia del if no pasará directo a incrementar el tiempo, dado que cuando alcance el cierre de bloque volverá a preguntar por el valor de vuelta, el cual será 9 y dado que 9 aún es menor que 10 entonces while volverá a ejecutarse, incrementando el valor de vuelta en uno, al llegar al final de bloque nuevamente se va a

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

evaluar si vuelta es menor a 10, esta vez la condición no se cumple y es entonces cuando el ciclo termina para dar paso al incremento del tiempo.

For

Existen varias estructuras que permiten iterar una o más líneas de código, el ciclo for es uno de ellos, pero antes de continuar, es importante aclarar que si bien entre ellos existen diferencias todos tienen el mismo objetivo, por ende no existirá nunca una limitante para uno u otro, pudiendo utilizar cualquiera de ellos cuando necesites iterar, sin embargo cada uno tiene una estructura y sintaxis diferente, el criterio de selección estará dado principalmente por el que te acomode más y de las necesidades que tengas.

Volvamos al ejemplo de las vueltas en una pista de carreras presentada anteriormente. En aquel ejemplo el

while tiene por misión cerciorarse de que la variable

vuelta llegue a 10, pero no se preocupa del valor inicial de la variable, supongamos que las condiciones cambian y debes realizar el mismo algoritmo pero la variable vuelta debe comenzar siempre en cero.

int vuelta=0; while(vuelta<10) { vuelta++; } tiempo++;

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

El ciclo while cumple a la perfección con nuestro propósito, sin embargo en el algoritmo hay 3 elementos a considerar: primero hay una inicialización se variable, la cual hemos agregado recientemente al solicitar que vuelta siempre comience en cero, luego tenemos una condición y un incremento, para este tipo de casos el for es principalmente provechoso dado que permite escribir de forma muy cómoda estos tres elementos. Veamos como luce este while convertido en un cliclo for.

for(int vuelta=0; vuelta<10;vuelta++) {

}

tiempo++;

Como puedes ver este ciclo contiene los tres elementos como parte de la declaración del ciclo, por ende el cuerpo de este ha quedado vacío, ya que hemos cambiado la lógica de incremento de la variable a otro lugar. La forma de ejecutarse no es igual que en while, para que lo entendamos mejor vamos a decir que el for está dividido en partes, la primera es una declaración, en la cual declaramos e inicializamos el valor de la variable vuelta, la segunda es la condición en la que decimos que vuelta no debe ser mayor a 10 y finalmente una sección donde incrementamos el valor de la variable vuelta en uno, entonces podemos decir que las partes son, declaración

e inicialización, condición e incremento, entonces la

forma en la que el ciclo for funciona es la siguiente: lo primero que ocurre es la declaración e inicialización, con esto se asegura de que la variable exista y tenga un valor

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

inicial. Esta sección sólo se ejecuta una vez, el siguiente paso es verificar si luego de la inicialización de la variable la condición se cumple, de cumplirse ejecutará todo lo que este entre los inicios y cierre de bloques, el cual tenemos vacío por ahora. Al igual que el while el for intentará hacer una iteración, pero sólo a partir de la segunda vuelta y hasta que termine lo que hará es primero ejecutar la sección de incremento, haciendo que vuelta pase de cero a uno para luego verificar si la

condición aún se cumple. De cumplirse volverá a

ejecutar todo lo que se encuentre entre el inicio y cierre de bloques, al finalizar nuevamente hará el incremento y luego evaluará la condición. Este proceso se repetirá hasta que la condición ya no se cumpla, como puedes ver la responsabilidad de inicializar, evaluar e incrementar esta toda definida dentro del for quedando entonces tiempo para preocuparse de otros elementos dentro del ciclo en sí, por ejemplo, contemos la cantidad de bencina que gasta por cada vuelta almacenándola en una variable llamada consumo.

int consumoPorVuelta = 0;

for(int vuelta=0; vuelta<10;vuelta++) {

consumo += consumoPorVuelta; }

tiempo++;

el ciclo for se puede adaptar a varias situaciones gracias a que cualquiera de sus partes puede ser omitida, en el

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

siguiente ejemplo la declaración e inicialización de la variable es quitada del for y declarada antes.

int vuelta=0;

for(; vuelta<10;vuelta++) {

}

Así podemos entonces obtener un for cuyo comportamiento es idéntico al de un while.

int vuelta=0; for(; vuelta<10;) {

vuelta++; }

En este caso este for ha quedado exactamente como el ciclo while que vimos en un comienzo. Podrá parecer extraño pero incluso la condición puede ser omitida, sin embargo eso nos obliga a tener que agregar a nosotros una forma de quebrar el ciclo para que no este iterando de forma indefinida. Sobre los quiebres de ciclos hablaremos más adelante en la sección de break y

continues, pero por ahora como demostración de que

todas las partes son opcionales lo haremos analizando el siguiente ejemplo:

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

for(; ; ;) {

}

En este extraño caso no hay ninguna de las partes, sin embargo la forma en la que se ejecutará no es ningún misterio, ya que la ausencia de una condición da por defecto falso, así que luego de comprobar que no hay nada que inicializar, evaluará falso y omitirá la ejecución del ciclo for.

Do … While.

Si del ciclo do while traducimos la palabra do veremos que significa “hacer”, pues esta es la principal diferencia con el ciclo while que vimos en una primera oportunidad, la condición es evaluada al final, es decir que toda la lógica agregada entre los inicios y cierres de bloque se ejecutará siempre al menos una vez. Supongamos ahora que el vehículo de carreras debe dar 10 vueltas seguidas para hacer reconocimiento de la pista de forma obligatoria, pero si ya ha dado 10 entonces sólo se le permitirá dar una.

do {

vuelta++; }

while(vuelta<10);

Como puedes ver la condición se encuentra al final, por lo tanto lo primero que sucederá es incrementar el número

UNIVERSIDAD TECNOLÓGICA DE CHILE INACAP - ÁREA INFORMÁTICA Y TELECOMUNICACIONES

de vueltas en uno, sin ninguna condición que pueda evitarlo. Supongamos que el valor de la variable acaba de incrementarse a 8, por lo tanto el corredor debe de forma obligatoria completar sus 10 vueltas, dado que 8 es menor a 10 la condición se hace verdadera dando paso a una nueva ejecución del bloque incrementando el valor de la variable a 9, con este valor la condición vuelve a evaluarse siendo verdadera dado que aún es menor a 10, en su última iteración la variable se incrementa a 10 y la condición se vuelve falsa, saliendo así del ciclo, sin embargo la diferencia está dada en que si vuelves a ejecutar este ciclo con un valor de 10 o superior, con un while el vehículo no hubiese sido aceptado, sin embargo con este ciclo no se evalúa la cantidad de vueltas al comienzo, por lo que las sentencias de código se ejecutarán haciendo que vuelta sea 11, luego de la primera ejecución el ciclo evaluará si debe proseguir, como la condición es falsa, el vehículo no dará una segunda vuelta.

Related documents