用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 ...
随机推荐
- 15树莓派安装图形界面截图工具Shutter
2017-09-27 13:02:54 参数-添加/删除软件-搜索软件名称“shutter”,勾选,点击“应用”,等待安装完成后点击“确定”.(需下载安装包后安装) 补充:更多截图软件可以https: ...
- springboot 使用 swagger2
段时间,同事分享了一下 swagger-ui,于是自己尝试了一下.大致的使用过程这里记录一下: 1.添加依赖 <!--swagger-ui--><dependency> < ...
- Mac_安装Homebrew以及Maven
Mac OSX上的软件包管理工具,安装软件或者卸载软件. 打开终端输入(如不行,可参考homebrew官网): ruby -e "$(curl -fsSL https://raw.githu ...
- HTML入门2
开始将注意力转移到具体的元素里和页面了. 在页面加载完成的时候,标签head里的内容不会显示出来,包含了页面的title和css样式以及一些元素据信息,比如作者,描述文档,下面将具体分析html文档里 ...
- mapState ,mapGetters ,mapMutations,mapActions
参考 http://www.imooc.com/article/14741
- Unity进阶----AssetBundle_01(2018/10/30)
AssetBundle作用和定义 1).AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载: 2).AssetBundle自身保存着互相的依赖关系 ...
- ALM 中查看某个 test 的更改 history 历史
ALM 中要查看某个 test 更改历史, 需要下面两个表: AUDIT_LOG and AUDIT_PROPERTIES ------- Get Test modification history ...
- 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序
1:访问修饰符 private 同类中 默认 同类 同包 protect 同类 同包 子类 public 同类 ...
- CGI的工作原理
文章摘自https://blog.csdn.net/nyist327/article/details/41049699 CGI是Web服务器和外部程序之间的一个接口.利用CGI程序可以处理从Web上客 ...
- static与volatile的用法
static 1.概述 static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别 ...