简单动物识别系统(人工智能作业)

Main类

package com.company;

import java.util.Scanner;

public class Main {
	// write your code here
        //特征集与结果集初始化,用以输入输出
        static String Features[] = {"反刍","有蹄","哺乳类",
                "眼向前方","有爪","犬齿","吃肉","下蛋","能飞",
                "有羽毛","蹄类","食肉类","鸟类","有奶","毛发",
                "善飞","黑色白条纹","游泳","长腿","长脖子","黑条纹",
                "暗斑点","黄褐色","棕色皮毛"};

        static String Results[] = {"信天翁","企鹅","鸵鸟","斑马","长颈鹿","虎","豹","棕熊","哺乳动物","鸟","食肉动物","蹄类动物"};
        public static void main(String args[]){

            System.out.println("特征集如下");
            for(int n=0;n<Features.length;n++){
                System.out.println("特征"+(n+1)+":"+Features[n]);
            }
            //Rule[] rules = Rule.IntRules();//规则库初始化
            Facts factsDB = new Facts();
            Rule rules[];
            rules=Rule.IntRules();
            //输入特征选项 5,{14,22,20,19,2}
            int[] f = new int[25];
            Scanner input=new Scanner(System.in);//输入初始化

            while (true) {
                System.out.println("输入将要匹配的特征的数量(整数)");
                int FactNum=input.nextInt();//输入一个正整数
                factsDB.setFactNum(FactNum);
                System.out.println("对应上表,输入将要匹配的特征值(整数)");
                for(int k=0;k<FactNum;k++){
                    int feature=input.nextInt();//输入一个正整数
                    f[k] = feature;
                }
                /*f[0]=14;f[1]=22;f[2]=20;f[3]=19;f[4]=2;*/
                factsDB.setFacts(f);
                boolean isEnd = false;
                boolean findAns = false;
                while(!isEnd){
                    isEnd= true;
                    for(int i=0;i<rules.length;i++){
                        if(rules[i].isUsed() || !rules[i].isPossible()) continue;//该规则失效
                        int res = cmp(rules[i],factsDB);
                        if(res == 0){
                            continue;//不匹配
                        }else if(res == 1){
                            //匹配,但是为中间值
                            int[] facts=factsDB.getFacts();
                            int n = factsDB.getFactNum();
                            facts[n]=rules[i].getResultID();
                            factsDB.setFacts(facts);
                            factsDB.setFactNum(++n);
                            isEnd= false;
                            break;
                        }else if(res == 2){
                            //匹配,且为最终答案
                            System.out.println("结果是:"+Results[rules[i].getResultID()-1]);
                            findAns=true;
                            break;
                        }
                    }
                }
                if(!findAns){
                    System.out.println("无匹配答案");
                }
            }

        }

        public static int cmp(Rule r,Facts f){
            int F_Rule[] = r.getFacts();
            int F_Fact[]= f.getFacts();
            int factNum =f.getFactNum();

            for(int i=r.getNextFactPos();i<r.getFactNum();i++){
                boolean isMatch=false;
                for(int j=0;j<factNum;j++){
                    if(F_Rule[i] == F_Fact[j]){//匹配成功
                        if(i+1 == r.getFactNum()){//全部规则特征已匹配完毕
                            r.setUsed(true);
                            if(r.isEndResult()){
                                //是最终答案
                                return 2;
                            }else{
                                //中间特征
                                return 1;
                            }
                        }
                        //部分特征匹配成功,开始匹配下一个特征
                        isMatch=true;
                        break;
                    }else{
                        //不匹配,继续循环
                        continue;
                    }
                }
                if(isMatch){
                    //匹配成功
                    continue;
                }else{
                    //匹配失败
                    r.setNextFactPos(i);
                    return 0;
                }
            }
            //无匹配项
            return 0;
        }

}

Rule类

package com.company;

