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专家系统简单实例的更多相关文章

  1. python从入门到大神---4、python3文件操作最最最最简单实例

    python从入门到大神---4.python3文件操作最最最最简单实例 一.总结 一句话总结: python文件操作真的很简单,直接在代码中调用文件操作的函数比如open().read(),无需引包 ...

  2. Django学习笔记(一):环境安装与简单实例

    Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...

  3. Hibernate(二)__简单实例入门

    首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...

  4. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...

  5. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  6. 利用navicat创建存储过程、触发器和使用游标的简单实例

    利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报  分类: 数 ...

  7. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  8. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  9. vue路由的简单实例

    vue2.0 和 vue1.0 路由的语法还是有点稍微的差别,下面介绍一下vue-router 2的简单实例: <!DOCTYPE html> <html lang="en ...

随机推荐

  1. [POJ2054]Color a Tree (并查集+贪心)

    POJ终于修好啦 题意 和UVA1205是同一题,在洛谷上是紫题 有一棵树,需要给其所有节点染色,每个点染色所需的时间是一样的都是11.给每个点染色,还有一个开销“当前时间×ci×ci”,cici是每 ...

  2. Linux 上安装JDK

    JDK下载 下载 JDK Linux 版本(注意看自己安装 Linux 系统的位数,本人的是64位) 1.oracle 官网下载地址:jdk-7u80-linux-x64.gz(可能需要注册下载,嫌麻 ...

  3. ICL2019E

    https://www.codechef.com/ICL2019/problems/ICL1906  两个整数,[0,1e5]操作1是让两个数同时减1(只有都大于0的时候才可以用)操作2可以让一个数乘 ...

  4. swust oj 983

    利用二叉树中序及后序遍历确定该二叉树的先序序列 1000(ms) 10000(kb) 2606 / 4908 已知二叉树的中序和先序遍历可以唯一确定后序遍历.已知中序和后序遍历可以唯一确定先序遍历,但 ...

  5. day 23 二十三、对象方法,类方法,封装,绑定方法

    一.对象的特有名称空间 __init__方法会在实例化对象时被调用 1.会为实例化的对象形成空的名称空间 2.就是一个方法,可以被传参,在类名(实参)这种方式下调用并传参 __init__(self ...

  6. Lombok 介绍

    Lombok使用 介绍 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. IDEA中的安装 打开IDEA的Setting –> ...

  7. 《Zero MQ》

    原文链接 http://www.aosabook.org/en/zeromq.html ZeroMQ ZeroMQ 是一个消息系统,或者‘面向消息的中间件’.广泛应用于金融服务,游戏开发,嵌入式系统, ...

  8. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  9. IIS宿主WCF服务*.svc Mime类型映射

    经常会遇到由于.net安装组件缺失,导致发布wcf服务后,访问wcf报.svc请求类型不支持 简单方法就是添加删除程序,修改.net组件安装选项,勾选http激活即可: 或者手工添加映射处理程序 1. ...

  10. maven插件--assembly

    之前maven项目中使用assembly插件单独打包项目依赖包,项目只有一个模块也就一个pom,配置这个插件,一切很顺利.但是现在的项目复杂了,有parent有child,多模块.按照之前的做法怎么也 ...