1. 程式人生 > >一個簡單的ANN算法

一個簡單的ANN算法

匹配 cal true 保存 初始化 active adjust printf tdi

#include <stdio.h>  
#include <stdlib.h>
#include <time.h>  
  
int M[10] = {0};                                //權值  
int X[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};    //輸入向量  
int Y[10] = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0};     //理想輸出向量 註:1 表示奇數; 0 表示偶數  
int O[10] = {0};                                //保存輸出向量  
int ST = 52;                                    //閾值,默認值:52  
  
//初始化權值  
void initM()  
{  
    srand((unsigned int)time(0));  
      
    for (int x=0; x<10; ++x)  
    {  
        //初始化權值所使用的隨機數在 0 - 99 之間  
        M[x] = rand()%100;  
    }  
}  
  
//激活函數  
int active(int m, int x)  
{  
    int o = m * x;  
      
    if (o > ST)  
    {  
        return 0;  
    }  
    else  
    {  
        return 1;  
    }  
}  
  
//計算輸出向量  
void calcY()  
{  
    for (int x=0; x<10; ++x)  
    {  
        O[x] = active(M[x], X[x]);  
    }  
}  
  
//根據實際輸出向量和理想輸出向量調整權向量,返回實際輸出和理想輸出不匹配的數目  
int adjustM()  
{  
    int err = 0;  
    for (int x=0; x<10; ++x)  
    {  
        if (O[x] != Y[x])  
        {  
            err++;  
              
            if (1 == O[x])  
            {  
                M[x] += X[x];  
            }  
            else  
            {  
                M[x] -= X[x];  
            }  
        }  
    }  
      
    return err;  
}  
  
//打印權向量  
void printM()  
{  
    printf("\n最終訓練結果:\n");  
    for (int x=0; x<10; ++x)  
    {  
        printf("M[%i] = %i\n", x, M[x]);  
    }  
}  
  
//測試已經訓練好的ANN  
void test(int input)  
{  
    if ( 0==active(M[input], X[input]) )  
    {  
        printf("%d 是 偶數 ", input+1);  
    }  
    else  
    {  
        printf("%d 是 奇數 ", input+1);  
    }  
      
    printf("\n\n");  
}  
  
//主函數入口  
int main()  
{  
    printf("請輸入閾值:");  
    scanf("%d", &ST);  
    printf("\n");  
      
    initM();  
      
    int n = 0;  
    //一直訓練直到能夠100%正確為止  
    while (1)  
    {  
        n++;  
        calcY();  
        int err = adjustM();  
        if (0 >=err)  
        {  
            //能夠100%正確地回答問題了,結束訓練  
            break;  
        }  
        printf("第%0.2d次訓練後的結果中存在的錯誤數 %d\n", n,err);  
    }  
      
    printM();  
    printf("\n閾值=%d 訓練次數=%d\n\n", ST, n);  
      
    while (true)  
    {  
        int a = 0;  
        printf("請輸入範圍為1~10的數字:");  
        scanf("%d", &a);  
        if (1 > a || 10 < a)  
        {  
            break;  
        }  
          
        test(a-1);  
    }  
      
    return 0;  
} 

  

一個簡單的ANN算法