miércoles, 27 de febrero de 2013

ESTRUCTURA DE CONTROL SELECTIVA (GRUPO 5)

Estructuras Básicas de Control.
 

     Nos ayudan a resolver algorítmicamente problemas más complejos. Con ellas es posible tomar decisiones y repetir grupos de acciones.
Para la redacción de un pseudocódigo se pueden utilizar tres tipos de estructuras de control las:
Selectivas, Secuenciales, Repetitivas.

Estructura Selectivas.
     Se utilizan para tomar decisiones lógicas, se evalúa una condición y en función al resultado se realiza una determinada secuencia de instrucciones.
Estas estructuras se clasifican en:
Simple, Dobles, Múltiples.

Estructura Selectiva Simple:
     Se identifican porque están compuestos únicamente de una condición. La estructura si-entonces evalúa la condición y en tal caso:
Si la condición es verdadera, entonces ejecuta la acción Si (o acciones si son varias). Si la condición es falsa no se hace nada.
Su sintaxis es la siguiente en pseudocódigo:
Español

Si<condición> Entonces
<Acción S1>
Fin _ si

Ingles

if <condición>
hen
<Acción S1>
End_if

 





 

Estructura Selectiva Doble:
     Son estructuras lógicas que permiten controlar la ejecución de varias acciones y se utilizan cuando se tienen dos opciones de acción, por la naturaleza de estas se debe ejecutar una o la otra, pero no ambas a la vez, es decir, son mutuamente excluyentes.
Su sintaxis es la siguiente en pseudocódigo:

Español

Si <condición> entonces
<Acción S1>
Sino
<Acción S2>
Fin_Si

Ingles

if <condición> then
<Acción S1 >
else
<Acción S2>
End_if



 
 
 




Estructura Selectiva Múltiple:

     Aplicando la estructura de decisión múltiples se evaluara una expresión que podrá tomar n valores distintos, 1, 2, 3,…., n y según que elija uno de estos valores en la condición, se realizara una de las n acciones o lo que es igual, el flujo del algoritmo seguirá solo un determinado camino ente los n posibles. Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la acción 1, si toma el valor 2 ejecutara la acción 2, si toma el valor n realizara la acción n.
Su sintaxis es la siguiente:

Español

En caso (variable) hacer

Caso 1: Acción 1
Caso2: Acción 2
Caso N: Acción N
En caso contrario:Acción
Fin_caso

Ingles

switch (selector)
{
case 1: Acción 1
break;
case 2: Acción 2
break;
case n: Acción n
break;
default: Excepción;
break;
}
           
EJERCICIOS

Programa que me exprese el mayor de dos números.

Inicio

