Beruflich Dokumente
Kultur Dokumente
Programación Concurrente
Tema Página
2
ALGORITMOS DE
ORDENAMIENTO Y BÚSQUEDA
3
Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras:
4
Los algoritmos se distinguen por las siguientes características:
5
MULTIPLICACIÓN DE
MATRICES
Desde el momento que un vector es una matriz con una solo fila o una columna,
podemos usar el algoritmo de multiplicación de matrices. Entonces, si el vector B es
de la forma n x 1 podemos multiplicarlo por la matriz A (m x n) como A x B; y si el
vector A es de la forma 1 x n podemos multiplicarlo por la matriz B (n x m) como A
x B.
Multiplicación de matrices
6
Algoritmo secuencial
c[i][j] = 0
7
Algoritmo paralelo
Submatrices
Implementación directa
8
Paralelización implícita:
Paralelización explícita:
multiplicar(c,a,b,i):
for j=(i*n)/p to ((i+1)*n)/p-1
for k=0 to n-1
c[j,k]=0
for l=0 to n-1
c[j,k]=c[j,k]+a[j,l]*b[l,k]
endfor
endfor
endfor
9
ALGORITMOS NUMÉRICOS
Algunos ejemplos son el uso de una lavadora (se siguen las instrucciones), pero no
la preparación de una comida (porque no están perfectamente definidos los
pasos).
Este tipo de algoritmos no admiten ambigüedades y debe darse cada uno de los
pasos para su solución.
10
Se define el concepto de algoritmo numérico. Se presentan varios casos de
problemas numéricos, se dan sus soluciones en forma algorítmica y se agrega en
cada caso una representación en forma de diagrama de flujo.
11
Una vez que se calcula la aproximación, el programa despliega el valor encontrado,
así como el número de iteraciones que se emplearon para obtenerlo, es decir, la
cantidad de términos de la serie que fue necesario sumar para llegar a la
aproximación.
/*******************************************************************
********
Ejemplo: Calculo de la constante e mediante una serie infinita.
o/
using System;
/** Función que calcula el factorial de su argumento. Tanto el argumento de
* entrada (x) como el valor de retorno son de tipo double. No se hacen
* controles sobre la validez del argumento, cuyo valor debe ser > 0.
* Cualquier valor de entrada 0 o negativo arrojara un resultado de 1.
* Formula del factorial: x! = 1 * 2 * 3 * … * (x-1) * x
*/
public class C Calculate E{
public double iter;
public C Calculate E() { iter = 1; }
private double mFactorial(double x){
double i; // Factor actual de multiplicación: 2, 3, …, x
double fact = 1.0; // Acumulador para el resultado, inicialmente 1
// Ciclo en el que se calcula el factorial: i variara de 2 a x
for (i=2.0; i<=x; i++)
// Se multiplica el acumulado actual por el factor actual (i)
12
fact = fact * i;
// Devuelve como valor de retorno el resultado acumulado
return(fact);
}
public double mGetE(){
double e = 1,
eanterior;
do{
eanterior = e;
e += 1/mFactorial(iter);
iter++;
}
while( e != eanterior);
return e;
}
}
13
ALGORITMOS DE GRAFOS
14
CLASE Grafo
Privado:
Arreglo de <Tipo> Nodos de [1..N];
Arreglo de lógico MatrizDeAdyacencia de [1..N][1..N];
Público:
# Todas las operaciones aquí
FCLASE
Un valor verdadero en la posición (i,j) de la matriz indica que hay una arista que
conecta al nodo i con el nodo j. Para representar un grafo pesado se puede cambiar
la matriz de adyacencia de lógicos a una matriz de registros, siendo el peso un
campo del registro.
Esta representación es muy útil cuando se cumplen dos condiciones principales.
Primero, si se conoce el número exacto de nodos en el grafo no hace falta utilizar
estructuras dinámicas porque las estáticas se pueden acceder con mayor facilidad.
Segundo, la matriz de adyacencia no contiene un gran número de elementos en
FALSO.
Si no se cumple la primera de estas condiciones y el número de nodos en el grafo
puede variar drásticamente entonces se justifica el uso de estructuras dinámicas.
En este caso, lo ideal es utilizar una lista lineal de nodos conteniendo la
información en <Tipo>.
Por supuesto, si el número de nodos va a cambiar entonces tampoco se justificas
tener un matriz estáticas, por lo que debería utilizarse una matriz esparcida.
CLASE Nodo #Nodo de la lista de <Tipo>
Público: entero Id;
<Tipo> Info;
-Nodo proximo;
#Operaciones aquí
15
FCLASE
#La declaración de los nodos para las columnas (NodoC),
filas (NodoF) y
#nodos internos de la matriz van aquí. Son las
declaraciones de una
#matriz esparcida implementada con listas con posición
lógica fija o
#relativa.
CLASE Grafo
Privado:
-Nodo primerNodo; # 1er. nodo de la lista
-NodoF primeraFila; # 1era. fila de la matriz esparcida
-NodoC primeraColumna; # 1era. columna de la matriz
esparcida
Público:
# Todas las operaciones aquí
FCLASE
Sin embargo, puede que esta solución no sea la más conveniente por el hecho de
que la matriz esparcida ocupará más memoria que su contraparte estática a
medida que el número de conexiones entre los nodos sea mayor, ya que habrá
pocos elementos no nulos dentro de la matriz. En ese caso, se debe utilizar otra
implementación.
CLASE Nodo #Nodo de la lista de <Tipo>
Público: entero Id;
<Tipo> Info;
-Nodo proximo;
-Ady ListaDeAdyacentes;
#Operaciones aquí
16
FCLASE
CLASE Ady #Nodo de la lista de nodos adyacentes
Público:
-Nodo AdyAeste;
-Ady proximo;
#Operaciones aquí
FCLASE
CLASE Grafo
Privado:
-Nodo primerNodo; # 1er. nodo de la lista
Público:
6
# Todas las operaciones aquí
FCLASE
Esta representación ocupa menos memoria que la anterior sin importar si la matriz
esparcida está muy llena o no, pero puede incrementar la complejidad de algunas
operaciones, como por ejemplo saber cuáles nodos son adyacentes a un nodo en
particular (en caso de un grafo dirigido).
Cualquier algoritmo de recorrido de grafos consiste básicamente en visitar un nodo
del grafo y luego ir visitando los nodos conectados a este. Este principio se aplica
recursivamente comenzando desde un nodo inicial cualquiera del grafo.
Lo que diferencia un algoritmo de recorrido de otro es, una vez ubicado en un nodo
en particular, la forma en que se visitan los nodos conectados a este. Por supuesto,
estos algoritmos pueden ser aplicados en grafos dirigidos o no dirigidos.
17
Los dos algoritmos “clásicos” de recorrido de grafos son el recorrido en
profundidad y en anchura. Precisamente por ser “clásicos” han sido estudiados con
anterioridad y se les conoce su orden de complejidad en tiempo y todos los
beneficios de aplicarlos.
ACCION DFS_R(-Nodo Actual)
#se marca el nodo actual como visitado
Actual-.visitado ¬ verdad;
-Ady aux;
aux ¬Actual.-ListaDeAdyacentes;
#se recorre la lista de adyacentes al nodo Actual para
#visitarlos mientras ( aux ¹ NULL ) hacer si (
#(aux-.AdyAeste)-.visitado ¹ verdad) entonces
#se hace la llamada recursiva a los nodos
#adyacentes para visitarlos
DFS_R(aux-. AdyAeste);
fsi
aux ¬ aux-.proximo;
fmientras
FACCION
Público:
ACCION DFS() #Depth-First Search
-Nodo aux;
aux ¬ primerNodo;
#aquí se recorre la lista de nodos iterativamente
#haciendo las llamadas al DFS_R (DFS recursivo) cada vez
#que se consiga a alguien no visitado. Esto se hace para
#evitar que el algoritmo no funcione si el grafo tiene
18
#varias componentes conexas mientras (aux ¹ NULL) hacer
#si (aux-.visitado ¹ verdad) entonces
DFS_R(aux);
fsi
aux ¬ aux-.proximo;
fmientras
FACCION
Este algoritmo recorre todos los nodos del grafo pero fácilmente puede
modificarse para que sea una función que encuentre un nodo en particular dentro
de grafo. Este algoritmo se conoce como el algoritmo DFS (Depth-First Search).
19
REDES NEURONALES
Ejemplo
20
Predecir los movimientos de las acciones, la fluctuación de la moneda u
otra información financiera con gran número de cambios a partir de los
datos históricos.
Analizar los procesos industriales y de producción.
Minería de texto.
Cualquier modelo de predicción que analice relaciones complejas entre
muchas entradas y relativamente pocas salidas.
El algoritmo de red neuronal de Microsoft crea una red formada por hasta tres
niveles de neuronas. Estas capas son una capa de entrada, una capa oculta
opcional y una capa de salida.
Nivel de entrada: las neuronas de entrada definen todos los valores de atributos de
entrada para el modelo de minería de datos, así como sus probabilidades.
Nivel oculto: las neuronas ocultas reciben entradas de las neuronas de entrada y
proporcionan salidas a las neuronas de salida. El nivel oculto es donde se asignan
pesos a las distintas probabilidades de las entradas. Un peso describe la relevancia
o importancia de una entrada determinada para la neurona oculta. Cuanto mayor
sea el peso asignado a una entrada, más importante será el valor de dicha entrada.
Los pesos pueden ser negativos, lo que significa que la entrada puede desactivar,
en lugar de activar, un resultado concreto.
Nivel de salida: las neuronas de salida representan valores de atributo de
predicción para el modelo de minería de datos.
21
Datos requeridos para los modelos de red neuronal
El modelo de red neuronal debe contener una columna de clave, una o más
columnas de entrada y una o más columnas de predicción.
Los modelos de minería de datos que usan el algoritmo de red neuronal de
Microsoft están muy influenciados por los valores que se especifican en los
parámetros disponibles para el algoritmo. Los parámetros definen cómo se
muestrean los datos, cómo se distribuyen o cómo se espera que estén distribuidos
en cada columna, y cuándo se invoca la selección de características para limitar los
valores usados en el modelo final.
Para trabajar con los datos y ver cómo el modelo pone en correlación las entradas y
salidas, puede usar el Visor de redes neuronales de Microsoft. Con este visor
personalizado, puede filtrar los atributos de entrada y sus valores, y ver
gráficamente cómo afectan a las salidas. La información sobre herramientas del
visor muestra la probabilidad y la mejora respecto al modelo predictivo asociados a
cada par de valores de entrada y de salida.
La manera más fácil de explorar la estructura del modelo consiste en usar el Visor
de árbol de contenido genérico de Microsoft. Este visor le permitirá ver las
entradas, las salidas y las redes creadas por el modelo, así como hacer clic en
cualquier nodo para expandirlo y ver las estadísticas relacionadas con los niveles de
entrada, los niveles de salida y los niveles ocultos de los nodos.
22
Crear predicciones
Una vez procesado el modelo, puede usar la red y los pesos almacenados dentro de
cada nodo para realizar predicciones. Un modelo de red neuronal admite el análisis
de regresión, de asociación y de clasificación. Por lo tanto, el significado de cada
predicción puede ser diferente. También puede consultar el propio modelo, revisar
las correlaciones encontradas y recuperar las estadísticas relacionadas.
Observaciones
23
ALGORITMOS GENÉRICOS
El ser humano recurre a muchos conocimientos de todo tipo para realizar hasta los
trabajos más sencillos. Los conocimientos más utilizados por los humanos son los
heurísticos, es decir reglas prácticas e imprecisas, casi siempre eficaces. Los
conocimientos heurísticos no se expresan, ya que sólo se pueden aprender con la
práctica.
24
Existen datos objeto, es decir elementos de determinado dominio y datos hecho,
que son las relaciones entre objetos.
25
El conocimiento de orden 1, o teoría de orden 1, es un conocimiento heurístico.
Cuando un sistema tiene heurística en su base de conocimientos mejora su nivel de
respuesta, pero no puede llegar al grado de conocimiento que tiene un especialista
humano.
Por lo general las fuentes del conocimiento son los expertos humanos, libros y
datos experimentales agrupados en bases de datos.
La adquisición del conocimiento y su modelización son las tareas que más tiempo
requieren. Como resultado de la adquisición se construye una base de
conocimientos.
26
La inducción de conocimiento puede ser directa, o como resultado de una
inducción a partir de ejemplos, o como deducción de otros conocimientos ya
almacenados en la base de conocimientos.
Aprendizaje automático.
Uno de los principales logros de la Inteligencia Artificial es que puede otorgar a las
computadoras la habilidad de aprender. Para que esto suceda es necesario
transferir el conocimiento al interior de la máquina.
27
Los paradigmas más utilizados para el aprendizaje automático son:
Redes neuronales
Algoritmos genéticos
Si con los casos existentes en la base no se puede resolver una situación de forma
satisfactoria, ésta se atrapa automáticamente para actualizar los casos disponibles.
28
Redes neuronales
El modelo más simple es el diseñado por Mc Culloch y Pitts en 1949, en el que una
caja representa el cuerpo de las neuronas. Tiene entradas que son las dendritas, las
cuales están valoradas con un peso (w) que representa la potencia de la conexión.
La salida representa el axón. Los pesos de las dendritas pueden ser positivos o
negativos. Si son positivos se tendrán canales excitatorios y si son negativos,
canales inhibitorios. El cuerpo procesa las señales que le llegan de otras neuronas
según la hipótesis siguiente:
Señales de entrada: Oi = 0 o 1.
Se ponderan según su peso wi: N = S wi * Oi.
Señal de salida: O = 0 si N £ Umbral
= 1 si N > Umbral.
Para definir completamente una red neuronal, se tiene que especificar tanto el
comportamiento individual de cada neurona como la interconexión existente entre
ellas. Las neuronas que se comportan de forma similar se agrupan en capas. Su
cualidad principal es la capacidad para variar de comportamiento cuando cambia
una situación.
29
El proceso mediante el cual aprende la red se denomina entrenamiento. El
aprendizaje en una red consiste en ir cambiando los pesos de las conexiones
adaptándola hasta conseguir la respuesta que se desea. Puede ser supervisado, en
el que cada ejemplo estará formado por las entradas a la red y la salida que se
espera para esas entradas; y no supervisado, en el que cada ejemplo de
entrenamiento está constituido sólo por las entradas, sin dar la salida esperada,
por lo que se asociará la información recibida con la almacenada, la memoria está
formada por los pesos sinápticos entre neuronas.
Algoritmos genéricos
30
El problema a resolver se representa mediante una cadena compuesta por ceros y
unos (101001101). Se genera aleatoriamente una población de individuos
formados también por cadenas o patrones de este tipo. Se evalúa el rendimiento
de cada patrón, aumentando su peso si clasifica de forma adecuada el caso o
disminuyéndolo si no lo hace, y se seleccionan los individuos para la siguiente
generación basándose en su rendimiento, reemplazando los que tengan menor
peso. Entonces, se realizan cruces (intercambiando los bits) y mutaciones
(cambiando un 0 por un 1, o viceversa) de forma aleatoria entre los patrones.
31
COMPUTACIÓN GRÁFICA
Este campo puede ser dividido en varias áreas: Interpretado 3D en tiempo real (a
menudo usado en juegos de vídeo), animación de computadora, captura de vídeo y
creación de vídeo interpretado, edición de efectos especiales (a menudo usado
para películas y televisión), edición de imagen, y modelado (a menudo usado para
ingeniería y objetivos médicos). El desarrollo en la gráfica realizada por
computadora fue primero alimentado por intereses académicos y patrocinio del
gobierno. Sin embargo, cuando las aplicaciones verdaderas mundiales de la gráfica
realizada por computadora (CG) en televisión y películas demostraron una
alternativa viable a efectos especiales más a las tradicionales y las técnicas de
animación, los comerciales han financiado cada vez más el avance de este campo.
A menudo se piensa que la primera película para usar gráficos realizados por
computadora era 2001: A Space Odyssey (1968), que intentó mostrar como las
computadoras serían mucho más gráficas en el futuro. Sin embargo, todos los
gráficos de computadora en aquella película eran la animación dibujada a mano
(por ejemplo en las pantallas de televisión se simulaba el comportamiento de las
computadoras con dibujos), y las secuencias de efectos especiales fue producida
completamente con efectos ópticos y modelos convencionales.
32
Quizás el primer uso de la gráfica realizada por computadora expresamente para
ilustrar gráfica realizada por computadora estaba en Futureworld (1976), que
incluyó una animación de una cara humana y mano - producido por Ed Catmull y
Fred Parke en la Universidad de Utah.
34
PROCESAMIENTO DE
IMÁGENES
Operaciones de punto
Operaciones de entorno
Operaciones con dos o más imágenes
Los filtros se utilizan para la modificación de imágenes ya sea para detectar los
bordes de una escena o para modificar el aspecto, otra función de los filtros es para
la eliminación de ruido de la imagen.
Uno de los filtros clásicos para la detección de bordes es el filtro de Sobel el cual
utiliza, a su vez, dos mascaras o filtros. Una para detectar los bordes verticales y
otra para los horizontales. Así, para obtener los bordes completos se realiza la
suma de las imágenes que nos resultaron con los bordes verticales y horizontales.
35
Otro filtro para la detección de bordes es el filtro de Prewitt. Éste consta de 8
matrices que se aplican pixel a pixel a la imagen. Luego se suman las imágenes para
obtener los bordes bien marcados. El filtro de Prewitt marca muy bien los bordes
ya que sus matrices atacan estos desde ocho lados diferentes. En general cada
matriz toma el nombre de un punto cardinal: Norte, Sur, Este, Oeste, Noroeste,
Noreste, Suroeste, Sureste.
36
BIBLIOGRAFÍA
37
Computación Gráfica | Wikipedia
http://es.wikipedia.org/wiki/Computaci%C3%B3n_gr%C3%A1fica
38