Рубрики: C#КомпьютерыПрограммирование

Простой пример сети Хопфилда на <span style="color: #28A84C">C#</span>

8 440 просмотров
Реализуем сеть Хопфилда на C#
Простой пример сети Хопфилда на <span style="color: #28A84C">C#</span>

Реализация алгоритма на C# исходя из видео.

int n = 3;
int m = 4;
int[,] mas = new int[n, m];
int[] y = new int[m];
mas[0, 0] = -1; mas[0, 1] = 1; mas[0, 2] = -1; mas[0, 3] = 1;
mas[1, 0] = 1; mas[1, 1] = -1; mas[1, 2] = 1; mas[1, 3] = 1;
mas[2, 0] = -1; mas[2, 1] = 1; mas[2, 2] = -1; mas[2, 3] = -1;
int i = 0, j = 0;
string s = "";
int[,] w = new int[m, m];//
int[,] tm = new int[m, m];//Временный массив
int k = 0;
//нахожу W
for (k = 0; k < n; k++)
{
    //Транспортирую матрицу
    for (i = 0; i < m; i++)
        for (j = 0; j < m; j++)
            tm[i, j] = mas[k, i] * mas[k, j];
    //нахожу сумму tm[i]
    for (i = 0; i < m; i++)
        for (j = 0; j < m; j++)
            w[i, j] += tm[i, j];
}
//Обнуляю главную диагональ w
for (i = 0; i < m; i++) w[i, i] = 0;
int[] a = new int[m];//ф-ия активации
bool b = false; k = 0;//Счётчик
int l = -1;//Индекс подходящей строки
while (!b && k < 200)
{
    //Вычисляю y'
    for (i = 0; i < m; i++)
        for (j = 0; j < m; j++)
            a[i] += w[i, j] * y[j];
    //Обрабатываю y' ф-ей активации
    for (i = 0; i < m; i++)
        if (a[i] >= 0) a[i] = 1;
        else a[i] = -1;
    //Сравниваю
    bool st = false;
    for (i = 0; i < n; i++)
    {
        st = true;
        for (j = 0; j < m; j++)
            if (mas[i, j] != a[j]) { st = false; break; }
        if (st) { l = i; break; }
    }
    if (l != -1)b = true;
    else
    {       
        k++;//Увеличиваю счетчик
        //Обновляем у'
        for (i = 0; i < m; i++)
            y[i] = a[i];
        //Обнуляем a
        for (i = 0; i < m; i++)
            a[i] = 0;
    }
}
if (l != -1)
{
    s += "\nнайдено совпадение с X=" + (l + 1).ToString() + "\nГлубина поиска:" + (k + 1).ToString();
}
else
{
    s += "\nнет совпадений";
}

Исходники

Комментарии 2

Загрузка комментариев…