生活随笔
收集整理的这篇文章主要介绍了
人工智能—产生式系统(专家系统)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
产生式系统
概念
产生式系统(production system)是指认知心理学程序表征系统的一种。为解决某一问题或完成某一作业而按一定层次联结组成的认知规则系统。
原理
产生式系统由规则库、推理机、综合数据库,控制程序四部分组成。其中,规则库里面存储大量的知识,综合数据库则是储存事实,综合数据库通过推理机根据规则库里面的知识,由控制程序的控制下完成推理,若是推出中间结果,则把中间结果放到综合数据库中,继续重新推理,直到推理出最终结果或推理失败,程序结束。
例子
下面我们就以交通工具识别系统为例,用java编写。
规则库:
R1:it_is(车),postive(体型小),postive(有轮子);
R2:it_is(飞机),postive(体型大),postive(流线型);
R3:it_is(飞机),postive(天上飞的);
R4:it_is(船),postive(水上游的);
R5:it_is(车),postive(地上跑的);
R6:trto_is(轮船),it_is(船),postive(体型大),postive(冒黑烟);
R7:trto_is(航天飞机),it_is(飞机),postive(有机翼);
R8:trto_is(直升机),it_is(飞机),postive(有螺旋桨);
R9:trto_is(汽车),it_is(车),postive(四个轮);
R10:trto_is(两轮车),it_is(车),postive(两个轮);
代码:
MainGui.java
该类为主界面类,调用GuiFrame类(自定义的类,代码在后面)显示主窗口。
package chanshengsi01
;import java
.awt
.Container
;
import java
.awt
.FlowLayout
;
import java
.awt
.event
.ActionEvent
;
import java
.awt
.event
.ActionListener
;
import java
.util
.ArrayList
;import javax
.swing
.JButton
;
import javax
.swing
.JFrame
;
import javax
.swing
.JLabel
;
import javax
.swing
.JTextField
;public class MainGUI {public static void main(String
[] args
) {GuiFrame g
=new GuiFrame("交通工具识别");}}
GuiFrame.java
该类主要实现主界面的布局,以及两个按钮的监听器。点击匹配按钮会调用Brain(自定义的类,代码在后面)类的identify函数,来根据输入到综合数据库的事实去匹配结果。点击查看规则按钮会调用GuiRules(自定义的类,代码在后面)显示出规则库里面的知识。
package chanshengsi01
;import java
.awt
.Container
;
import java
.awt
.FlowLayout
;
import java
.awt
.GridLayout
;
import java
.awt
.event
.ActionEvent
;
import java
.awt
.event
.ActionListener
;
import java
.util
.ArrayList
;import javax
.swing
.JButton
;
import javax
.swing
.JFrame
;
import javax
.swing
.JLabel
;
import javax
.swing
.JTextField
;public class GuiFrame extends JFrame {JButton button
;JButton button1
;JLabel label
;JLabel label_result
;JTextField textField1
;JTextField textField2
;JTextField textField3
;JTextField textField4
;Container contentPane
;public GuiFrame(String title
) {super(title
);this.setSize(330, 350);this.setLocation(350, 150);this.setDefaultLookAndFeelDecorated(true);this.setDefaultCloseOperation(JFrame
.EXIT_ON_CLOSE
);button
= new JButton("匹配");button
.setBounds(60, 168, 75, 30);button1
= new JButton("查看规则");button1
.setBounds(150, 168, 100, 30);label
= new JLabel("设置事实:");label
.setBounds(120, 2, 90, 50);label_result
= new JLabel("最终结果是:");label_result
.setBounds(60, 210, 200, 20);textField1
= new JTextField(16);textField1
.setBounds(55, 40, 200, 23);textField2
= new JTextField(16);textField2
.setBounds(55, 72, 200, 23);textField3
= new JTextField(16);textField3
.setBounds(55, 104, 200, 23);textField4
= new JTextField(16);textField4
.setBounds(55, 136, 200, 23);contentPane
= this.getContentPane();contentPane
.setLayout(null
);contentPane
.add(label
);contentPane
.add(textField1
);contentPane
.add(textField2
);contentPane
.add(textField3
);contentPane
.add(textField4
);contentPane
.add(button
);contentPane
.add(button1
);contentPane
.add(label_result
);button
.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e
) {ArrayList al
= new ArrayList();String str1
= textField1
.getText();if (!str1
.equals("")) {al
.add(str1
);}String str2
= textField2
.getText();if (!str2
.equals("")) {al
.add(str2
);}String str3
= textField3
.getText();if (!str3
.equals("")) {al
.add(str3
);}String str4
= textField4
.getText();if (!str4
.equals("")) {al
.add(str4
);}Brain brain
= new Brain();String result
= brain
.identify(al
);label_result
.setText("最终结果是:" + result
);setVisible(true);}});button1
.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e
) {GuiRules gt
=new GuiRules();}});this.setVisible(true);}
}
GuiRules.java
主要用于展示规则库的知识。
package chanshengsi01
;import java
.awt
.Container
;
import java
.util
.ArrayList
;import javax
.swing
.JFrame
;
import javax
.swing
.JLabel
;public class GuiRules extends JFrame {JLabel l
;String s
;Rules rule
;Rules
[] r
;Container contentPane
;GuiRules() {super("查看规则");this.setSize(400, 400);this.setLocation(800, 150);this.setDefaultLookAndFeelDecorated(true);contentPane
= this.getContentPane();contentPane
.setLayout(null
);rule
= new Rules();r
= new Rules[10];r
= rule
.RuleInit();int x
=0;for (int i
= 0; i
< 10; i
++) {ArrayList a
= r
[i
].getCondition();s
= "R"+i
+": "+(String
) a
.get(0);for (int j
= 1; j
< a
.size(); j
++) {s
= s
+ "+" + a
.get(j
);}s
=s
+"--->"+r
[i
].result
;l
=new JLabel(s
);l
.setBounds(20, x
, 300, 100);x
=x
+20;contentPane
.add(l
);}this.setVisible(true);}
}
Rules.java
规则库
package chanshengsi01
;
import java
.util
.ArrayList
;public class Rules {ArrayList condition
;String result
;int is_temp
;int is_use
= 0;Rules() {condition
= new ArrayList();}public int getIs_use() {return is_use
;}public void setIs_use(int is_use
) {this.is_use
= is_use
;}public int getIs_temp() {return is_temp
;}public void setIs_temp(int is_temp
) {this.is_temp
= is_temp
;}public ArrayList
getCondition() {return condition
;}public void setCondition(ArrayList condition
) {this.condition
= (ArrayList
) condition
.clone();}public String
getResult() {return result
;}public void setResult(String result
) {this.result
= result
;}public static Rules
[] RuleInit() {Rules
[] r
= new Rules[10];Rules rule0
= new Rules();r
[0] = rule0
;ArrayList c0
= new ArrayList();c0
.add("体型小");c0
.add("有轮子");r
[0].setCondition(c0
);r
[0].setResult("车");r
[0].setIs_temp(1);Rules rule1
= new Rules();r
[1] = rule1
;ArrayList c1
= new ArrayList();c1
.add("体型大");c1
.add("流线型");r
[1].setCondition(c1
);r
[1].setResult("飞机");r
[1].setIs_temp(1);Rules rule2
= new Rules();r
[2] = rule2
;ArrayList c2
= new ArrayList();c2
.add("天上飞的");r
[2].setCondition(c2
);r
[2].setResult("飞机");r
[2].setIs_temp(1);Rules rule3
= new Rules();r
[3] = rule3
;ArrayList c3
= new ArrayList();c3
.add("水上游的");r
[3].setCondition(c3
);r
[3].setResult("船");r
[3].setIs_temp(1);Rules rule4
= new Rules();r
[4] = rule4
;ArrayList c4
= new ArrayList();c4
.add("地上跑的");r
[4].setCondition(c4
);r
[4].setResult("车");r
[4].setIs_temp(1);Rules rule5
= new Rules();r
[5] = rule5
;ArrayList c5
= new ArrayList();c5
.add("体型大");c5
.add("冒黑烟");c5
.add("船");r
[5].setCondition(c5
);r
[5].setResult("轮船");r
[5].setIs_temp(0);Rules rule6
= new Rules();r
[6] = rule6
;ArrayList c6
= new ArrayList();c6
.add("飞机");c6
.add("有机翼");r
[6].setCondition(c6
);r
[6].setResult("航天飞机");r
[6].setIs_temp(0);Rules rule7
= new Rules();r
[7] = rule7
;ArrayList c7
= new ArrayList();c7
.add("飞机");c7
.add("有螺旋桨");r
[7].setCondition(c7
);r
[7].setResult("直升机");r
[7].setIs_temp(0);Rules rule8
= new Rules();r
[8] = rule8
;ArrayList c8
= new ArrayList();c8
.add("车");c8
.add("四个轮");r
[8].setCondition(c8
);r
[8].setResult("汽车");r
[8].setIs_temp(0);Rules rule9
= new Rules();r
[9] = rule9
;ArrayList c9
= new ArrayList();c9
.add("车");c9
.add("两个轮");r
[9].setCondition(c9
);r
[9].setResult("两轮车");r
[9].setIs_temp(0);return r
;}
}
Postive.java
综合数据库,用于接收用户输入的事实或者推理机产生的中间结果。
package chanshengsi01
;import java
.util
.ArrayList
;public class Postive {public ArrayList s1
;Postive() {s1
= new ArrayList();}public ArrayList
getS1() {return s1
;}public void setS1(ArrayList s1
) {this.s1
= (ArrayList
) s1
.clone();}public void delete() {this.s1
.clear();}
}
Brain.java
控制程序,控制推理机进行推理。
package chanshengsi01
;
import java
.util
.ArrayList
;public class Brain {GuiTemp gt
;public String
identify(ArrayList al
) {String result
= null
;Postive p
= new Postive();p
.setS1(al
);Check ch
= new Check();Rules rule
= new Rules();Rules
[] r
= new Rules[10];r
= rule
.RuleInit();int i
;for (i
= 0; i
< r
.length
; i
++) {if (r
[i
].getIs_use() == 0 && ch
.checkRule(r
[i
].getCondition(), p
.getS1()) == 1) {if (r
[i
].getIs_temp() == 0) {result
= r
[i
].getResult();break;} else {r
[i
].setIs_use(1);gt
= new GuiTemp(r
[i
]);p
.s1
.add(r
[i
].getResult());i
= 0;}}}if (i
>= r
.length
) {result
= "不认识";}return result
;}
}
Check.java
用于推理匹配,检查规则库中是否有符合的知识。
package chanshengsi01
;import java
.util
.ArrayList
;public class Check {public int checkRule(ArrayList a1
, ArrayList a2
) {int length1
= a1
.size();int length2
= a2
.size();for (int i
= 0; i
< length1
; i
++) {String s1
= (String
) a1
.get(i
);int j
;for (j
= 0; j
< length2
; j
++) {String s2
= (String
) a2
.get(j
);if (s1
.equals(s2
)) {break;}}if (j
>= length2
) {return 0;}}return 1;}
}
GuiTemp.java
用于显示中间结果,如果推理出中间结果,则显示出来。
package chanshengsi01
;import java
.awt
.Container
;
import java
.util
.ArrayList
;import javax
.swing
.JFrame
;
import javax
.swing
.JLabel
;public class GuiTemp extends JFrame {JLabel l1
;Container contentPane
;String s1
="";public GuiTemp(Rules r
) {super("推理出中间结果");this.setSize(200, 200);this.setLocation(800, 150);this.setDefaultLookAndFeelDecorated(true);contentPane
= this.getContentPane();contentPane
.setLayout(null
);ArrayList a
=r
.getCondition();s1
=(String
) a
.get(0);for(int i
=1;i
<a
.size();i
++) {s1
=s1
+"+"+a
.get(i
);}s1
=s1
+"--->"+r
.result
;l1
=new JLabel(s1
);l1
.setBounds(20, 20, 200, 100);contentPane
.add(l1
);this.setVisible(true);}
}
运行结果
主界面的截图
查看规则后截图:
匹配后截图
总结
以上是生活随笔为你收集整理的人工智能—产生式系统(专家系统)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。