动物专家系统C实现【人工智能】建立相应的规则和简易数据库<正向推理和逆向推理>

实验内容:

要求:

设计一个动物识别专家系统,规则库至少包含15条规则,可以识别至少7种动物,规则可增加;

界面显示要求:

1)有若干选择动物特征的选择列表;

2)表现判断动物时,使用了哪些规则;

3)表现数据库的变化;

4)显示规则的调用次序;

5)显示最后的结果,包含动物能识别出来和动物不能识别出来两种情况;

6)至少检查两个例子实现正向推理和反向推理的区别

实验思路:

(1)、建立知识库利用二维数组 features[][11]储存,其中存放的是定义的动物特征,

利用 getNUM()可以获取知识库元素个数

(2)、规则利用三维数组 expr[][2][4]建立,其中存放的是相应的动物特征的编号组合,

利用 getrule_NUM()可以获取到规则的个数

(3)、在正向推理中,

第一步:将输入的特征值存放在数组 condition_chose[24]中,

用指向此数组的指针去匹配规则 expr[][0]即规则的前件(在函数 match中实现)。

第二步:如果匹配到规则那么将已经匹配成功的特征在 condition_chose[24]中消去

(置为-2),并将匹配到的结论加入到 condition_chose[24]中,同时输出匹配成功的规则

(在函数 inference中实现)。

第三步:循环到第一步直到找到的对应的动物结束,若匹配失败输出未匹配成功。

(4)、在逆向推理中,

第一步:将输入的动物编号存放在数组 condition_chose[24]中,

用指向此数组的指针去匹配规则 expr[][1]即规则的后件(在函数 match中实现)。

第二步: 如果匹配到规则那么将已经匹配成功的结论在 condition_chose[24]中消去

(置为-2),并将匹配到的特征加入到 condition_chose[24]中,

同时输出匹配成功的规则(在函数 inference中实现)。

第三步:循环到第一步直到找到的所有的动物特征结束,若匹配失败输出未匹配成功。

实验代码:

在Visio Stduio中建立如下文件:

动物专家系统C实现【人工智能】建立相应的规则和简易数据库<正向推理和逆向推理>

动物专家系统C实现【人工智能】建立相应的规则和简易数据库<正向推理和逆向推理>

各个文件代码如下:

#pragma once
#include<stdio.h>
#include<string.h>

char features[][11]= { "&#x6709;&#x6BDB;", "&#x4EA7;&#x5976;", "&#x6709;&#x7FBD;&#x6BDB;", "&#x4F1A;&#x98DE;", "&#x4F1A;&#x4E0B;&#x86CB;", "&#x5403;&#x8089;", "&#x6709;&#x72AC;&#x9F7F;", "&#x6709;&#x722A;", "&#x773C;&#x775B;&#x76EF;&#x524D;&#x65B9;", "&#x6709;&#x8E44;",
                       "&#x53CD;&#x520D;", "&#x9EC4;&#x8910;&#x8272;", "&#x6709;&#x6591;&#x70B9;", "&#x6709;&#x9ED1;&#x8272;&#x6761;&#x7EB9;", "&#x957F;&#x8116;", "&#x957F;&#x817F;", "&#x4E0D;&#x4F1A;&#x98DE;", "&#x4F1A;&#x6E38;&#x6CF3;", "&#x9ED1;&#x767D;&#x4E24;&#x8272;", "&#x5584;&#x98DE;",
                       "&#x54FA;&#x4E73;&#x7C7B;", "&#x9E1F;&#x7C7B;", "&#x8089;&#x98DF;&#x7C7B;", "&#x8E44;&#x7C7B;", "&#x4F01;&#x9E45;", "&#x6D77;&#x71D5;", "&#x9E35;&#x9E1F;", "&#x6591;&#x9A6C;", "&#x957F;&#x9888;&#x9E7F;", "&#x864E;", "&#x91D1;&#x94B1;&#x8C79;" };