Entero a=0; b=0;
Escribir ("Ingrese el primer número“);
Leer a;
Escribir (“Ingrese el segundo número“);
Leer b;
Si a > b entonces
Escribir ("El número mayor es: “a);
Si_no
Escribir "El número mayor es: “b);
Fin_si

Fin

Realizar un algoritmo que lea un número que represente el día de la semana y diga que día es.

Inicio

Entero día=0;
Escribir“Elija un número";
Escribir " 1: Lunes ";
Escribir " 2: Martes”;
Escribir“ 3: Miércoles”;
Escribir“ 4: Jueves”;
Escribir“ 5: Viernes”;

Escribir“Ingrese día”
Leer día;
En caso (día) hacer
Escribir (‘Lunes’);
Escribir (‘Martes’);
Escribir (‘Miércoles’);
Escribir (‘Jueves’);
Escribir (‘Viernes’);
Fin_caso

Fin

TEORIA AUTOMATA DEL ALGORITMO (GRUPO 11)


Teoría de autómatas

Esta teoría provee modelos matemáticos que formalizan el concepto de computadora o algoritmo de manera suficientemente simplificada y general para que se puedan analizar sus capacidades y limitaciones. Algunos de estos modelos juegan un papel central en varias aplicaciones de las ciencias de la computación, incluyendo procesamiento de texto,compiladores, diseño de hardware e inteligencia artificial.
Los tres principales modelos son los autómatas finitos, autómatas con pila y máquinas de Turing, cada uno con sus variantes deterministas y no deterministas. Los autómatas finitos son buenos modelos de computadoras que tienen una cantidad limitada de memoria, los autómatas con pila modelan los que tienen gran cantidad de memoria pero que solo pueden manipularla a manera de pila (el último dato almacenado es el siguiente leído), y las máquinas de Turing modelan las computadoras que tienen una gran cantidad de memoria almacenada en una cinta. Estos autómatas están estrechamente relacionados con la teoría de lenguajes formales; cada autómata es equivalente a unagramática formal, lo que permite reinterpretar la jerarquía de Chomsky en términos de autómatas.
Existen muchos otros tipos de autómatas como las máquinas de acceso aleatorio, autómatas celulares, máquinas ábaco y las máquinas de estado abstracto; sin embargo en todos los casos se ha mostrado que estos modelos no son más generales que la máquina de Turing, pues la máquina de Turing tiene la capacidad de simular cada uno de estos autómatas. Esto da lugar a que se piense en la máquina de Turing como el modelo universal de computadora.
 
Todo algoritmo evalúa una correspondencia f

: D 􀀀! S
donde D son los datos y S las soluciones.
Un problema es una correspondencia f

: D 􀀀! S entre
dos conjuntos. Resolver un problema es evaluar f .
Un problema f

: D 􀀀! S es susceptible de ser resuelto
solamente si D y S son lenguajes expresables sobre un
alfabeto finito. Uniendo alfabetos, uno podría suponer que
son lenguajes sobre un alfabeto común

 
Un problema es, por tanto, evaluar una correspondencia
f

: 􀀀! . Los elementos del dominio (los datos) se
suelen llamar inputs (también son susceptibles de ser
llamados inputs aquellos x

2 tales que no existe f (x)).
Los elementos del rango de f son las soluciones y se
denominan outputs.

ALGORITMO DE EUCLIDE (GRUPO 10)


Ø ,ALGORITMO DE EUCLIDES:
Un algoritmo es una secuencia de pasos para conseguir un resultado.
El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD) entre dos números enteros. Fue originalmente descrito por Euclides en la proposición 2 del libro VII de su libro Elementos. Tiene numerosas aplicaciones en teoría de números y ciencias de la computación.
Ø PASOS DEL ALGORITMO DE EUCLIDES:
El algoritmo de Euclides es un procedimiento para calcular el m.c.d. de dos números. Los pasos son:
1 Se divide el número mayor entre el menor.
2 Si:
a- La división es exacta, el divisor es el m.c.d.
b- La división no es exacta, dividimos el divisor entre el resto obtenido y se continúa de esta forma hasta obtener una división exacta, siendo el último divisor el m.c.d.
Ejemplo: 
m.c.d. (72, 16) = 8

    Al dividir a entre b (números enteros), se obtiene un cociente q y un residuo r. Es posible demostrar que el máximo común divisor de a y b es el mismo que el de b y r. Este es el fundamento principal del algoritmo.

De acuerdo con este fundamento, para calcular el máximo común divisor de a y b tan sólo es necesario calcular el máximo común divisor de b y r. Como b y r son números más pequeños, el número de operaciones se reduce. Además, para calcular el máximo común divisor de b y r se puede aplicar la misma regla recurrentemente.

Ejemplo 1:
Por ejemplo, para calcular el máximo común divisor de 2366 y 273 se podría utilizar la siguiente secuencia de operaciones:
2366 entre 273 es 8 y sobran 182
273 entre 182 es 1 y sobran 91
182 entre 91 es 2 y sobra 0

Esta secuencia de operaciones se puede interpretar con el siguiente significado:
Mcd (2366,273) =  mcd (273,182)
Mcd (273,182) = mcd (182,91)
Mcd (182,91) = mcd (91,0)
De esta manera se concluye que el máximo común divisor de 2366 y 273 es 91 (porque mcd (91,0).


Ejemplo 2:
A = 246                B = 118
a 246   = 2 + 10                   q1 = 2            r1 = 10
b     118            118  


b 118   = 11 + 8                    q2 = 11            r2 = 8
r1     10              10  


r1 10   = 1 + 2                       q3 = 1            r3 = 2
r2       8            8  


r2 8   = 4 + 0                         q4 = 4           r4 = 0
r3     2    


m.c.d (246, 118)           

Ejemplo:

Para hallar el residuo de una división utilizamos mod, así con (A mod2=0) podemos saber si A es un numero par o impar.
Para resolver el problema tengo que dividir un numero por otro más pequeño, si el residuo es 0 es su mcd, si no dividimos el divisor entre el resto. Bien ¿puedo almacenar el resultado en una variable para así poder realizar la siguiente división entre el cociente y el resto? Es decir:
  resultado = a/b
resto = (a mod b)

¿Así con la variable resto puedo realizar el bucle mientras ésta no sea 0?

mientras resto<>0 hacer




ALGORITMO RECURSIVO (GRUPO 9)


 Algoritmo recursivo: es un algoritmo que expresa la solución de un problema en términos de una llamada a sí mismo. La llamada a sí mismo se conoce como llamada recursiva o recurrente.

FUNCIÓN Factorial(n)
    VAR resultado: Entero

    SI (n<2) ENTONCES
        resultado = 1;
    SINO
        resultado = n * Factorial(n-1);
    FSI

    RETORNA resultado;
FFUNCIÓN

En ciencias de la computación, la recursividad es un elemento muy importante en la solución de algunos problemas. Por definición, un algoritmo recursivo es aquel que utiliza una parte de él mismo como solución al problema. La otra parte generalmente es la solución trivial, es decir, aquella cuya solución será siempre conocida, es muy fácil de calcular, o es parte de la definición del problema a resolver. Dicha solución sirve como referencia y además permite que el algoritmo tenga una cantidad finita de pasos.
Ventajas:
-Algunos problemas son esencialmente recursivos, por lo cual su implementación se facilita mediante un algoritmo de naturaleza recursiva, sin tener que cambiarlo a un método iterativo, por ejemplo. -En algunas ocasiones el código de un algoritmo recursivo es muy pequeño.
Desventajas:
-Puede llegar a utilizar grandes cantidades de memoria en un instante, pues implementa una pila cuyo tamaño crece linealmente con el número de recursiones necesarias en el algoritmo. Si los datos en cada paso es muy grande, podemos requerir grandes cantidades de memoria.
Diseño de algoritmos recursivos
Para desarrollar algoritmos recursivos siempre debe tenerse en cuenta que ya existe un algoritmo que permite resolver una versión reducida del problema; con esto en mente se procede como sigue:
1.    Identificar subproblemas atómicos (no descomponibles); estos subproblemas deben resolverse de forma directa, nunca utilizando el algoritmo general puesto que son los ya conocidos casos base.
2.    Descomponer el problema en subproblemas; estos subproblemas se resuelven apoyándose en el algoritmo que sabemos ya existe; la solución de estos subproblemas debe acercarnos de forma progresiva al caso base.
3.     Probar de manera informal que tanto los casos base como los casos generales encuentran solución aplicando el algoritmo diseñado.


ALGORITMO PARA LA RUTA MAS CORTA (GRUPO 8)


Algoritmo de la ruta más corta:

Es un algoritmo de búsqueda grafica que resuelve solo la fuente más corta de un problema del camino para un gráfico con los negativos de bordes costos de ruta, produciendo un camino más corto al árbol. Este algoritmo se utiliza a menudo en la ruta y como una subrutina en otros algoritmos de grafos.
Para una fuente dada de vértice (nodo) en el gráfico, el algoritmo encuentra la ruta con menor coste (es decir, el camino más corto) entre el vértice y cualquier otro vértice.

Por ejemplo, si los vértices de una gráfica representan las ciudades y los costos de borde de ruta representan conducir distancias entre pares de ciudades conectadas por un camino directo, el algoritmo de dijkstra se puede utilizar para encontrar la ruta más corta entre una ciudad y todas las demás ciudades. Como resultado, el camino más corto primera vez ampliamente utilizado en la red los protocolos de enrutamiento, en especial IS-IS y OSPF (Open ShortestPathFirst).

Modelo de la ruta más corta:
El problema de la ruta más corta incluye un juego de nodos conectados donde solo un nodo es considerado como el origen y solo un nodo es considerado como el nodo destino. Su objetivo es determinar un camino de conexiones que minimizan la distancia total del origen al destino. El problema se resuelve por el “algoritmo de etiquetado”. La esencia del procedimiento es que analiza toda la red a partir del origen; identifica de manera sucesiva la ruta más corta a cada uno de los nodos en orden ascendente de sus distancias (más cortas), desde el origen; el problema queda resuelto en el momento de llegar al nodo destino.

Definición del problema:
*- se tiene n nodos, partiendo del nodo inicial1 y terminando en el nodo final n.
*- arcos bi-direccionales conectan los nodos con distancias mayores que cero.
*- se desea encontrar la ruta de mínima distancia que conecta el nodo 1 con el nodo n.
Por medio de la aplicación del algoritmo de este problema podemos conocer la menor distancia entre un nodo origen y un nodo destino.

Pasos a seguir:
1.    Elaborar un cuadro con todos los nodos y los ramales que salen de él.
2.    Partiendo del origen, debemos encontrar el nodo más cercano a él.
3.    Anular todos los ramales que entren al nodo más cercano elegido.
4.    Comenzando en el origen se debe encontrar el nodo más cercano a él, por intermedio del nodo ya elegido y volver al tercer paso hasta llegar al destino.

Ejemplo del árbol de expansión mínima:
Un árbol de expansión mínima es aquel que conecta todos los nodos dentro de una red que está en una distancia mínima y que no contiene un ciclo.

Pasos para elaborar un árbol de expansión mínima:
·         Seleccionar cualquier nodo de la red o indicando según el problema
·         Colocar este nodo al más cercano que minimice la distancia y proseguir considerando todos los nodos que estén conectados, escogiendo de igual manera el que tenga la mínima distancia, hasta incluir todos los nodos. Si los nodos son igual valor se selecciona uno arbitrariamente, y esto quiere decir que puede haber más de una solución óptima.

Características:
*- determina el camino más corto dado un vértice origen.
*- utiliza un tipo de estructura de cola llamado cola de prioridad.

Origen del algoritmo de dijkstra:
Este algoritmo también llamado algoritmo de caminos mínimos, es un algoritmo para la determinar del camino más corto dado un vértice origen al resto de vértices en un grafo con pesos en cada arista. Su nombre se refiere a Edsger Dijkstra, quien lo describió por primera vez en 1959.
La idea subyacente en este algoritmoconsiste en ir explorando todos los caminos más cortos que parten del vértice origen y que llevan a todos los demás vértices ; cuando se obtiene el camino más corto desde el vértice origen, al resto del vértices que componen el grafo, el algoritmo se detiene. El algoritmo es una especialización de la búsqueda de costos uniforme, y como tal, no funciona en grafos con aristas de costo negativo(al elegir siempre el nodo con distancia menor, pueden quedar excluidos de la búsqueda de nodos que en próximas iteraciones bajarían el costo general del camino al pasar por una arista con costo negativo).

Ruta más corta – solución por el algoritmo de Dijkstra:
Para solucionar el problema de la ruta más corta entre dos nodos de un grafo se puede utilizar el algoritmo de Dijkstra, el cual sigue el siguiente procedimiento para calcular la ruta más corta desde el nodo origen hasta cada uno de los nodos del grafo:
·         Crear una lista de nodos para almacenar los nodos con distancia mínima ya calculada
·         Crear una cola de prioridad para los nodos pendientes de evaluar
·         Inserta el nodo de origen a la cola de prioridad
·         Mientras que haya nodos en la cola de prioridad

ºextrae el primer nodo de la cola de prioridad (tmp)
ºagrega el nodo tmp a la lista de nodos ya calculados
ºgenera una lista de los nodos conectados al nodo tmp que no estén en la lista de ya calculados
º   Para cada nodo de la lista (nod)

  ▪ calcula la distancia al origen con la distancia entre tmp y nod mas la distancia calculada entre el origen y tmp.
  ▪ Si el nodo nodestá en la cola de prioridad lo agrega
  ▪   Si el nodo nod ya está en la cola de prioridad y la distancia con la que está guardado en la cola es menor, lo deja como esta y si no, lo actualiza con la distancia calculada.

º  Fin
·         Fin

El algoritmo de Bellman-Ford:

Este algoritmo es una estructura básica muy parecido al algoritmo de Dijkstra, pero en vez de seleccionar vorazmente el nodo de peso mínimo aun sin procesar para relajarlo, simplemente relaja todas las aristas, y lo hace │V│-1 veces, siendo │V│ el número de vértices en el grafo. Las repeticiones permiten a las distancias mínimas recorrer el árbol, ya que en la ausencia de ciclos negativos, el camino más corto solo visita cada vértice una vez. A diferencia de la solución voraz, la cual depende de la suposición de que los pasos sean positivos, esta solución se aproxima más al caso general.

Existen dos versiones:
·         Versión no optimatizada para grafos con ciclos negativos, cuyo coste de tiempo es O(VE)
·         Versión optimatizada para grafos con aristas de peso negativo, pero en el grafo no existen ciclos de coste negativo, cuyo coste de tiempo, es también O (VE).

Aplicaciones de encaminamiento:
Una variante distribuida al algoritmo del Bellman-Ford se usa en protocolos de encaminamiento basados en vector de distancias, por ejemplo el protocolo de encaminamiento de información (RIP). El algoritmo es distribuido porque envuelve unas series de nodos (routers) dentro de un sistema autónomo (AS), un conjunto de redes y dispositivos router IP administrados típicamente por un Proveedor de Servicios de Internet (ISP). Se compone de los siguientes pasos:
1.    Cada nodo calcula la distancia entre el mismo y todos los demás dentro de un AS y almacena esta información en una tabla.
2.    Cada nodo envía su tabla a todos los nodos vecinos.
3.    Cuando un nodo recibe las tablas de distancias de sus vecinos, este calcula la ruta más corta a los demás nodos y actualiza su tabla para reflejar los cambios.

Las desventajas principales del algoritmo de Bellman-Ford en este ajuste son:
·         No es escala bien.
·         los cambios en la topología de red no se reflejan rápidamente ya que las actualizaciones se distribuyen nodo por nodo.
·         Contando hasta el infinito (si un fallo de enlace o nodo hace que un nodo sea inalcanzable desde un conjunto de otros nodos, estos pueden estar siempre aumentando gradualmente sus cálculos de distancia a él, y mientras tanto puede haber bucles de enrutamiento).





ESTRUCTURA DE CONTROL REPETITIVA (GRUPO 7)




 

 Las estructuras de control repetitivas son aquellas en las que una sentencia o grupos de sentencias se repiten muchas veces. Este conjunto de sentencias se denomina bucle (loop). En este capitulo se introducen las estructuras de control repetitivas disponibles en el lenguaje turbo pascal; asimismo se describen un conjunto de tecnicas para diseñar algoritmos y programas que utilicen bucles.

BUCLE

Una estructura de control que permite la recepcion de una serie determinada de sentencias se denominan bucle (lazo o ciclo).

El cuerpo del bucle contiene las sentencias que se repiten. Pascal proporciona tres estructuras o sentencias de control para especificar la repeticion: while, repeat y for.
LA SENTENCIA WHILE

La estructura repetitiva while   (mientras) es aquella en la que el número de interacciones no se conoce por anticipado y el cuerpo del bucle se repite mientras se cumple una determinada condición. por esta razón, a estos bucles se les denomina bucles condicionales.


LA SENTENCIA REPEAT
Una variable de la sentencia while es la sentencia repeat. Una de las características de los bucles while-do es que la condición se valúa al principio de cada iteración, si la condición es falsa cuando las sentencia comienza, entonces el bucle no se ejecuta nunca.

Esta sentencia tiene una condicional que se repite hasta que dicha condición se haga verdadera esta condición se denomina repeat-until
.

LA SENTENCIA FOR

La sentencia for nos sirve ya que con ella se puede ejecutar un bucle que se repita determinado número de veces.

Esta sentencia requiere que conozcamos el numero   de veces que se desea ejecutar la sentencia del interior del bucle. Si no se conoce de antemano el numero de repeticiones es mejor utilizar la sentencia while o repeat.