public class Rule {
    private int factNum;
    private int facts[];
    private boolean used;//是否使用
    private boolean possible;//是否可能
    private boolean endResult;
    private int resultID;
    private int nextFactPos;//记录下一次需验证的特征位置

    public Rule(int factNum,int[] facts,boolean endResult,int resultID){
        this.used=false;
        this.possible=true;
        this.factNum = factNum;
        this.facts=facts;
        this.endResult=endResult;
        this.resultID=resultID;
        this.nextFactPos=0;
    }


    public int getNextFactPos() {
        return nextFactPos;
    }


    public void setNextFactPos(int nextFactPos) {
        this.nextFactPos = nextFactPos;
    }


    public int getResultID() {
        return resultID;
    }
    public void setResultID(int resultID) {
        this.resultID = resultID;
    }
    public int getFactNum() {
        return factNum;
    }
    public void setFactNum(int factNum) {
        this.factNum = factNum;
    }
    public int[] getFacts() {
        return facts;
    }
    public void setFacts(int[] facts) {
        this.facts = facts;
    }
    public boolean isUsed() {
        return used;
    }
    public void setUsed(boolean used) {
        this.used = used;
    }
    public boolean isPossible() {
        return possible;
    }
    public void setPossible(boolean possible) {
        this.possible = possible;
    }
    public boolean isEndResult() {
        return endResult;
    }
    public void setEndResult(boolean endResult) {
        this.endResult = endResult;
    }
    //初始化规则库
    public static Rule[] IntRules(){
        Rule[] rules= new Rule[16];
        //以下为结果集
        //rule0
        int fact0[]={3,12,22,23};
        rules[0]=new Rule(4,fact0,true,7);//豹
        //rule1
        int fact1[]={3,12,21,23};
        rules[1]=new Rule(4,fact1,true,6);//虎
        //rule2
        int fact2[]={11,19,20,22};
        rules[2]=new Rule(4,fact2,true,5);//长颈鹿
        //rule3
        int fact3[]={11,21};
        rules[3]=new Rule(2,fact3,true,4);//斑马
        //rule4
        int fact4[]={17,19,20,13,9};
        rules[4]=new Rule(5,fact4,true,3);//鸵鸟
        //rule5
        int fact5[]={17,18,13,9};
        rules[5]=new Rule(4,fact5,true,2);//企鹅
        //rule6
        int fact6[]={16,13};
        rules[6]=new Rule(2,fact6,true,1);//信天翁
        //rule15
        int fact15[]={3,5,11,7,24};
        rules[15]=new Rule(5,fact15,true,8);//棕熊

        //以下为非结果集
        int fact7[]={15};
        rules[7]=new Rule(1,fact7,true,9);//哺乳动物

        int fact8[]={14};
        rules[8]=new Rule(1,fact8,true,9);//哺乳动物

        int fact9[]={10};
        rules[9]=new Rule(1,fact9,true,10);//鸟

        int fact10[]={8,9};
        rules[10]=new Rule(2,fact10,true,10);//鸟

        int fact11[]={7};
        rules[11]=new Rule(1,fact11,true,11);//食肉动物

        int fact12[]={4,5,6};
        rules[12]=new Rule(3,fact12,true,11);//食肉动物

        int fact13[]={2,3};
        rules[13]=new Rule(2,fact13,true,12);//蹄类动物

        int fact14[]={1,3};
        rules[14]=new Rule(2,fact14,true,12);//蹄类动物

        return rules;
    }

}
Facts类
package com.company;

public class Facts {

        private int factNum;
        private int facts[];

        //初始化
        Facts(){
            factNum=0;
            facts=new int[0];
        }

        public int getFactNum() {
            return factNum;
        }
        public void setFactNum(int factNum) {
            this.factNum = factNum;
        }
        public int[] getFacts() {
            return facts;
        }
        public void setFacts(int[] facts) {
            this.facts = facts;
        }





}

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值