一個簡單的ANN算法
阿新 • • 發佈:2018-04-30
匹配 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算法