用Python3实现的Mycin专家系统简单实例
from sys import stderr
#########################
TRUE = 1 #定义返回值
FALSE = 0
FACT_LENGTH = 9 #'''前提与结论总数'''
PRMS_LENGTH = 2 #'''每条规则的前提个数'''
PREMISE = 7 #'''前提数量'''
RULE_LENGTH = 4 #'''规则数量'''
LIMIT = 0.5 #'''结论阈值'''
AND = 1 #'''规则前提逻辑关系'''
OR = 0
VH = 0.9 #'''规则前提可信度初始化'''
H = 0.7
M = 0.5
#double Rule_CF[RULE_LENGTH]
Rule_CF = [0.0]*(RULE_LENGTH+1)
Str = ["E1", "E2", "E3", "E4", "E5",
"E6", "E7", "H1", "H", "\0"]
Fuzz = [None]*10
Input = [None]*PREMISE
Repeat = -111 #'''重新输入变量''' #'''知识表达'''
Sign=[0,0,0,0,0,0,0,0,1]
Rulep=[[1,2,0],[4,5,0],[6,8,0],[3,7,0]]
Rulec=[[9,'AND'],[8,'AND'],[7,'AND'],[9,'OR']]
##
def Max(a, b): # '''可信度计算'''
return a if a>b else b
def Min(a, b):
return b if a>b else a
def Mix(x, y):
return (x+y-x*y) class fact(object): #'''定义事实类'''
def __init__(self,Num,NamInput):
self.Number=Num #'''事实编号'''
self.Active=False #'''记录事实的激活状态'''
self.CF=0 #'''事实可信度'''
self.SignNum=0 #'''输出标记'''
self.Name=NamInput #'''事实内容'''
def Fuzz(i): #'''定义可信度模糊函数'''
pass
###
def Input(self,int):
pass
def GetName(self):
return self.Name
def GetNumber(self):
return self.Number
def GetAct(self):
return self.Active
def PutAct(self,Act):
self.Active=Act
def PutFunc(self,f):
self.Fuzz=f
def GetCF(self):
return self.CF
def PutCF(self,i):
if isinstance(i,int):
self.CF=self.Fuzz(i)
return self.CF
else:
self.CF=i
def PutSign(self,i):
self.Sign =i
def GetSign(self):
return self.Sign class rule(object): #'''定义规则类''' def GetConc():
return self.Conc
def GetName():
return self.Name
def __init__(self,P,C,Rule_CF_Val):
#'''构造规则函数'''
#print(P)
self.List=[None]*2
self.Name="Rule Name"
self.List[0]=P[0]
self.List[1]=P[1]
self.Logic=C[1]
self.Conc=C[0]
self.RCFi=Rule_CF_Val
self.Next=None def __del__(self): #'''构造释放规则空间函数'''
#delete Name
#delete []List
pass def Query(self): # '''构造推理函数'''
sign=0
temps=['']*10
choose=""
#fact* (*temp)=Fact
temp=Fact
while (sign<PRMS_LENGTH):
#for(;(*temp)!=NULL;temp=temp+1)
for index in range(len(temp)):
if(temp[index].GetNumber()==self.List[sign]): break
if(temp[index]==None): return FALSE
if(temp[index].GetAct()>0):
sign=sign+1
temp=Fact
else:
temp[index].Input(temp[index].GetNumber())
choose=input() #scanf("%s",choose)
# flushall()
print()
if choose.lower()=="q":
return TRUE
if str(int(choose))!= choose :
continue
if temp[index].PutCF(int(choose))==int(Repeat):
continue
temp[index].PutAct(TRUE)
for index in range(len(temp)):
if(temp[index].GetNumber()==self.Conc): break
if(temp[index]==None): return FALSE
temp[index].PutCF(Mix(temp[index].GetCF(),self.CF()))
temp[index].PutAct(1)
return FALSE def CF(self): #'''构造可信度推理函数'''
if self.Logic:
i=Min(Fact[self.List[0]-1].GetCF(),Fact[self.List[1]-1].GetCF())
i=i*self.RCFi
return i #################
##
Fact=[fact]*FACT_LENGTH #########################
def Init(): #'''初始化函数'''
DefFuncArray()
DefInput()
DefRule_CF() def Input1(i):
print("按q或Q退出")
print("请输入事实:E[",i,"的可信度")
print("可信度为:")
print(" [1]高")
print(" [2]中")
print(" [3]低") def Input2(i=3):
print("按q或Q退出")
print("请输入事实 E[",i,"]数值[30-45]:") def Input3(i=4):
print("按q或Q退出")
print("请输入事实 E[",i,"]数值[60,160]:") def Fuzz1(sign):
switcher = {
1: VH,
2: H,
3: M,
}
if(sign in switcher.keys()):
return switcher[sign]
else:
stderr.write("请重新输入!")
return Repeat def Fuzz2(sign):
if sign<30 or sign>45:
stderr.write("请重新输入!")
return Repeat
i=(sign-37.0)/9.0
return i if i>0 else -i def Fuzz3(sign):
if sign<60 or sign>160:
stderr.write("请重新输入!")
return Repeat i=(sign-60.0)/100.0
return(i) def DefFuncArray():
for i in range(4):
Fuzz[i]=Fuzz1
Fuzz[4]=Fuzz2
Fuzz[5]=Fuzz3 def DefInput():
for i in range(4):
Input[i]=Input1
Input[4]=Input2
Input[5]=Input3 #'''定义规则的可信度'''
def DefRule_CF():
Rule_CF[0]=0.9
Rule_CF[1]=1.0
Rule_CF[2]=0.9
Rule_CF[3]=0.9 def main():
#rule *Rule,*R
#int i=0
Init()
#while(*Str[i]) # '''激活事实对象集'''
for i in range(len(Fact)):
Fact[i]=fact((i+1),Str[i])
#print(Fact[i].GetName())
Fact[i].PutSign(Sign[i])
for s in range(PREMISE):
Fact[s].Input=Input[s]
Fact[s].PutFunc(Fuzz[s]) Rule=None
for i in range(RULE_LENGTH-1,-1,-1): #'''激活规则对象集'''
if(i<0): return FALSE
print(i)
R=rule(Rulep[i],Rulec[i],Rule_CF[i])
R.Next=Rule
Rule=R R=Rule
while(True):
if(R.Query()): break
R=R.Next
if(not R): break #for(i=0;i<FACT_LENGTH;i++) '''给出结论'''
for i in range(FACT_LENGTH):
if Fact[i].GetCF()>LIMIT and Fact[i].GetSign()==1:
Fact[i].PutSign(0)
print(" 结论为:")
print(Fact[i].GetName())
print(" 其可信度为:")
print(Fact[i].GetCF()) print("运行结束。")
input()
return TRUE if __name__=='__main__':
main()
用Python3实现的Mycin专家系统简单实例的更多相关文章
- python从入门到大神---4、python3文件操作最最最最简单实例
python从入门到大神---4.python3文件操作最最最最简单实例 一.总结 一句话总结: python文件操作真的很简单,直接在代码中调用文件操作的函数比如open().read(),无需引包 ...
- Django学习笔记(一):环境安装与简单实例
Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...
- Hibernate(二)__简单实例入门
首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- 修改js confirm alert 提示框文字的简单实例
修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...
- 利用navicat创建存储过程、触发器和使用游标的简单实例
利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报 分类: 数 ...
- 【转】Android Https服务器端和客户端简单实例
转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- vue路由的简单实例
vue2.0 和 vue1.0 路由的语法还是有点稍微的差别,下面介绍一下vue-router 2的简单实例: <!DOCTYPE html> <html lang="en ...
随机推荐
- css 绘制三角形
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java遍历List中的map的几种方法
Student 类 public class Student { private String name; private int age; private int taller; public St ...
- NIOS_UART
1.Fifoed avalon UART带缓冲区,使用非常方便,google下载,google上有的技术资料,百度上找不到,以为没有这个事情: 2.两种UART如果想用操作寄存器的方式操作,需要在al ...
- Linux下提权常用小命令
有些新手朋友在拿到一个webshell后如果看到服务器是Linux或Unix操作系统的就直接放弃提权,认为Linux或Unix下的提权很难,不是大家能做的,其实Linux下的提权并没有很多人想象的那么 ...
- 邮局 100分代码(dfs+多重剪枝)
蓝桥杯真题-邮局 #include<iostream> #include<algorithm> #include<set> #include<string&g ...
- 关于JQuery中$.get()和$.post()和$.ajax()的区别和使用
首先,这三个方法都是Ajax方法中一种与服务器交换数据的请求类型. 一.$.get() $.get() 方法使用 HTTP GET 请求从服务器加载数据. 使用格式: $.get(url,[data] ...
- Express全系列教程之(三):get传参
一.关于get请求 一般在网站开发中,get都用作数据获取和查询,类似于数据库中的查询操作,当服务器解析前台资源后即传输相应内容:而查询字符串是在URL上进行的,形如: http://localhos ...
- Nginx的upstream反向代理、负载均衡详解
这篇文章的前提是已经配置好了NGINX,而且tomcat已经配置好了,而且能能够访问了. 说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式. 正向代理最大的特点是客户端非常明 ...
- build.xml编译报错Specified VM install not found: type Standard VM, name jdk1.7.0_45
build.xml编译打包时报错: 解决方法: build.xml —— 右键 —— Run As —— External Tools Configuration 在这个页面的顶端就会看到有红叉 ...
- Elasticsearch学习笔记(九)partial update
一.什么是partial update? PUT /index/type/id,创建文档&替换文档,就是一样的语法 一般对应到应用程序中,每次的执行流程基本是这样的: (1)应用程序先发起一个 ...