《智能决策技术》实验报告.docx
《《智能决策技术》实验报告.docx》由会员分享,可在线阅读,更多相关《《智能决策技术》实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
《智能决策技术》实验报告
《智能决策技术》
实验报告册
2018-2019学年第1学期
班级:
信管151
学号:
*********
**************
授课教师:
杨丽华实验教师:
杨丽华
实验学时:
16实验组号:
1
信息管理系
实验一有事前信息的决策树技术的操作应用
实验类型:
验证性实验学时:
2
实验步骤:
某石油公司的决策人,打算投资开发某油田。
根据现有资料,预计这口油井有高产、低产两种不同状态,分别记为S1、S2。
高产可获利润400万元,而低产时将净亏损200万元,已知这两种情况出现的概率分别为:
P(S1)=0.6,P(S2)=0.4,一般来说,常见的地质结构有“好”、“中等”、“差”3种,分别记为C1、C2、C3,为判断该地区属于哪种结构,可作进一步勘测,勘测费用为10万元。
已知在不同的油井状态下,勘测结果为不同地质结构的概率如下,P(C1/S1)=0.7,P(C2/S1)=0.2,P(C3/S1)=0.1,P(C1/S2)=0.3,P(C2/S2)=0.1,P(C3/S2)=0.6,问:
应采取何种行动方案,才能获取最大收益?
重点利用全概率公式:
1
p(ck)=∑p(ck|sj)p(sk)
j=1
和贝叶斯公式:
p(s
j|ck)=
p(ck|sj)p(sj)
2
(k=1,2,3;j=1,2)
∑p(ck|sj)p(sj)
j=1
求后验概率部分,得出各方案在不同状态下的概率P(Sj/Ck),以求出最大期望值。
要求实验操作过程中,学生自己输入已有数据,并基于已知数据求出后验概率,然后求出不同方案的期望值,进行剪枝决策,得出最优方案。
具体过程如下:
Ø第一步:
将已知数据输入excel中,如下表所示。
油田开发决策
开发结果为高产油田是的利润(万元)
40
开发结果为低产油田是的亏损额(万元)
-200
据资料,油田高产概率为P(s1)
60%
据资料,油田低产概率为P(s2)
40%
勘测费用(万元)
-10
根据资料,不同状态油井的额各勘测结果:
高产油井被勘测为“结构好”的概率P(C1|s1)
0.7
高产油井被勘测为“结构中”的概率P(C2|s1)
0.2
高产油井被勘测为“结构差”的概率P(C3|s1)
0.1
低产油井被勘测为“结构好”的概率P(C1|s2)
0.3
低产油井被勘测为“结构中”的概率P(C2|s2)
0.1
低产油井被勘测为“结构差”的概率P(C3|s2)
0.6
第二步:
用贝叶斯公式计算各自然状态下的后验概率P(Sj│Ck),用概率论中的全概率公式计算勘测结果为Ck的概率P(Ck)。
由公式
p(s
j|ck)=
p(ck|sj)p(sj)
2
(k=1,2,3;j=1,2)
∑p(ck|sj)p(sj)
j=1
计算在不同勘测结果下、油井状态为高产或低产的后验概率。
由公式
1
p(ck)=∑p(ck|sj)p(sk)
j=1
计算勘测结果为Ck的概率P(Ck)
在相关的单元格中输入上述公式,其计算结果下表所示:
不同地质的概率:
“结构好”的概率P(C1)
=C12*C6+C15*C7
“结构中”的概率P(C2)
=C13*C6+C16*C7
“结构差”的概率P(C3)
=C14*C6+C17*C7
计算不同的勘测结果下出现不同状态的概率:
被勘测为“结构好”实为高产油井的概率P(s1|C1)
=C6*C12/C20
被勘测为“结构好”实为低产油井的概率P(s2|C1)
=1-C25
被勘测为“结构中”实为高产油井的概率P(s1|C2)
=C6*C13/C21
被勘测为“结构中”实为低产油井的概率P(s2|C1)
=1-C27
被勘测为“结构差”实为高产油井的概率P(s1|C3)
=C6*C14/C22
被勘测为“结构差”实为低产油井的概率P(s2|C3)
=1-C29
不同地质的概率:
“结构好”的概率P(C1)
0.54
“结构中”的概率P(C2)
0.16
“结构差”的概率P(C3)
0.3
计算不同的勘测结果下出现不同状态的概率:
被勘测为“结构好”实为高产油井的概率P(s1|C1)
0.78
被勘测为“结构好”实为低产油井的概率P(s2|C1)
0.22
被勘测为“结构中”实为高产油井的概率P(s1|C2)
0.75
被勘测为“结构中”实为低产油井的概率P(s2|C1)
0.25
被勘测为“结构差”实为高产油井的概率P(s1|C3)
0.2
被勘测为“结构差”实为低产油井的概率P(s2|C3)
0.8
Ø第三步:
构造决策树。
构造的决策树的结果如下图:
Ø第四步:
计算各方案的期望收益值
决策树中各方案的期望收益计算是从右向左进行的,首先考虑第二级决策,当勘测结果是“结构好”时,如果采取“不开发”方案,则期望收益为0;如果采取“开发”方案,则当自然状态为“高产”(其修正后的后验概率为0.78)时,收益为400,当自然状态为“低产”,(其修正后的后验概率为0.22)时,收益为-200,所以,“开发”方案的期望收益=400*0。
78+(-200)*0.22=268(万元)。
该值可以单元格P19中输入=V17*T17+V21*T21获得.
实验结果:
比较两种方案的期望收益,选择“开发”方案。
所以当勘测结果为“结构好”时,应选择“开发”方案,其期望收益为268万元(这里暂时未扣除勘测费用)。
前去“不开发”这
方案一分支,并在“结构好”的概率分支上标上期望收益为268万元。
同理可得,当勘测结果为“结构中等”时,应采取“开发”方案,其期望收益为250万元;当勘测结果为“结构差”时,应采取“不开发”方案,其期望收益为0(这里暂时均未扣除勘测费用)。
比较三个方案的期望收益,取期望收益最大的方案作为最优方案,在单元格D16中输入=MAX(G10,G14,G30)得到最大期望收益值为175万元,可见方案“先勘测”的期望收益最大,为最优方案。
因此,本实验的最优决策结果是:
先勘测,当勘测结果为“结构好”或“结构中等”时开发,当勘测结果为“结果差”时,不开发,该决策的期望收益为175万元。
实验二应用层次分析法进行多目标决策
实验类型:
验证性实验学时:
2
实验目的:
熟悉并应用层次分析方法对多方案进行优劣排序,从而使学生掌握综合定性和定量两种方法解决问题的思维方式。
实验步骤:
某公司打算增添一台新设备,现有三种不同型号的设备,P1,P2,P3供选择,选择设备主要考虑的要素是功能、价格和维护,你将如何选择?
Ø第一步、建立递阶层次结构模型
实验结果:
决策结果P2最优。
实验三成本预测决策支持系统的开发
实验类型:
设计性实验学时:
4
实验目的:
掌握基于统一结构的决策支持系统的开发,理解模型库的组织和存储。
实验步骤:
某企业经连续观察,发现其生产的某产品与每批投入的产品件数是线性相关的,15组统计数据如表1所示。
现该企业拟投入三批产品,每批投入的产品件数分别为4100(百件),5300(百件),25000(百件)企业希望通过建立成本预测决策支持系统,利用一元线性回归模型来帮助预测每批产品的成本(百元)。
序号
产品件数
产品成本
1
53
53.42
2
91
84.53
3
87
80.87
4
49
52.45
5
14
25.6
6
98
87.12
7
78
72.93
8
82
76.5
9
58
55.14
10
33
41
11
45
49.51
12
52
53.16
13
16
26.22
14
68
66.04
15
61
59.26
实验要求:
1、需要建立相关的数据库,模型库,要有人机交互界面。
1、可以使用两个模型:
最小二乘法模型及一元线性回归模型。
2、使用熟悉的程序语言进行成本预测决策支持系统的开发,
要求写出系统运行结构图,主要程序代码,运行结果。
Ø第一步:
在mysql数据库中创建数据表t_case
createtableifnotexistst_case(
idintauto_increment,
t_numint,
t_casedouble,
primarykey(id)
)engine=innodbcharset=utf8;
Ø第二步:
将表1的数据插入数据表t_case中
insertintot_case
values
(null,53,53.42),(null,91,84.53),(null,87,80.87),
(null,49,52.45),(null,14,25.6),(null,98,87.12),
(null,78,72.93),(null,82,76.5),(null,58,55.14),
(null,33,41),(null,45,49.51),(null,52,53.16),
(null,16,26.22),(null,68,66.04),(null,61,59.26);
Ø第三步:
在后端利用java实现最小二乘法模型(主要点这里的算法)
参考链接:
截图:
主要代码:
/**
*计算x的系数a
*@paramx,y
*@returna
*/
publicstaticdoublegetA(double[]x,double[]y){
intn=x.length;
return(n*pSum(x,y)-sum(x)*sum(y))/(n*sqSum(x)-Math.pow(sum(x),2));
}
/**
*计算常量系数b
*@paramx,y,a
*@returnb
*/
publicstaticdoublegetB(double[]x,double[]y,doublea){
intn=x.length;
returnsum(y)/n-a*sum(x)/n;
}
/**
*计算常量系数b
*@paramx,y
*@returnb
*/
publicstaticdoublegetC(double[]x,double[]y){
intn=x.length;
doublea=getA(x,y);
returnsum(y)/n-a*sum(x)/n;
}
//计算和值
privatestaticdoublesum(double[]ds){
doubles=0;
for(doubled:
ds)s=s+d;
returns;
}
//计算开平方和值
privatestaticdoublesqSum(double[]ds){
doubles=0;
for(doubled:
ds)s=s+Math.pow(d,2);
returns;
}
//计算x和y积的和值
privatestaticdoublepSum(double[]x,double[]y){
doubles=0;
for(inti=0;ireturns;
}
Ø第四步:
利用SSM框架实现该系统
上面的最小二乘法模型的java代码时写在util包中的LeastSquares类中,根据前一个步骤可以知道我们需要做的是先获取数据库中的数据,分别存在两个数组中,再以这两个数组为参数调用LeastSquares类中的方法获取x的系数a和常量系数b,这样我们就可以有一个模型为y=a*x+b;这样后台的逻辑就实现了;
主要代码:
(由于涉及到SSM框架的代码太多,所以只展示出调用获取系数的代码和实现预测的代码)
publicListgetList(){
returncaseMapper.getCaseList();//获取数据库中数据
}
publicDoublecount_case(Integernum){
Listlist=getList();
doublea[]=newdouble[list.size()];
doubleb[]=newdouble[list.size()];
for(inti=0;ia[i]=list.get(i).getTnum();
b[i]=list.get(i).getTcase();
}
doublea1=LeastSquares.getA(a,b);//调用方法获取x的系数
doubleb1=LeastSquares.getB(a,b,a1);//获取常量系数
doublec=a1*num+b1;//根据产品件数预测成本
returnc;
}
SSM框架的基本思路:
entity包中是一些实体包,一个类Case是对应的数据库中的Case表,也就是该实验的实验数据的表,另一个类ResponseResult是由于前端使用的ajax异步提交数据,而特此包装的一个类;
mapper包是一个操作数据库的包,一个接口CaseMapper定义了获取数据库中所有数据的方法,并在配置文件中CaseMapper.xml中定义了获取数据库数据的SQL语句;
service包是业务包,mapper包是获取了数据库中数据,但是具体的业务是需要在这里写的,例如此处具体实现业务的类CaseServiceImpl,定义了一个预测成本的方法,并实现它;
util包是工具包,也就是给其他包中的类使用的,例如这里具体最小二乘法的算法就是写在该包中的LeastSquares类中;
controller包是控制器包,主要是控制前端和业务层的关系,并返回前端数据的类;
还有就是一些SSM框架基本的配置文件,例如配置数据库连接的db.properties、配置数据源的spring_dao.xml、配置业务层的spring_service.xml、配置映射的spring_mvc.xml;
再就是最好前端的文件夹webapps,里面对应的html文件和一些使用到的js和css;
Ø第五步:
前端运行结果(由于重点不在前端,所以前端写的略微简单)
实验结果:
通过本次实验,了解了最小二乘法的算法模型。
最小二乘法即为一种数学优化技术。
它通过最小化误差的平方和寻找数据的最佳函数匹配。
利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
最小二乘法还可用于曲线拟合。
通过一元线性模型应用来理解最小二乘法。
通过该实验也进一步加深了SSM框架的了解。
SSM框架即为Spring+SpringMVC+Mybatis的开源框架整合的框架,常作为Web项目的框架。
利用这个框架写成的项目能有以下特性:
1、易于维护2、效率高3、可读性高;在该项目中主要点在于算法的独特,其他的点利用框架的概念是很容易就能实现的。
在数学角度上来说,有很多常用的算法或者模型;比如一元线性回归模型、最小二乘法模型、多元线性回归模型。
在实际开发中,这些是我们可能运用的算法,所以也是需要在平常去了解这方面的算法。
实验四专家系统开发工具CLIPS
实验类型:
综合性实验学时:
4
实验目的:
掌握专家系统的一般结构,熟悉专家系统开发工具CLIPS的语法和使用。
实验步骤:
Ø第一步:
下载并安装Clips软件
Ø第二步:
运行并熟悉Clips
CLIPS是一个专家系统,它用C语言编定。
全称是TheCLanguageIntegratedProductionSystem.它可以应用到很多的系统上MicrosoftWindows,Macintosh,
VAX11/780等。
事实上,由于CLIPS由C语言编写,所以理论上,只要有C语言的编绎器,我们可以将CLIPS移值到任何的系统上。
Clips常用指令:
(1)facts用于显示当前的事实。
(2)agenda用于显示当前可以执行的规则(并列出满足条件的事实)
(3)run当规则和事实都有了后,这个命令用来启用程序
(4)reset重新初始化事实,初始化后,会自动的给系统加上Fact-0号事实
(5)clear清除所有的规则和事实以及对象实例
(6)deftemplate定义模板,这个模板类似C语言中的Structure,用reset命令可以实例化模板
(7)deffacts-定义事实模板,实例化与(deftemplate)相同
Ø第三步:
实际运行一个专家系统
(1)导入文件File->Load
(2)打开文件并运行
(3)在事实库中可以看到显示的内容
(4)最后可以查看诊断结果
Ø第四步:
了解Clips其他窗口
实验结果:
在这次实验中,我了解了Clips这个强大的软件。
Clips是一个专家系统工具。
专家系统可以说是人工智能技术的一个重要分支。
Clips是一个基于C语言的集成生产系统。
目前在国内,Clips在商业方面的应用相对较少,大多数用于科研方面。
专家系统格式一个智能计算机程序系统,其内部含有大量的某个领域专家水平的知识经验,能利用人类专家的知识解决问题的方式来处理该领域问题。
也就是说,专家系统是一个具有大量的专门知识与经验,进而推理与判断,模拟人类专家的决策过程。
以便解决那些需要人类专家处理的复杂问题,简而言之,专家系统是一种模拟人类专家解决领域问题的计算机程序系统。
实验五专家系统的开发
实验类型:
设计性实验学时:
4
实验目的:
掌握专家系统的开发过程,掌握根据产生式规则绘制相应推理树的方法。
实验步骤:
Ø第一步:
明确实验目标
建立一个动物识别系统,用以识别虎、豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁等7种动物。
开发环境:
基于Eclipse的java语言的开发;
Ø第二步:
根据动物特征,建立以下个规则
R1:
if动物有毛发 then 动物是哺乳动物
R2:
if动物有奶 then 动物是哺乳动物
R3:
if动物有羽毛 then 动物是鸟
R4:
if动物会飞 and 会生蛋then 动物是鸟
R5:
if动物吃肉then动物是食肉动物
R6:
if动物有犀利牙齿and有爪and眼向前方
then动物是食肉动物
R7:
if动物是哺乳动物and有蹄then动物是有蹄类动物
R8:
if动物是哺乳动物and反刍then动物是有蹄类动物
R9:
if动物是哺乳动物and是食肉动物and有黄褐色and有暗斑点
then动物是豹
R10:
if动物是哺乳动物and是食肉动物and有黄褐色and有黑色条纹
then动物是虎
R11:
if动物是有蹄类动物 and有长脖子and有长腿and有暗斑点
then动物是长颈鹿
R12:
if动物是有蹄类动物and有黑色条纹then动物是斑马
R13:
if动物是鸟and不会飞and有长脖子and有长腿and有黑白二色
then动物是鸵鸟
R14:
if动物是鸟and不会飞and会游泳and有黑白二色
then 动物是企鹅
R15:
if动物是鸟and善飞then动物是信天翁
Ø第三步:
开发实验过程
1.实验架构
2.规则库部分
主要由两个数组构成,一个是条件数组,也就是“因”的数组;还有一个是结果数组,也就是“果”的数组。
这两个数组相同下标的的值是成对的,固定的因导致固定的果。
再根据条件数组的模式,给定一个开关的数组,也就是设置初始的条件都为空,都没有选择。
3.推理机部分
4.显示界面的实现
显示界面可以分为四块,第一块是可供选择的条件部分的显示,第二部分是通过鼠标选择之后的显示部分,第三部分是开始识别按钮的部分,第四部分是最后结果的显示部分。
显示界面代码部分展示:
识别结果的显示逻辑
5.显示界面的实现
实验结果
通过该实验,了解了专家系统不是一定需要通过Clips才能实现,其实通过例如java这样的编程语言也可以实现。
在这个实验中,最重要的有两个点,一个点是推理机的部分,在推理之前是有一个条件库和事实库的,这个条件库和事实库是根据长期以往的社会经验总结下来的,这是这个代码能实现的基本原理。
另一个就是前端利用AWT部分实现的面板以及一些标签。
通过这些代码,用户可以直接看出识别的结果,不用像Clips这个软件通过复杂的操作才能看到结果,在操作上也简单了很多,不用像Clips那样需要在类似控制台的地方去输入条件,可以通过前端的方法去选择条件,可以更直接的显示,不用像Clips那样那么复杂。
实验总结(手写):