//&#x6307;&#x5411;&#x4E8B;&#x5B9E;&#x5E93;&#x7684;&#x6307;&#x9488;
char (*point)[11] = features;
//&#x83B7;&#x53D6;&#x6570;&#x636E;&#x7684;&#x4E2A;&#x6570;
int getNUM() {
    int num = 0;
    while (*point[num] != NULL) {
        num++;
    }
    return num;
}

</string.h></stdio.h>
#pragma once
#include<stdio.h>
#include"database.h"

int expr[][2][4] = { {{1, -1, -1, -1}, { 21 }},
                     {{21, 9, -1, -1}, { 24 }},
                     {{23, 12, 13, -1}, { 31 }},
                     {{4, 5, -1, -1}, { 22 }},
                     {{7, 8, 9, -1}, { 23 }},
                     {{24, 15, 16, 13}, { 29 }},
                     {{22, 15, 16, 17}, { 27 }},
                     {{21, 10, -1, -1}, { 24 }},
                     {{23, 12, 14, -1}, { 30 }},
                     {{22, 18, 19, 17}, { 25 }},
                     {{24, 14, -1, -1}, { 28 }},
                     {{22, 20, -1, -1}, { 26 }},
                     {{2, -1, -1, -1}, { 21 }},
                     {{3, -1, -1, -1}, { 22 }} };
//&#x83B7;&#x53D6;&#x89C4;&#x5219;&#x4E2A;&#x6570;
int getrule_NUM() {
    int num = 0;
    num = sizeof(expr)/sizeof(expr[0]);
    return num;
}
</stdio.h>
#pragma once
#include<stdio.h>
#include"database.h"

void interface(char *a) {
    //&#x4E8B;&#x5B9E;&#x5E93;&#x9009;&#x62E9;&#x5217;&#x8868;
    printf("\t\t--------------------------------------------------------------\n");
    printf("\t\t----------------------------&#x77E5;&#x8BC6;&#x5E93;----------------------------\n");
    //int count1 = getNUM();
    int count1 = getNUM() - 7;
    int count2 = count1;        //&#x8BB0;&#x5F55;count1
    while (count1) {
        for (int i = 1; i < count2+1; i++) {
            printf("%d.%s  \t", i, point[i - 1]);
            count1--;
            //&#x6BCF;&#x884C;&#x8F93;&#x51FA;&#x516D;&#x4E2A;
            if (i % 6 == 0) {
                printf("\n");
            }
        }
    }
    if (a != NULL) {
        count2++;
        printf("%d.%s ", count2, a);
    }
    printf("\n");
    printf("\t\t--------------------------------------------------------------\n");
    printf("&#x8BF7;&#x8F93;&#x5165;&#x9009;&#x62E9;&#x7684;&#x7279;&#x5F81;&#x6570;&#x5B57;&#xFF1A;");
    //printf("&#x8BF7;&#x8F93;&#x5165;&#x9009;&#x62E9;&#x7684;&#x52A8;&#x7269;&#x6570;&#x5B57;:");
}

</stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#include"database.h"
#include"interface.h"
#include"rule.h"
#include<stdio.h>
#include<stdlib.h>

using namespace std;

int condition_chose[24];            //&#x9009;&#x62E9;&#x7684;&#x52A8;&#x7269;&#x7279;&#x5F81;
int count_num = 0;                  //&#x8BB0;&#x5F55;&#x8F93;&#x5165;&#x7279;&#x5F81;&#x4E2A;&#x6570;
int rule_Max = 4;                   //&#x89C4;&#x5219;&#x524D;&#x4EF6;&#x6700;&#x5927;&#x4E3A;4
int rule_number = -1;               //&#x5339;&#x914D;&#x89C4;&#x5219;&#x6807;&#x53F7;

//&#x5339;&#x914D;&#x89C4;&#x5219;&#x53F3;&#x90E8;&#x5206;
bool match(int *p) {
    int k;
    int j;
    int count_elem = 0;
    int flag = 0;
    for (rule_number = 0;rule_number < getrule_NUM();rule_number++) {
        count_elem = 0;
        for (int j = 0;j < count_num;j++) {
            for (int k = 0;k < 4;k++) {
                if (expr[rule_number][0][k] != -1) {
                    count_elem++;
                }
                if (p[j] == expr[rule_number][0][k]) {
                    flag++;
                }
            }
        }
        if (flag == (count_elem/count_num)) {
            return true;
        }
        flag = 0;
    }
    return false;
}

