热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用Python3实现的Mycin专家系统简单实例

1fromsysimportstderr2#########################3TRUE1#定义返回值4FALSE05FACT_LE
  1 from sys import stderr
2 #########################
3 TRUE = 1 #定义返回值
4 FALSE = 0
5 FACT_LENGTH = 9 #'''前提与结论总数'''
6 PRMS_LENGTH = 2 #'''每条规则的前提个数'''
7 PREMISE = 7 #'''前提数量'''
8 RULE_LENGTH = 4 #'''规则数量'''
9 LIMIT = 0.5 #'''结论阈值'''
10 AND = 1 #'''规则前提逻辑关系'''
11 OR = 0
12 VH = 0.9 #'''规则前提可信度初始化'''
13 H = 0.7
14 M = 0.5
15 #double Rule_CF[RULE_LENGTH]
16 Rule_CF = [0.0]*(RULE_LENGTH+1)
17 Str = ["E1", "E2", "E3", "E4", "E5",
18 "E6", "E7", "H1", "H", "\0"]
19 Fuzz = [None]*10
20 Input = [None]*PREMISE
21 Repeat = -111 #'''重新输入变量'''
22
23 #'''知识表达'''
24 Sign=[0,0,0,0,0,0,0,0,1]
25 Rulep=[[1,2,0],[4,5,0],[6,8,0],[3,7,0]]
26 Rulec=[[9,'AND'],[8,'AND'],[7,'AND'],[9,'OR']]
27 ##
28 def Max(a, b): # '''可信度计算'''
29 return a if a>b else b
30 def Min(a, b):
31 return b if a>b else a
32 def Mix(x, y):
33 return (x+y-x*y)
34
35 class fact(object): #'''定义事实类'''
36 def __init__(self,Num,NamInput):
37 self.Number=Num #'''事实编号'''
38 self.Active=False #'''记录事实的激活状态'''
39 self.CF=0 #'''事实可信度'''
40 self.SignNum=0 #'''输出标记'''
41 self.Name=NamInput #'''事实内容'''
42 def Fuzz(i): #'''定义可信度模糊函数'''
43 pass
44 ###
45 def Input(self,int):
46 pass
47 def GetName(self):
48 return self.Name
49 def GetNumber(self):
50 return self.Number
51 def GetAct(self):
52 return self.Active
53 def PutAct(self,Act):
54 self.Active=Act
55 def PutFunc(self,f):
56 self.Fuzz=f
57 def GetCF(self):
58 return self.CF
59 def PutCF(self,i):
60 if isinstance(i,int):
61 self.CF=self.Fuzz(i)
62 return self.CF
63 else:
64 self.CF=i
65 def PutSign(self,i):
66 self.Sign =i
67 def GetSign(self):
68 return self.Sign
69
70
71
72 class rule(object): #'''定义规则类'''
73
74 def GetConc():
75 return self.Conc
76 def GetName():
77 return self.Name
78 def __init__(self,P,C,Rule_CF_Val):
79 #'''构造规则函数'''
80 #print(P)
81 self.List=[None]*2
82 self.Name="Rule Name"
83 self.List[0]=P[0]
84 self.List[1]=P[1]
85 self.Logic=C[1]
86 self.COnc=C[0]
87 self.RCFi=Rule_CF_Val
88 self.Next=None
89
90
91
92 def __del__(self): #'''构造释放规则空间函数'''
93 #delete Name
94 #delete []List
95 pass
96
97 def Query(self): # '''构造推理函数'''
98 sign=0
99 temps=['']*10
100 choose=""
101 #fact* (*temp)=Fact
102 temp=Fact
103 while (sign<PRMS_LENGTH):
104 #for(;(*temp)!=NULL;temp=temp+1)
105 for index in range(len(temp)):
106 if(temp[index].GetNumber()==self.List[sign]): break
107 if(temp[index]==None): return FALSE
108 if(temp[index].GetAct()>0):
109 sign=sign+1
110 temp=Fact
111 else:
112 temp[index].Input(temp[index].GetNumber())
113 choose=input() #scanf("%s",choose)
114 # flushall()
115 print()
116 if choose.lower()=="q":
117 return TRUE
118 if str(int(choose))!= choose :
119 continue
120 if temp[index].PutCF(int(choose))==int(Repeat):
121 continue
122 temp[index].PutAct(TRUE)
123 for index in range(len(temp)):
124 if(temp[index].GetNumber()==self.Conc): break
125 if(temp[index]==None): return FALSE
126 temp[index].PutCF(Mix(temp[index].GetCF(),self.CF()))
127 temp[index].PutAct(1)
128 return FALSE
129
130 def CF(self): #'''构造可信度推理函数'''
131 if self.Logic:
132 i=Min(Fact[self.List[0]-1].GetCF(),Fact[self.List[1]-1].GetCF())
133 i=i*self.RCFi
134 return i
135
136
137 #################
138 ##
139 Fact=[fact]*FACT_LENGTH
140
141 #########################
142 def Init(): #'''初始化函数'''
143 DefFuncArray()
144 DefInput()
145 DefRule_CF()
146
147
148 def Input1(i):
149 print("按q或Q退出")
150 print("请输入事实:E[",i,"的可信度")
151 print("可信度为:")
152 print(" [1]高")
153 print(" [2]中")
154 print(" [3]低")
155
156 def Input2(i=3):
157 print("按q或Q退出")
158 print("请输入事实 E[",i,"]数值[30-45]:")
159
160 def Input3(i=4):
161 print("按q或Q退出")
162 print("请输入事实 E[",i,"]数值[60,160]:")
163
164 def Fuzz1(sign):
165 switcher = {
166 1: VH,
167 2: H,
168 3: M,
169 }
170 if(sign in switcher.keys()):
171 return switcher[sign]
172 else:
173 stderr.write("请重新输入!")
174 return Repeat
175
176
177 def Fuzz2(sign):
178 if sign<30 or sign>45:
179 stderr.write("请重新输入!")
180 return Repeat
181 i=(sign-37.0)/9.0
182 return i if i>0 else -i
183
184 def Fuzz3(sign):
185 if sign<60 or sign>160:
186 stderr.write("请重新输入!")
187 return Repeat
188
189 i=(sign-60.0)/100.0
190 return(i)
191
192 def DefFuncArray():
193 for i in range(4):
194 Fuzz[i]=Fuzz1
195 Fuzz[4]=Fuzz2
196 Fuzz[5]=Fuzz3
197
198 def DefInput():
199 for i in range(4):
200 Input[i]=Input1
201 Input[4]=Input2
202 Input[5]=Input3
203
204 #'''定义规则的可信度'''
205 def DefRule_CF():
206 Rule_CF[0]=0.9
207 Rule_CF[1]=1.0
208 Rule_CF[2]=0.9
209 Rule_CF[3]=0.9
210
211
212 def main():
213 #rule *Rule,*R
214 #int i=0
215 Init()
216 #while(*Str[i]) # '''激活事实对象集'''
217 for i in range(len(Fact)):
218 Fact[i]=fact((i+1),Str[i])
219 #print(Fact[i].GetName())
220 Fact[i].PutSign(Sign[i])
221 for s in range(PREMISE):
222 Fact[s].Input=Input[s]
223 Fact[s].PutFunc(Fuzz[s])
224
225 Rule=None
226 for i in range(RULE_LENGTH-1,-1,-1): #'''激活规则对象集'''
227 if(i<0): return FALSE
228 print(i)
229 R=rule(Rulep[i],Rulec[i],Rule_CF[i])
230 R.Next=Rule
231 Rule=R
232
233 R=Rule
234 while(True):
235 if(R.Query()): break
236 R=R.Next
237 if(not R): break
238
239 #for(i=0;i
240 for i in range(FACT_LENGTH):
241 if Fact[i].GetCF()>LIMIT and Fact[i].GetSign()==1:
242 Fact[i].PutSign(0)
243 print(" 结论为:")
244 print(Fact[i].GetName())
245 print(" 其可信度为:")
246 print(Fact[i].GetCF())
247
248 print("运行结束。")
249 input()
250 return TRUE
251
252 if __name__=='__main__':
253 main()
254

 


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
author-avatar
juliohong
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有