用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 ...
随机推荐
- 探索JavaScript中Null和Undefined的深渊
当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单,行为符合常识.但是,本文将更多聚焦独特的原始数据类型Null ...
- S0.3 直方图
目录 直方图(一) 直方图概念 直方图分类 直方图优点 直方图应用 opencv3直方图产生函数cvCalcHist() 画图函数 完整示例 直方图(一) 直方图概念 直方图是图像中像素强度分布的图形 ...
- C_输入一个整数N,输出从0~N(算法思考)
1.for循环实现 #include <stdio.h> #include <time.h> clock_t start, stop; double duration; voi ...
- timesten 修改最大连接数
修改完/var/Timesten/sys.odbc.ini里面的connections之后 重启TT:ttdaemonadmin -restart 报错:15019: Only the instanc ...
- (94)Wangdao.com_第二十七天_键盘事件
键盘事件 键盘事件由用户击打键盘触发 主要有 keydown.keyup .keypress三个事件,它们都继承了 KeyboardEvent 接口. keydown 按下键时 触发 ...
- js 改变只读属性的值
console.log(navigator.platform); // Win32 Object.defineProperty(navigator, 'platform', { value: 'cc' ...
- Sum It Up---(DFS)
Sum It Up Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- Linux命令 df du
df: 列出文件系统的整体磁盘使用量 du: 评估文件系统的磁盘使用量 $ df [-ahikHTm] [目录或文件名] 参数: -a: 列出所有的文件系统,包括系统特有的/proc 等文件系统 -k ...
- F#周报2019年第14期
新闻 发布F# 4.6 SAFE Stack v1.0 发布fable编译器2.2,Fable.Core 3及其它 发布ML.NET 1.0 RC Saturn:增加路由诊断页面 Visual Stu ...
- 一篇文章学懂Shell脚本,最简明的教程在这里
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...