//&#x627E;&#x5230;&#x7ED3;&#x8BBA;
void inference(int *p) {
    printf("--------------------&#x4F7F;&#x7528;&#x89C4;&#x5219;-----------------------\n");
    int u;
    int l;
    int count = 1;
    int result;         //&#x8BB0;&#x5F55;&#x7ED3;&#x8BBA;
    while (match(p)) {
        u = 0;
        result = expr[rule_number][1][0];
        for (int i = 0;i < count_num;i++) {
            for (int j = 0;j < 4;j++) {
                if (expr[rule_number][0][j] == -1) {
                    u++;
                }
                if (p[i] == expr[rule_number][0][j]) {
                    p[i] = -2;              //&#x5220;&#x9664;&#x5DF2;&#x7ECF;&#x7528;&#x8FC7;&#x7684;&#x524D;&#x4EF6;
                }
            }
        }
        l = rule_Max - (u/count_num);
        printf("%d&#x3001; IF ",count);
        printf("%s", features[expr[rule_number][0][0]-1]);
        for (int i = 1;i < l;i++) {
            printf(" AND %s", features[expr[rule_number][0][i]-1]);
        }
        printf(" THEN %s\n", features[result - 1]);
        count++;                            //&#x89C4;&#x5219;&#x8BA1;&#x6570;&#x5668;
        p[count_num] = result;
        count_num++;
        if (match(p) == false && result <= 24) { printf("---------------------------------------------------\n"); printf("--------------------匹配结果-----------------------\n"); printf("没有匹配到动物\n"); return; } if (match(p)="=" false && result> 24) {
            printf("--------------------&#x5339;&#x914D;&#x7ED3;&#x679C;-----------------------\n");
            printf("&#x5339;&#x914D;&#x5230;&#x7684;&#x52A8;&#x7269;&#x662F;:%s\n", features[result - 1]);
            printf("\n");
            //&#x66F4;&#x65B0;&#x77E5;&#x8BC6;&#x5E93;
            printf("-------------------&#x66F4;&#x65B0;&#x77E5;&#x8BC6;&#x5E93;----------------------\n");
            interface(features[result - 1]);
            return;
        }
    }
        printf("&#x6CA1;&#x6709;&#x5339;&#x914D;&#x5230;&#x52A8;&#x7269;\n");
}

int main() {
    int chose;                      //&#x8BB0;&#x5F55;&#x8F93;&#x5165;&#x7684;&#x7279;&#x5F81;
    int k = 0;                      //&#x63A7;&#x5236;condition_chose&#x6570;&#x7EC4;
    int* p = condition_chose;       //&#x64CD;&#x4F5C;&#x9009;&#x9879;
    interface(NULL);                //&#x754C;&#x9762;
    while (scanf("%d",&chose)) {
        condition_chose[k] = chose;
        k++;
        count_num++;
    }
    inference(p);
    system("pause");
    return 0;
}</=></stdlib.h></stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#include"database.h"
#include"interface.h"
#include"rule.h"
#include<stdio.h>
#include<stdlib.h>

using namespace std;

int condition_chose[24];            //&#x9009;&#x62E9;&#x7684;&#x52A8;&#x7269;&#x7279;&#x5F81;
int count_num = 0;                  //&#x8BB0;&#x5F55;&#x8F93;&#x5165;&#x7279;&#x5F81;&#x4E2A;&#x6570;
int rule_Max = 4;                   //&#x89C4;&#x5219;&#x524D;&#x4EF6;&#x6700;&#x5927;&#x4E3A;4
int rule_number = -1;               //&#x5339;&#x914D;&#x89C4;&#x5219;&#x6807;&#x53F7;

