Está en la página 1de 11

Archivo LibreriaDifuso

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

namespace LibreriaDifuso
{
public class ClsFuzi
{
public int _Valor_Nivel;

public string[,] _Conjunto_Entrada_Difuso = new string[5, 5];


public string[,] _Conjunto_Salida_Difuso = new string[5, 5];
public string[,] _Reglas = new string[5, 3];
public string[,] _ReglasActivadas = new string[3, 3];
public string[] _ValorCentroide = new string[3];
public string[,] _Grados_Pertenencia = new string[5, 5];

public void Guardar_Datos(int Nivel)


{
_Valor_Nivel = Nivel;
}
public void CalcularGradoPertenenciaTriangular(int num)
{
double Grado=0;
string pertenece = "";
if (_Valor_Nivel <=
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 2])) //Si es igual x <=a
{
Grado = 0;
if (_Valor_Nivel ==
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 2]))
{
pertenece = "1";
}
else
{
pertenece = "";
}
}
else if (_Valor_Nivel >
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 2]) && _Valor_Nivel <=
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 3])) //Si el valor esta entre
a y b
{
Grado = Math.Round((_Valor_Nivel -
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 2])) /
(Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 3]) -
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 2])), 2);
pertenece = "1";
}
else if (_Valor_Nivel >
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 3]) && _Valor_Nivel <=
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 4])) // si el valor esta entre
b y c
{
Grado =
Math.Round((Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 4]) -
_Valor_Nivel) / (Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 4]) -
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 3])), 2);
pertenece = "1";
}
else if (_Valor_Nivel >=
Convert.ToDouble(_Conjunto_Entrada_Difuso[num, 4])) //Si es igual x >=c
{
Grado = 0;
pertenece = "";
}
_Grados_Pertenencia[num, 0] = Grado.ToString();
_Grados_Pertenencia[num, 1] = pertenece;
}
public void CalcularGradoPertenenciaFria()
{
double Grado = 0;
string pertenece = "";
//Fresca
if (_Valor_Nivel >= Convert.ToDouble(_Conjunto_Entrada_Difuso[0,
2]) && _Valor_Nivel <= Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 3]))
{
Grado = 1;
pertenece = "1";
}
else if (_Valor_Nivel >
Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 3]) && _Valor_Nivel <=
Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 4]))
{
Grado =
Math.Round((Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 4]) -
_Valor_Nivel) / (Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 4]) -
Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 3])), 2);
pertenece = "1";
}
else if (_Valor_Nivel >=
Convert.ToDouble(_Conjunto_Entrada_Difuso[0, 4])) //Si es igual x >=c
{
Grado = 0;
pertenece = "";
}
_Grados_Pertenencia[0, 0] = Grado.ToString();
_Grados_Pertenencia[0, 1] = pertenece;
}
public void CalcularGradoPertenenciaTorrida()
{
double Grado = 0;
string pertenece = "";
if (_Valor_Nivel < Convert.ToDouble(_Conjunto_Entrada_Difuso[4,
2])) //Menor a a
{
Grado = 0;
pertenece = "";
}
else if (_Valor_Nivel >=
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 2]) && _Valor_Nivel <=
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 3])) //Esta entre a y b
{
Grado = Math.Round((_Valor_Nivel -
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 2])) /
(Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 4]) -
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 2])), 2);
pertenece = "1";
}
else if (_Valor_Nivel >
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 3]) && _Valor_Nivel <=
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 4])) //Entre b y c
{
Grado = 1;
pertenece = "1";
}
else if (_Valor_Nivel >
Convert.ToDouble(_Conjunto_Entrada_Difuso[4, 4])) //Si es igual x >=c
{
Grado = 0;
pertenece = "";
}
_Grados_Pertenencia[4, 0] = Grado.ToString();
_Grados_Pertenencia[4, 1] = pertenece;
}
public void Cargar_Datos()
{
//Conjunto de Entrada Difuso - Otro grafico
_Conjunto_Entrada_Difuso[0, 0] = "Fria";
_Conjunto_Entrada_Difuso[0, 1] = "[ 5 - 13 ]";
_Conjunto_Entrada_Difuso[0, 2] = "05";
_Conjunto_Entrada_Difuso[0, 3] = "07";
_Conjunto_Entrada_Difuso[0, 4] = "13";

_Conjunto_Entrada_Difuso[1, 0] = "Fresca";
_Conjunto_Entrada_Difuso[1, 1] = "[ 9 - 21 ]";
_Conjunto_Entrada_Difuso[1, 2] = "09";
_Conjunto_Entrada_Difuso[1, 3] = "15";
_Conjunto_Entrada_Difuso[1, 4] = "21";

_Conjunto_Entrada_Difuso[2, 0] = "Agradable";
_Conjunto_Entrada_Difuso[2, 1] = "[ 17 - 29 ]";
_Conjunto_Entrada_Difuso[2, 2] = "17";
_Conjunto_Entrada_Difuso[2, 3] = "23";
_Conjunto_Entrada_Difuso[2, 4] = "29";

_Conjunto_Entrada_Difuso[3, 0] = "Calida";
_Conjunto_Entrada_Difuso[3, 1] = "[ 25 - 37 ]";
_Conjunto_Entrada_Difuso[3, 2] = "25";
_Conjunto_Entrada_Difuso[3, 3] = "31";
_Conjunto_Entrada_Difuso[3, 4] = "37";

//Conjunto de Entrada Difuso - Otro grafico


_Conjunto_Entrada_Difuso[4, 0] = "Torrida";
_Conjunto_Entrada_Difuso[4, 1] = "[ 33 - 40 ]";
_Conjunto_Entrada_Difuso[4, 2] = "33";
_Conjunto_Entrada_Difuso[4, 3] = "38";
_Conjunto_Entrada_Difuso[4, 4] = "40";

//Conjunto de Salida Difuso


_Conjunto_Salida_Difuso[0, 0] = "Parado";
_Conjunto_Salida_Difuso[0, 1] = "[ 0 - 20 ]";
_Conjunto_Salida_Difuso[0, 2] = "00";
_Conjunto_Salida_Difuso[0, 3] = "10";
_Conjunto_Salida_Difuso[0, 4] = "20";

_Conjunto_Salida_Difuso[1, 0] = "Lenta";
_Conjunto_Salida_Difuso[1, 1] = "[ 10 - 30 ]";
_Conjunto_Salida_Difuso[1, 2] = "10";
_Conjunto_Salida_Difuso[1, 3] = "20";
_Conjunto_Salida_Difuso[1, 4] = "30";

_Conjunto_Salida_Difuso[2, 0] = "Media";
_Conjunto_Salida_Difuso[2, 1] = "[ 20 - 40 ]";
_Conjunto_Salida_Difuso[2, 2] = "20";
_Conjunto_Salida_Difuso[2, 3] = "30";
_Conjunto_Salida_Difuso[2, 4] = "40";

_Conjunto_Salida_Difuso[3, 0] = "Rapida";
_Conjunto_Salida_Difuso[3, 1] = "[ 30 - 50 ]";
_Conjunto_Salida_Difuso[3, 2] = "30";
_Conjunto_Salida_Difuso[3, 3] = "40";
_Conjunto_Salida_Difuso[3, 4] = "50";

_Conjunto_Salida_Difuso[4, 0] = "Maxima";
_Conjunto_Salida_Difuso[4, 1] = "[ 40 - 60 ]";
_Conjunto_Salida_Difuso[4, 2] = "40";
_Conjunto_Salida_Difuso[4, 3] = "50";
_Conjunto_Salida_Difuso[4, 4] = "60";

//Reglas
_Reglas[0, 0] = "Fria";
_Reglas[0, 1] = "Parado";
_Reglas[0, 2] = "1";

_Reglas[1, 0] = "Fresca";
_Reglas[1, 1] = "Lenta";
_Reglas[1, 2] = "2";
_Reglas[2, 0] = "Agradable";
_Reglas[2, 1] = "Media";
_Reglas[2, 2] = "3";

_Reglas[3, 0] = "Calida";
_Reglas[3, 1] = "Rapida";
_Reglas[3, 2] = "4";

_Reglas[4, 0] = "Torrida";
_Reglas[4, 1] = "Maxima";
_Reglas[4, 2] = "5";
}
public void ActivacionReglas()
{
int k = 0;
for (int j = 0; j < 5; j++) //Recorrer Conjunto difuso entrada
{
for (int i = 0; i < 5; i++) //Recorrer Reglas
{
if (Convert.ToDouble(_Grados_Pertenencia[j, 0]) >= 0 &&
_Grados_Pertenencia[j, 1] == "1") //Compara grados de pertenencia
{
if (_Conjunto_Entrada_Difuso[j, 0] == _Reglas[i, 0])
//Ver que reglas se activan
{
_ReglasActivadas[k, 0] = _Reglas[i, 2]; //Guarda
Regla Activada
_ReglasActivadas[k, 1] = _Reglas[i, 0];
_ReglasActivadas[k, 2] = _Reglas[i, 1];
k = k + 1;
}
}
}
}
}
public double Desfuzificacion()
{
for (int j = 0; j < 5; j++) //Recorrer Conjunto difuso salida
{
for (int i = 0; i < 2; i++)
{
if (_ReglasActivadas[i, 2] == _Conjunto_Salida_Difuso[j,
0])
{
_ValorCentroide[i] = _Conjunto_Salida_Difuso[j, 3];
}
}
}
//Calculo de la salida difusa
double producto=0, suma=0;
int k=0 ;
for (int j = 0; j < 5; j++)
{

if (_Grados_Pertenencia[j, 1] == "1")
{
producto = producto +
Convert.ToDouble(_ValorCentroide[k]) *
Convert.ToDouble(_Grados_Pertenencia[j, 0]);
suma = suma + Convert.ToDouble(_Grados_Pertenencia[j,
0]);
k = k + 1;
}
}
return producto / suma;
}
public void limpiar()
{
for (int i=0; i < 2; i++)
{
_Grados_Pertenencia[i, 0] = "";
_Grados_Pertenencia[i, 1] = "";
}
}
}
}

