人工智能动物识别系统C++ demo

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//表示特征的结构体
typedef struct tezheng
{
    int tzid;//特征id
    string tz;//特征
}tezheng;

//表示规则的结构体
typedef struct guize
{
    int tezhengnum;//规则所需特征数量
    int tezhengs[5];//规则所需所有特征id
    int result_id;//结果id
    bool endresult_if;//是否能推出最终结果
    bool use_if;//是否使用过
}guize;

vector<tezheng> TZK;//特征库
vector<tezheng> JGK;//结果库
vector<guize> rules;//规则库
vector<int> SS;//已知事实

//初始化特征库
void initK()
{
    tezheng TEMP;
    string tzs[]={"毛发","哺乳动物","产乳","羽毛","鸟类动物",
    "飞行","生蛋","吃肉","食肉动物","爪子",
    "利齿","眼睛前视","有蹄","有蹄动物","反刍",
    "黄褐色","深色斑点","黑色条纹","长腿","长颈",
    "白色","黑白色","不会飞","游水","善于飞"};
    string jgs[]={"猎豹","老虎","长颈鹿","斑马","鸵鸟","企鹅","海燕"};
    int num_count1=sizeof(tzs)/sizeof(tzs[0]);
    int num_count2=sizeof(jgs)/sizeof(jgs[0]);
    cout<<"可识别动物"<<endl;
    for(int i=0;i<num_count2;i++)
    {
        if((i+1)%5 ==0) cout<<endl;
        cout<<i+1<<"."<<jgs[i]<<" ";
    }


    cout<<endl<<"特征"<<endl;
    for(int i=0;i<num_count1;i++)
    {
        if((i+1)%5 ==0) cout<<endl;
        cout<<i+1<<"."<<tzs[i]<<" ";
    }
    //特征库初始化
    for(int i=0;i<num_count1;i++)
    {
        TEMP.tzid = i+1;
        TEMP.tz = tzs[i];
        TZK.push_back(TEMP);
    }
    //结果库初始化
    for(int i=0;i<num_count2;i++)
    {
        TEMP.tzid = i+1;
        TEMP.tz = jgs[i];
        JGK.push_back(TEMP);
    }
}

//初始化规则库
void initRule()
{
    int Rule_num = 15;
    guize G1;
    int r1[]={1,1,1,2,2,4,3,2,3,3,5,3,4,3,2};
    int r2[][5]={{1},{3},{4},{6,7},{2,8},{2,10,11,12},{2,13,14},{2,15},{9,16,17},{9,16,18},{14,16,17,19,20},{14,18,21},{5,19,20,23},{5,23,24},{5,25}};
    int r4[]={2,2,5,5,9,9,14,14,1,2,3,4,5,6,7};
    bool r5[]={false,false,false,false,false,false,false,false,true,true,true,true,true,true,true};
        for(int i=0;i<Rule_num;i++)
    {
        G1.tezhengnum = r1[i];
        for(int j=0;j<r1[i];j++)
        {
            G1.tezhengs[j]=r2[i][j];}
            G1.result_id = r4[i];
            G1.endresult_if = r5[i];
            G1.use_if = false;
            rules.push_back(G1);


    }

}

//更新事实库
void update(vector<int> a)//a:遍历规则后得到的数组
{
    int asize=a.size();
    for(int i=0;i<asize;i++)
    {
        SS.push_back(a[i]+1);
    }
    sort(SS.begin(), SS.end());
}

//匹配规则,将结论得到的id存储,进行事实库更新,return 0 代表未搜索到最终结果
int comparerules(vector<int> a,vector<int> b)//a:已知事实库 b:中间结果库
{
    int asize = a.size();
    int bsize = rules.size();
    for(int j=0;j< bsize;j++)//遍历规则
    {
        if(!rules[j].use_if)//未使用
        {
            int pos = 0;//匹配个数
            if(asize>=rules[j].tezhengnum)//足够规则数量
            {
                for(int k=0;k<rules[j].tezhengnum;k++)
                {
                    for(int i=0;i<asize;i++)
                    {
                       if(rules[j].tezhengs[k] == a[i])//匹配前提
                      {
                       ++pos;
                      }
                    }
                }

                  if( pos == rules[j].tezhengnum)//全部匹配
                   {

                     int x=rules[j].result_id-1;
                         rules[j].use_if=true;
                         if(rules[j].endresult_if)
                          {
                          cout<<"查找成功:"<<JGK[x].tz<<endl;
                          return 1;}
                          else{b.push_back(x);}
                   }
            }
        }
    }
    update(b);
    return 0;
}