//&#x5339;&#x914D;&#x89C4;&#x5219;&#x5DE6;&#x90E8;&#x5206;
bool match(int* p) {
    int k;
    int j;
    int count_elem = 0;
    int flag = 0;
    for (rule_number = 0;rule_number < getrule_NUM();rule_number++) {
        count_elem = 0;
        for (int j = 0;j < count_num;j++) {
            if (expr[rule_number][1][0] != -1) {
                count_elem++;
            }
            if (p[j] == expr[rule_number][1][0]) {
                flag++;
            }
        }
        if (flag == (count_elem / count_num)) {
            return true;
        }
        flag = 0;
    }
    return false;
}

//&#x627E;&#x5230;&#x7ED3;&#x8BBA;
void inference(int* p) {
    printf("--------------------&#x4F7F;&#x7528;&#x89C4;&#x5219;-----------------------\n");
    int u;
    int l;
    int result_count = 0;
    int count = 1;
    int result1;
    int result[4];          //&#x8BB0;&#x5F55;&#x7ED3;&#x8BBA;
    while (match(p)) {
        u = 0;
        for (int j = 0;j < rule_Max;j++) {
            result[j] = expr[rule_number][0][j];
        }
        result1 = expr[rule_number][1][0];
        for (int i = 0;i < count_num;i++) {
                if (expr[rule_number][1][0] == -1) {
                    u++;
                }
                if (p[i] == expr[rule_number][1][0]) {
                    p[i] = -2;              //&#x5220;&#x9664;&#x5DF2;&#x7ECF;&#x7528;&#x8FC7;&#x7684;&#x7ED3;&#x8BBA;
                }
        }
        l = rule_Max - (u / count_num);
        printf("%d&#x3001; IF ", count);
        printf("%s", features[expr[rule_number][0][0] - 1]);
        for (int i = 1;i < l;i++) {
            printf(" AND %s", features[expr[rule_number][0][i] - 1]);
        }
        printf(" THEN %s\n", features[result1 - 1]);
        //&#x63A8;&#x7406;&#x5F97;&#x5230;&#x7684;&#x524D;&#x4EF6;&#x52A0;&#x5165;&#x5230;p&#x4E2D;
        for (int k = count_num;k < count_num + 4;k++) {
            p[k] = result[result_count];
            result_count++;
        }
        result_count = 0;
        count_num = count_num + 4;
        if (match(p) == false) {
            printf("--------------------&#x5339;&#x914D;&#x7ED3;&#x679C;-----------------------\n");
            for (int o = 0;o < count_num;o++) {
                if (p[o] != -1 && p[o] != -2) {
                    printf("&#x5339;&#x914D;&#x5230;&#x7684;&#x52A8;&#x7269;&#x7279;&#x5F81;:%s\n", features[p[o] - 1]);
                }
            }
            printf("\n");
            return;
        }
    }
    printf("&#x6CA1;&#x6709;&#x6B64;&#x52A8;&#x7269;&#x7279;&#x5F81;\n");
}

int main() {
    int chose;                      //&#x8BB0;&#x5F55;&#x8F93;&#x5165;&#x7684;&#x7279;&#x5F81;
    int k = 0;                      //&#x63A7;&#x5236;condition_chose&#x6570;&#x7EC4;
    int* p = condition_chose;       //&#x64CD;&#x4F5C;&#x9009;&#x9879;
    interface(NULL);                //&#x754C;&#x9762;
    while (scanf("%d", &chose)) {
        condition_chose[k] = chose;
        k++;
        count_num++;
    }
    inference(p);
    system("pause");
    return 0;
}</stdlib.h></stdio.h>

测试数据:

正向推理:1 10 14 END

逆向推理:30 END

实验结果:

正向推理:

动物专家系统C实现【人工智能】建立相应的规则和简易数据库<正向推理和逆向推理>

逆向推理:

动物专家系统C实现【人工智能】建立相应的规则和简易数据库<正向推理和逆向推理>

Original: https://blog.csdn.net/weixin_50400808/article/details/122419563
Author: 粒粒米z
Title: 动物专家系统C实现【人工智能】建立相应的规则和简易数据库<正向推理和逆向推理>

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/649930/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球