模糊逻辑基本原理与编程

本文介绍了模糊逻辑的基本原理,包括模糊集合和模糊逻辑的概念,并提供了模糊逻辑的C语言编程实例,涉及模糊集合的定义和模糊逻辑的运算。此外,还分享了一段模糊逻辑在自动控制系统中的应用,用于根据设备温度和湿度决定运转时间。

第二篇《模糊逻辑原理与编程》来讲述模糊逻辑的原理和简单C语言编程,同样也是复习以前的工作。

一、模糊逻辑基本原理

我们生活中,很多概念都无法用确定性的语言描述,多与少,高于矮,年轻与年老,这些都无法用具体的数值来进行衡量,也就是说我们生活中的很多概念都是具有模糊性的。

模糊逻辑就是来解决这些模糊性的,模糊逻辑并不把一个命题直接分为真与假,在模糊逻辑中一个命题可以被称为“部分的真”。而对于真与假的归属,可以用隶属度来进行衡量。隶属度是[0,1]之间的一个取值,用来标识一个程度。

模糊逻辑(Fuzzy Logic)是一种使用隶属度代替布尔真值的逻辑,在人工智能领域有重要的意义。

1、模糊集合

在经典的集合定义中,如果存在集合A,论域中一个元素a,要么属于A,要么不属于A,没有第三种情况。但是我们日常生活中的集合并非如此清晰,这种非此即彼的方式在描述生活中的一些问题时往往会遇到一定的问题。

1965年,Zadeh教授提出了模糊集合的概念并给出了模糊集合的定义,用来描述我们生活中遇到的一些模糊的集合。

这种方法把待考察的对象及反映它的模糊概念作为一定的模糊集合,建立适当的隶属函数,通过模糊集合的有关运算和变换,对模糊对象进行分析。模糊集合论以模糊数学为基础,研究有关非精确的现象。

给定一个论域U,那么从U到单位区间 [0,1] 的一个映射

  

称为U上的一个模糊集,或U的一个模糊子集

模糊集可以记为A。 映射(函数)μA(·) 或简记为A(·) 叫做模糊集A隶属函数。 对于每个xUμA(x) 叫做元素x对模糊集A隶属度

模糊集合的表示方法有很多种,其中最常用的两种是Zadeh表示法以及序对表示法

2、模糊逻辑

模糊逻辑主要有补运算、交运算、并运算、蕴含、等价等。

找到一篇关于模糊逻辑写得比较好的博客,可以直接去看吧,下面就举例来进行模糊逻辑的编程。

该博客地址为:

https://blog.csdn.net/ice_pill/article/details/72716909

二、模糊逻辑编程

模糊逻辑的编程并不困难,下面为结合具体案例进行的编程;看到模糊逻辑编程,想到了以前参加飞思卡尔比赛时,是用模糊逻辑来进行小车舵机自动控制,现在想起那段时光,自己以划水的态度,坑害了队友,自己也没有长进。

直接上案例吧:这是《计算智能》书上的例子,例3.3,自动控制系统需要根据设备内温度、设备内湿度决定设备的运转时间。输入变量是温度和湿度,输出为运转时间。温度的论域是[0,100]单位为摄氏度,有3个模糊标记:低、中、高。湿度的论域是[0%,60%],有3个模糊标记:小、中、大。运转时间论域是[0s,1000s],有3个模糊标记:短、中、长。这些模糊标记在模糊规则中被使用。

#include<stdio.h>

int tem,dam;
//温度分区
double Low_temp(int a)
{
	double y;
	if(a>0&&a<25)
		y=-0.04*a+1;
	else
		y=0;
	return y;
}

double Mid_temp(int a)
{
	double y;
	if(a>0&&a<25)
		y=0.04*a;
	else if(a>=25&&a<50)
		y=-0.04*(a-25)+1;
	else
		y=0;
	return y;
}

double Higher_temp(int a)
{
	double y;
	if(a>25&&a<=50)
		y=0.04*(a-25);
	else if(a>50&&a<75)
		y=1-0.04*(a-50);
	else
		y=0;
	return y;
}

double High_temp(int a)
{
	double y;
	if(a>=50&&a<75)
		y=0.04*(a-50);
	else if(a>=75&&a<100)
		y=1-0.04*(a-75);
	else
		y=0;
	return y;
}

//湿度分区
double Low_damp(int a)
{
	double y;
	if(a>0&&a<25)
		y=-0.04*a+1;
	else
		y=0;
	return y;
}

double Mid_damp(int a)
{
	double y;
	if(a>15&&a<=30)
		y=0.067*(a-15);
	else if(a>30&&a<45)
		y=1-0.067*(a-30);
	else
		y=0;
	return y;
}

double High_damp(int a)
{
	double y;
	if(a>35&&a<60)
		y=0.04*(a-35);
	else
		y=0;
	return y;
}

double Min(float a,float b)
{
	double min;
	if(a>b)
		min=b;
	else
		min=a;
	return min;
		
}

double Result()
{
	double maxa,maxb,maxc,Res;
	double a[4],b[5],c[3];
	int i,j,k;
	a[0]=Min(Low_temp(tem),Mid_damp(dam));
	a[1]=Min(Mid_temp(tem),Mid_damp(dam));
	a[2]=Min(Higher_temp(tem),Mid_damp(dam));
	a[3]=Min(Mid_temp(tem),High_damp(dam));
	b[0]=Min(Low_temp(tem),Low_damp(dam));
	b[1]=Min(Mid_temp(tem),Low_damp(dam));
	b[2]=Min(Higher_temp(tem),High_damp(dam));
	b[3]=Min(High_temp(tem),Mid_damp(dam));
	b[4]=Min(High_temp(tem),High_damp(dam));
	c[0]=Min(Higher_temp(tem),Low_damp(dam));
	c[1]=Min(High_temp(tem),Low_damp(dam));
	c[2]=Min(Low_temp(tem),High_damp(dam));
	maxa=a[0];maxb=b[0];maxc=c[0];
	for(i=0;i<4;i++)
		if(a[i]>maxa)
			maxa=a[i];
	for(j=0;j<5;j++)
		if(b[j]>maxb)
			maxb=b[j];
	for(k=0;k<3;k++)
		if(c[k]>maxc)
			maxc=c[k];
	Res = (maxa*100+maxb*500+maxc*1000)/(maxa+maxb+maxc);
	return Res;
}

//主函数
void main()
{
	int a,b=1;
	while(b)
	{
		printf("指令: 1 模糊计算 ; 2 退出\n");
		printf("请输入指令:");
		scanf("%d",&a);
		switch(a)
		{
		case 1:
			printf("请输入温度:");
			scanf("%d",&tem);
			printf("请输入湿度:");
			scanf("%d",&dam);
			printf("%lf\n\n",Result());
			break;
		case 2:
			printf("已退出\n");
			b=0;
			break;
		}
	}
}

运行结果:

通过输入的温度和湿度,计算出设备需要运转的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值