1、 2目的和意义 (1)加深理解专家系统的结构及开发过程。(2)初步掌握知识获取的基本方法。(3)掌握产生式规则知识表示方法及其编程实现方法。(4)初步掌握知识库的组建方法。3系统的主要内容和功能 系统主要以问答的形势询问病情症状,操作者只需要回答YES或NO。当一趟询问完成后,系统会基于以上询问得出的事实推理出最终的诊断结果。 功能见以下截图1、2. 图1 问询界面 图2 诊断结果界面 4设计流程及描述1) 需求分析 本设计需要用高级语言编写框架及调用外部的规则库与知识库。方便起见,用java语言编写框架,用XML文件保存。2) 知识获取与知识表示知识获取通过医学临床专业的同学及医学诊断专业书
2、籍,确保专家系统的专家性。知识的表示采用的是xml语言,把事实与规则一条条保存。3) 知识库的组建 知识库分事实库和规则库组建。疾病诊断因为有的病有交叉的症状,所以逻辑上,从症状到诊断的过程是对一颗二叉树的搜索,当问题回答的是YES时,就进行深度优先搜索,当回答NO时,就转到兄弟节点。对于无关的疾病,则回到根节点重新对下一颗子树进行搜索。得到一种疾病的确诊就是result,得到这个叶子节点前遍历过的节点组成了reasons.4) 推理机制选择/编制 采用的是问题引导式推理。在规则库里写的其实不是真正的规则。真正的规则蕴含在问题及前提里。为了不让“专家”问无用的问题,每个问题都是以某个问题的答案
3、为前提的。这样组成了内部的因果关系,所以真正的推理规则只与某一趟提问的最后一个问题的答案得出的事实有关。5) 程序清单package 专家系统_V2;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import javax.swing.JButton;im
4、port javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.border.LineBorder;public class MainFrame extends JFrame /* * 主界面类 * param args */ public static void main(String args) MainFrame main = new MainF
5、rame(); main.myShow(); private void myShow() exe = new Execution(); exe.init(); this.setTitle(exe.expert_name+专家系统); this.setSize(380, 250); this.setDefaultCloseOperation(3); this.setResizable(false); this.setLocationRelativeTo(null); this.setLayout(new BorderLayout(); JPanel jp_center = new JPanel(
6、); jp_center.setBackground(Color.white); jp_center.setPreferredSize(new Dimension(380,250); jp_center.setLayout(null); jl = new JLabel(); jl.setText(请回答下列问题: jl.setFont(new Font(Font.DIALOG,Font.BOLD,25); jl.setForeground(Color.blue); jl.setBounds(10, 10, 200, 30); jta=new JTextArea(); JScrollPane j
7、s=new JScrollPane(jta); jta.setEditable(false); jta.setBorder(new LineBorder(Color.black); jta.setLineWrap(true); jta.setFont(new Font(Font.DIALOG,Font.BOLD,20); js.setBounds(20, 50, 330, 100); jb1 = new JButton(YES jb1.setBounds(100, 170, 60, 30); jb1.addActionListener(l); jb2 = new JButton(NO jb2.
8、setBounds(200, 170, 60, 30); jb2.addActionListener(l); jp_center.add(jl); jp_center.add(js); jp_center.add(jb1); jp_center.add(jb2); this.add(jp_center,BorderLayout.CENTER); problem=this.initProblem(); this.setVisible(true); private Problem initProblem() for(int i=0;iexe.problems.size();i+) Problem
9、problem = exe.problems.get(i); if(problem.getPremise()=null|problem.getPremise().isIstrue() if(problem.getPremise()!=null) problem.getPremise().setIstrue(false); jta.setText(problem.getContext(); exe.problems.remove(problem); return problem; jb1.setEnabled(false); jb2.setEnabled(false); return null;
10、 private Execution exe; private JButton jb1,jb2; private JTextArea jta ; private JLabel jl; private Problem problem; private Action l = new Action(); class Action implements ActionListener public void actionPerformed(ActionEvent e) if(.equals(e.getActionCommand() if(null!=problem.getAnswer_YES() pro
11、blem.getAnswer_YES().setIstrue(true); else if( System.out.println(aaa=problem.getAnswer_NO() System.out.println( problem.getAnswer_NO().setIstrue(true); exe.allReasoning(); problem=initProblem(); if(problem=null) ArrayList facts=exe.start(); String result=; for(int i=0,n=1;facts.size(); String des =
12、 facts.get(i).getDescribe(); if(!null.equals(des) result+=i+1+.+des+n n+; jl.setText(推理结果如下: jta.setText(result); jb1.setEnabled(false); jb2.setEnabled(false); return; import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import .URLDecoder;import java.util.HashMap;import javax.swing.JOptionPane;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import or