FrmConjuntos

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LibreriaDifuso;

namespace SisDifuso
{
public partial class FrmConjuntos : Form
{
public FrmConjuntos()
{
InitializeComponent();
}

private void btncerrar_Click(object sender, EventArgs e)


{
this.Close();
}

private void FrmConjuntos_Load(object sender, EventArgs e)


{
ClsFuzi objconjunto = new ClsFuzi();
objconjunto.Cargar_Datos();
//Muestra Conjunto Difuso Entrada
for (int i = 0; i < 5; i++)
{
ListViewItem _lista1 = new ListViewItem();
_lista1.Text = (i + 1).ToString();
_lista1.SubItems.Add(objconjunto._Conjunto_Entrada_Difuso[i, 0]);
_lista1.SubItems.Add(objconjunto._Conjunto_Entrada_Difuso[i, 1]);
lvwEntrada.Items.Add(_lista1);
}
//Muestra Conjunto Difuso Salida
for (int i = 0; i < 5; i++)
{
ListViewItem _lista2 = new ListViewItem();
_lista2.Text = (i + 1).ToString();
_lista2.SubItems.Add(objconjunto._Conjunto_Salida_Difuso[i, 0]);
_lista2.SubItems.Add(objconjunto._Conjunto_Salida_Difuso[i, 1]);
lvwSalida.Items.Add(_lista2);
}
}
}
}