int main()
{
    //初始化特征库 打印特征库 初始化结果库 打印结果
    initK();
    //初始化规则库
    initRule();
    cout<<endl<<"输入已知事实,0代表输入结束"<<endl;
    int inputss;
    while(cin>>inputss)//输入事实
    {
        if(inputss==0) break;
        else {int temp = inputss;SS.push_back(temp);}
    }
    sort(SS.begin(), SS.end());//排序
    bool exit_if = false;
    while(!exit_if)
    {
        //规则匹配
        int endresult=0;
        endresult=comparerules(SS,ZJ);
        if(!endresult)
        {
            cout<<"未能搜索到结果,已知事实如下:"<<endl;
            for (vector<int>::iterator it = SS.begin(); it != SS.end(); it++)
                {
                  cout << *it  << TZK[*it -1].tz << endl;
                }
            int patternif=1;
            while(patternif)
            {
            cout<<"请选择是否添加事实(y/Y or n/N):"<<endl;
            char addif;
            cin>>addif;
            if(addif=='n' || addif =='N') {cout<<"本次查找失败!"<<endl;exit_if=true;patternif=0;}
            else if(addif=='y' || addif =='Y')
            {
                patternif=0;
                cout<<"输入事实,0代表输入结束"<<endl;
                while(cin>>inputss)//输入事实
                {
                    if(inputss==0) break;
                    else {int temp = inputss;SS.push_back(temp);}
                }
                    sort(SS.begin(), SS.end());//排序
                    comparerules(SS,ZJ);
            }
            else cout<<"格式错误,请重新输入"<<endl;
            }

          }
          else{exit_if=true;}
    }
    return 0;
}
 

 

 

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
疫情统计与预测系统 1.基本要求: [1]编写一个新冠肺炎疫情统计与预测系统,实现对不同国家不同城市的疫情情况的管理,并根据前若干天的新增病例数及现存病例,预测当天的新增病例数。 [2]城市疫情信息包括:国家名称、城市名称、疫情数据(新增病例数、现有病例数、累计病例数、治愈病例数、死亡病例)以及新增病例的预测结果,疫情预测模型的辨识以及疫情的预测通过成员函数实现。 2.基本管理功能: [1]城市添加:增加一个城市,并输入(或从文件中读入)这个城市的所属国家及疫情数据。 [2]国家(城市)修改:修改已经选择的国家(城市)。 [3]国家(城市)删除:删除已经选择的国家(城市)。 [4]疫情预测:预测已选城市的新增病例数。 [5]打印功能:以表格形式打印全部城市疫情信息。 [6]统计功能:所有城市疫情数据可以分别按照新增病例数、现有病例数、累计病例数、治愈病例数、死亡病例数从高到低排序并打印,并可通过选择不同国家来查看该国家的所有城市累计疫情数据 新增病例数、现有病例数、累计病例数、治愈病例数、死亡病例)。 [7]信息保存:将全部城市疫情信息保存到不同的文件中(数据库文件或普通文本文件)。 3.其他要求及说明: [1]要求系统至少包含3个国家,每个国家至少包含10个城市,每个城市至少保存30天的数据,疫情信息可以上网查,也可自己输入合理数据。 [2]当日新增病例数采用时间序列方法预测,即根据前面n天的平均新增病例数x1, x2, …, xn预测当天的新增病例数y,即采用如下的预测模型: y = a0 + a1·x1 + a2·x2 + … + an·xn 其中系数a0, a1, a2, …, an需要根据历史数据,编写算法求得(可采用最小二乘法)。模型中的参数n要求大于10,可以设为固定值,也可以由用户自己设定。 [3]鼓励大家自己采用其他的预测模型。 [4]鼓励大家设计更多的系统功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值