模糊推理系统
一、模糊推理系统的概念
1、是一种以模糊判断为前提,运用模糊语言规则,推出一个新的近似的模糊判断结论的方法。
2、模糊逻辑推理是一种不确定性的推理方法,其基础是模糊逻辑,它是在二值逻辑三段论的基础上发展起来的。
3、前期缺乏现代形式逻辑中的性质,理论上不够完善。但是这种推理方法得到的结论与人的思维一致或相近,在应用实践中证明是有用的。许多学者在模糊逻辑和模糊推理的性质方面展开了卓有成效的研究。
二、模糊推理系统的设计方法
设计模糊逻辑推理系统的基本步骤:
- 确定输入/输出的模糊子集及其论域
- 选择控制规则
- 规则的关系运算(蕴含,合成)
- 精确化过程
接下来,以课程作业为例。我选择了一个模糊洗衣机控制系统的模拟
设计推理系统的步骤:
- 确定输入/输出的模糊子集以及论域
该系统中,设计了一个衣服上的油污、污渍的参数,
污泥{SD(污泥少), MD(中等污泥), LD(污泥多)}
油脂{NG(无油脂), MG(中等油脂), LG(油脂多)}
控制对象是洗衣机的洗涤时间,论域:[0, 60] 。
输入是被洗衣物的污泥和油脂,论域:[0, 100]
输出的是洗衣机的洗涤时间:
洗涤时间{VS(很短), S(短), M(中等), L(长), VL(很长)} - 选择控制规则
- 规则的运算关系
污泥、污渍以及洗涤时间的隶属度函数的解析表达式如下:
- 精确化过程
通过最大隶属度函数来计算模糊控制输出的量化值
代码:
操作系统:Mac OX 编译环境:Sublime Text3 计算机语言:C++
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
/**
设计一个洗衣机的模糊推理系统
人工智能ppt2中的洗衣机控制系统
洗涤时间的论域 0-60
油污以及灰尘的论域 0-100
输入格式:油污 Oil(S:少 M:中等 L:大量) 污渍 Stain(S:少 M:中等 L:大量)
输出格式: 洗涤时间 time(VS,S,M,L,VL)
**/
// 定义油污以及污渍的全局变量
#define OIL 100.0
#define Stain 100.0
struct elem
{
double oil;
double stain;
int result;
};
// 三个隶属度函数,用来计算污渍的隶属度.1代表SD,2代表MD,3代表LD
double ruleMD(double stain){
if(stain<0||stain>100) return 0.0; // 当返回的参数不在论域中时,返回错误
else {
// 当传入的参数在0-100之间时,该处有两种情况
double result;
if(stain>=0&&stain<=50)
// 计算MD的结果,并且和同参数下的SD结果相比较,得出一个结果
return stain/50.0;
else {
// 同上的操作,得出结果和同参数下的LD相比较
return (100-stain)/50;
}
}
}
double ruleSD(double stain){
// SD部分的rule
// 当输入的参数0<=x<=50,执行该方法
double result = (50-stain)/50.0;
double returnMDresult = ruleMD(stain);
// 传参数到MD中,计算,并比较
// 1、相同,则返回结果为SD,2、SD的结果大,则返回SD,3、MD的结果大,则返回MD的返回值
if(result<returnMDresult)
return 2.0;
else return 1.0;
}
double ruleLD(double stain ){
// LD部分的rula
// 当输入的参数在50-100之间时,执行
// 同时将参数传入给MD,同时比较MD方法传回来的参数和该方法求出的值相比较,求出最后的最适合的预测值
double returnMDresult = ruleMD(stain);
double result = (stain - 50) / 50.0;
// 比较后,得到预测值
if(result<returnMDresult)
return 2.0;
else return 3.0;
}
double ruleMG(double oil){
// 当传入的参数在0-100之间时,该处有两种情况
if(oil<0||oil>100) return 0; // 当在论域之外时,直接返回无结果
else {
double result;
if(oil>=0&&oil<=50)
// 计算MD的结果,并且和同参数下的SD结果相比较,得出一个结果
return oil/50.0;
else {
// 同上的操作,得出结果和同参数下的LD相比较
return (100-oil)/50;
}
}
}
// 三个隶属度函数,用来计算油污的隶属度,1代表SG,2代表MG,3代表LG
double ruleSG(double oil){
if(oil<0||oil>50)return 0.0;
else {
// SG部分的rule
// 当输入的参数0<=x<=50,执行该方法
double result = (50-oil)/50.0;
double returnMGresult = ruleMG(oil);
// 传参数到MD中,计算,并比较
// 1、相同,则返回结果为SD,2、SD的结果大,则返回SD,3、MD的结果大,则返回MD的返回值
if(result<returnMGresult)
return 2.0;
else return 1.0;
}
}
double ruleLG(double oil){
// LD部分的rula
// 当输入的参数在50-100之间时,执行
// 同时将参数传入给MG,同时比较MG方法传回来的参数和该方法求出的值相比较,求出最后的最适合的预测值
double returnMGresult = ruleMG(oil);
double result = (oil - 50) / 50.0;
// 比较后,得到预测值
if(result<returnMGresult)
return 2.0;
else return 3.0;
}
// F函数,总的函数,从该函数中分流到rule的三个函数中
int Function(double oil,double stain){
/** VS: SD,SG
S: MD,SG
M: SD,MG MD,MG LD,SG
L: SD,LG MD,LG LD,MG
XL: LD,LG
**/
// 根据规则输出最后的洗涤时间
double result_D,result_G;
// 需要客户的正确输入
if(oil<0||oil>OIL||stain<0||stain>Stain) return 0.0;
else {
// 根据参数的大小,分别传送给各个rula
if(oil>=0&&oil<=50) result_G = ruleSG(oil);
else result_G = ruleLG(oil);
if(stain>=0&&stain<=50) result_D = ruleSD(stain);
else result_D = ruleLD(stain);
// 比较最后的结果
if(result_D==1.0&&result_G==1.0) return 1; // return VS
else if(result_G==1.0&&result_D==2.0) return 2; // return S
else if((result_D==1.0&&result_G==2.0)||(result_G==2.0&&result_D==2.0)||(result_G==1.0&&result_D==3.0)) return 3; // return M
else if((result_D==1.0&&result_G == 3.0)||(result_D == 2.0&&result_G==3.0)||(result_D==3.0&&result_G==2.0)) return 4;
else if(result_G==3.0&&result_D==3.0) return 5;
}
}
int main(int argc, char const *argv[])
{
/* code */
elem element[10]={{20.0,20.0,0},{20.0,30.0,0},{25.0,25.0,0},{30.0,30.0,0},{30.0,20.0,0},{65.0,77.0,0},{20.0,80.0,0},{80.0,80.0,0},{49.0,30.0,0},{50.0,50.0,0}};
// 输入参数oil,stain
for(int i=0;i<10;i++){
element[i].result = Function(element[i].oil,element[i].stain);
printf("油污:%.1lf 污渍:%.1lf 要进行的洗涤时间为:", element[i].oil,element[i].stain);
switch(element[i].result){
case 1:printf("VS\n");break;
case 2:printf("S\n");break;
case 3:printf("M\n");break;
case 4:printf("L\n");break;
case 5:printf("VL\n");break;
}
}
return 0;
}
运算结果: