Está en la página 1de 6

Instar.cs Sábado, 11 de Abril de 2009 08:57 p.m.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Practica1
{
/// <summary>
/// Esta clase implementa el algoritmo de Red Instar
/// </summary>
public class Instar
{
/// <summary>
/// Salida de la Neurona
/// </summary>
private int a;
/// <summary>
/// Peso cero (W_{0})
/// </summary>
private int w_cero;
/// <summary>
/// Velocidad de Aprendizaje
/// </summary>
private float alpha;
/// <summary>
/// Umbral de la neurona
/// </summary>
private float umbral;
/// <summary>
/// Pesos iniciales
/// </summary>
private Matriz inicial;

/// <summary>
/// Inicializa la red, también inicializa los pesos iniciales con 0 en las dimensiones
especificadas.
/// </summary>
/// <param name="x"> Establece la dimensión N, de los pesos iniciales.</param>
/// <param name="x"> Establece la dimensión N, de los pesos iniciales.</param>
public Instar(int x, int y)
{
this.alpha = 1;
do
{
this.w_cero = new Random().Next(6);
} while (w_cero <= 1);
do
{
this.umbral = new Random().Next((int)w_cero);
} while (this.umbral <= 0);
this.umbral *= -1;
this.inicial = new Matriz(1, 3, (float)0);
}

-1-
Instar.cs Sábado, 11 de Abril de 2009 08:57 p.m.

/// <summary>
/// Inicializa la red, inicializa los valores con los propuestos
/// </summary>
/// <param name="alpha">Velocidad de Aprendizaje.</param>
/// <param name="umbral">Umbral de la neurona</param>
/// <param name="w_cero">Peso cero</param>
/// <param name="inicial">Pesos iniciales</param>
public Instar(float alpha, float umbral, int w_cero, Matriz inicial)
{
this.alpha = alpha;
this.umbral = umbral;
this.w_cero = w_cero;
this.inicial = inicial;
}

/// <summary>
/// Obtiene el resultado de la neurona.
/// </summary>
/// <returns>Valor devuelto por la neurona.</returns>
public int getA()
{
return this.a;
}

/// <summary>
/// Establece la salida de la neurona.
/// </summary>
/// <param name="new_a">Valor de salida propuesto para la neurona.</param>
public void setA(int new_a)
{
this.a = new_a;
}

/// <summary>
/// Obtiene los pesos actuales de la neurona.
/// </summary>
/// <returns>Pesos actuales de la neurona.</returns>
public Matriz getPesos()
{
return inicial;
}

/// <summary>
/// Obtiene el peso cero actual de la neurona.
/// </summary>
/// <returns>Peso cero de la neurona.</returns>
public int getPesoCero()
{
return this.w_cero;
}

/// <summary>
/// Obtiene el umbral actual de la neurona.
/// </summary>
-2-
Instar.cs Sábado, 11 de Abril de 2009 08:57 p.m.

/// <returns>Umbral actual de la neurona.</returns>


public float getUmbral()
{
return this.umbral;
}

/// <summary>
/// Obtiene la velocidad de aprendizaje.
/// </summary>
/// <returns>Velocidad de aprendizaje.</returns>
public float getAlpha()
{
return this.alpha;
}

/// <summary>
/// Representación en texto de la neurona.
/// </summary>
/// <returns>Texto con formato para representar a la neurona.</returns>
public override string ToString()
{
string temp = "Valores Actuales de la Red INSTAR: \n";
temp += "Umbral: " + this.umbral + "\n";
temp += "Alpha: " + this.alpha + "\n";
temp += "W_cero: " + this.w_cero + "\n";
temp += "Inicial: " + this.inicial.ToString();
return temp;
}

/// <summary>
/// Calcula el valor a evaluar por la función hardlim
/// </summary>
/// <param name="ejemplo">Neurona que utiliza la función.</param>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada.</param>
/// <returns>Valor a ser evaluado por hardlim.</returns>
public static float getPartHardlim(Instar ejemplo, int sensor_visual, Matriz patron)
{
float type_cero = 0, type_two = 0, temp;
type_cero = ejemplo.w_cero * sensor_visual;
if (ejemplo.inicial.x_tam() == patron.y_tam())
{
if ((ejemplo.inicial * patron).unit() == true)
{
type_two = (ejemplo.inicial * patron).valunit();
}
}
else
{
type_two = 0;
}

temp = type_cero + type_two + ejemplo.umbral;


return temp;
-3-
Instar.cs Sábado, 11 de Abril de 2009 08:57 p.m.

/// <summary>
/// Calcula el valor a evaluar por la función hardlim
/// </summary>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada.</param>
/// <returns>Valor a ser evaluado por hardlim.</returns>
public float getPartHardlim(int sensor_visual, Matriz patron)
{
return Instar.getPartHardlim(this, sensor_visual, patron);
}

/// <summary>
/// Función hardlim.
/// </summary>
/// <param name="ejemplo">Neurona que utiliza la función.</param>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada.</param>
/// <returns>Devuelve la evaluación de hardlim.</returns>
public static int hardlim(Instar ejemplo, int sensor_visual, Matriz patron)
{
float temp;
temp = Instar.getPartHardlim(ejemplo,sensor_visual,patron);
if (temp >= 0)
ejemplo.a = 1;
else
ejemplo.a = 0;
return ejemplo.a;
}

/// <summary>
/// Función hardlim
/// </summary>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada.</param>
/// <returns>Devuelve la evaluación de hardlim.</returns>
public int hardlim(int sensor_visual, Matriz patron)
{
Instar.hardlim(this, sensor_visual, patron);
return this.a;
}

/// <summary>
/// Actualiza los pesos de la neurona.
/// </summary>
/// <param name="ejemplo">Neurona que actualiza sus pesos.</param>
/// <param name="patron">Patron evaluado.</param>
public static void w_nueva(Instar ejemplo, Matriz patron)
{
Matriz r;
r = ejemplo.inicial + ejemplo.alpha * ejemplo.a * (Matriz.transpuesta(patron) -
ejemplo.inicial);
ejemplo.inicial = r;
-4-
Instar.cs Sábado, 11 de Abril de 2009 08:57 p.m.

ejemplo.a = 0;
}

/// <summary>
/// Actualiza los pesos de la neurona.
/// </summary>
/// <param name="patron">Patron evaluado.</param>
public void w_nueva(Matriz patron)
{
Instar.w_nueva(this, patron);
}

/// <summary>
/// Efectua una iteración completa.
/// </summary>
/// <param name="ejemplo">Neurona que efectua una iteración.</param>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada a la neurona.</param>
/// <returns>Valor devuelto por la iteración.</returns>
public static int iteracion(Instar ejemplo, int sensor_visual, Matriz patron)
{
int r;
r = ejemplo.hardlim(sensor_visual, patron);
ejemplo.w_nueva(patron);
return r;
}

/// <summary>
/// Efectua una iteración completa.
/// </summary>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada a la neurona.</param>
/// <returns>Valor devuelto por la iteración.</returns>
public int iteracion(int sensor_visual, Matriz patron)
{
return Instar.iteracion(this, sensor_visual, patron);
}

/// <summary>
/// Representación textual de una iteración.
/// </summary>
/// <param name="ejemplo">Neurona que efectua la iteración.</param>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada a la neurona.</param>
/// <returns>Representación de la iteración (string)</returns>
public static string iteracionPrint(Instar ejemplo, int sensor_visual, Matriz patron)
{
string temp = "";
temp += ejemplo.ToString() + "\n";
temp += "Valores a Evaluar" + "\n";
temp += "Estimulo No Condicionado: " + sensor_visual + "\n";
temp += "Estimulos Condicionados: \n" + patron.ToString() + "\n";
ejemplo.hardlim(sensor_visual, patron);
temp += "El resultado es: " + ejemplo.getA() + "\n";
-5-
Instar.cs Sábado, 11 de Abril de 2009 08:57 p.m.

ejemplo.w_nueva(patron);
temp += "Actualizando los Pesos: " + ejemplo.inicial.ToString();
return temp;
}

/// <summary>
/// Representación textual de una iteración.
/// </summary>
/// <param name="sensor_visual">Valor de entrada a la neurona.</param>
/// <param name="patron">Patron de entrada a la neurona.</param>
/// <returns>Representación de la iteración (string)</returns>
public string iteracionPrint(int sensor_visual, Matriz patron)
{
string temp = Instar.iteracionPrint(this, sensor_visual, patron);
return temp;
}
}
}

-6-