frmReglas

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LibreriaDifuso;

namespace SisDifuso
{
public partial class FrmReglas : Form
{
public FrmReglas()
{
InitializeComponent();
}

private void FrmReglas_Load(object sender, EventArgs e)


{
ClsFuzi objconjunto = new ClsFuzi();
objconjunto.Cargar_Datos();
//Muestra Reglas Difusas
for (int i = 0; i < 5; i++)
{
ListViewItem _lista3 = new ListViewItem();
_lista3.Text = (i + 1).ToString();
_lista3.SubItems.Add(objconjunto._Reglas[i, 0]);
_lista3.SubItems.Add(objconjunto._Reglas[i, 1]);
lvwReglas.Items.Add(_lista3);
}
}

private void btncerrar_Click(object sender, EventArgs e)


{
this.Close();
}
}
}
Frmsimulador

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using LibreriaDifuso;
namespace SisDifuso
{
public partial class FrmSimulador : Form
{
public FrmSimulador()
{
InitializeComponent();
}

private void btnAnalizar_Click(object sender, EventArgs e)


{
ClsFuzi objconjunto = new ClsFuzi();
objconjunto.limpiar();
objconjunto.Cargar_Datos();
objconjunto.Guardar_Datos(Convert.ToInt16(textBox1.Text));
objconjunto.CalcularGradoPertenenciaTriangular(1);
objconjunto.CalcularGradoPertenenciaTriangular(2);
objconjunto.CalcularGradoPertenenciaTriangular(3);
objconjunto.CalcularGradoPertenenciaFria();
objconjunto.CalcularGradoPertenenciaTorrida();
lvwPertenencia.Items.Clear();
for (int i = 0; i < 5; i++)
{
ListViewItem _lista2 = new ListViewItem();
_lista2.Text = (i+1).ToString();
_lista2.SubItems.Add("U"+objconjunto._Conjunto_Entrada_Difuso[i,0]+"("+
textBox1.Text+")");
_lista2.SubItems.Add(objconjunto._Grados_Pertenencia[i, 0]);
lvwPertenencia.Items.Add(_lista2);
}

objconjunto.ActivacionReglas();
lvwActivacion.Items.Clear();
for (int i = 0; i < 2; i++)
{
ListViewItem _lista1 = new ListViewItem();
_lista1.Text = objconjunto._ReglasActivadas[i, 0];
_lista1.SubItems.Add(objconjunto._ReglasActivadas[i, 1]);
_lista1.SubItems.Add(objconjunto._ReglasActivadas[i, 2]);
lvwActivacion.Items.Add(_lista1);
}
lblResultado.Text = objconjunto.Desfuzificacion().ToString("0.00");
}

private void btncerrar_Click(object sender, EventArgs e)


{
this.Close();
}
}
}
Frmprincipal

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SisDifuso
{
public partial class FrmPrincipal : Form
{
public FrmPrincipal()
{
InitializeComponent();
}

private void conjuntosDifusosToolStripMenuItem_Click(object sender,


EventArgs e)
{

private void conjuntoDifusoEntradasToolStripMenuItem_Click(object sender,


EventArgs e)
{
FrmConjuntos fhijo = new FrmConjuntos();
fhijo.MdiParent = this;
fhijo.Show();
}

private void reglasDifusasToolStripMenuItem_Click(object sender,


EventArgs e)
{
FrmReglas fhijo = new FrmReglas();
fhijo.MdiParent = this;
fhijo.Show();
}

private void simulacioToolStripMenuItem_Click(object sender, EventArgs e)


{
FrmSimulador fhijo = new FrmSimulador();
fhijo.MdiParent = this;
fhijo.Show();
}

private void cerrarToolStripMenuItem_Click(object sender, EventArgs e)


{
this.Close();
}
}
}

También podría gustarte