模糊推理(T-S系統)——補充

接上篇博客:點擊打開鏈接


//農業生產的經濟指標,等級劃分標準:

/*********************************************/
//等級 低       */
//畝產 2000以上 1500~2000 1500以下 */
//費用 7以上 4~7 4以下    */
//用工 50以上   25~50 25以下   */
//收入 120以上   90~120 90以下   */
//肥力 3~5 1~3      */
/*********************************************/
//如果隸屬度函數爲f(x),則:
//高的隸屬度函數爲f(x)的1/2次方
//中的隸屬度函數爲min(f(x), 1-f(x))
//低的隸屬度函數爲(1-f(x))的1/2次方


//推理規則
//if畝產低and費用高and用工高and收入低and肥力低then評價差
//if畝產中and費用低and用工低and收入中and肥力高then評價中
//if畝產高and費用低and用工低and收入高and肥力高then評價高
//if畝產中and費用中and用工中and收入中and肥力高then評價中
//if畝產高and費用高and用工高and收入低and肥力低then評價差
//評價等級高、中、低分別用3, 2, 1表示


#include "stdio.h"
#include "stdlib.h"
#include "math.h"


#define INF 999
#define DEF 0.0000001
#define dimNum 5    //經濟指標數
#define N 5   //規則條數
#define min(a, b) (a<b?a:b)
#define max(a, b) (a>b?a:b)


double fun1(double x);  //畝產隸屬度函數
double fun2(double x);  //費用隸屬度函數
double fun3(double x);  //用工隸屬度函數
double fun4(double x);  //收入隸屬度函數
double fun5(double x);  //肥力隸屬度函數
void rule1();    //第1條規則
void rule2();    //第2條規則
void rule3();    //第3條規則
void rule4();    //第4條規則
void rule5();    //第5條規則


double MIN_W[N]={0};   //取小法加權值
double MUL_W[N]={0};   //乘積法加權值
double evaluate[N];  //評價結果
double yieldPerMu ;   //畝產
double cost;     //每百斤產量費用
double useWork;   //每畝用工時
double netIncome;  //每畝純收入
double soil;     //土壤肥力等級


void main()
{
int i, j;


printf("畝產:");
scanf("%lf", &yieldPerMu);
printf("每百斤產量費用:");
scanf("%lf", &cost);
printf("每畝用工時:");
scanf("%lf", &useWork);
printf("每畝純收入:");
scanf("%lf", &netIncome);
printf("土壤肥力等級:");
scanf("%lf", &soil);


rule1();
rule2();
rule3();
rule4();
rule5();


double MIN_EVA=0;//取小法最終評價
double MUL_EVA=0;//乘積法最終評價
double min_sum1, min_sum2, mul_sum1, mul_sum2;  

min_sum1 = min_sum2 = mul_sum1 = mul_sum2 = 0; 
for(i=0; i<N; i++)
{
min_sum1 += MIN_W[i]*evaluate[i];
min_sum2 += MIN_W[i];
mul_sum1 += MUL_W[i]*evaluate[i];
mul_sum2 += MUL_W[i];
}

MIN_EVA = min_sum1/(min_sum2+DEF);
MUL_EVA = mul_sum1/(mul_sum2+DEF);


printf("取小法最終評價等級爲:%0.3lf  \n乘積法最終評價等級爲:%0.3lf\n", MIN_EVA, MUL_EVA);


}




//第1條規則
void rule1()
{
int i;
double minTemp;
double mulTemp;
double wTemp[dimNum];


for(i=0; i<dimNum; i++)
wTemp[i] = INF;

wTemp[0] = sqrtf(1-fun1(yieldPerMu));
wTemp[1] = sqrtf(fun2(cost));
wTemp[2] = sqrtf(fun3(useWork));
wTemp[3] = sqrtf(1-fun4(netIncome));
wTemp[4] = sqrtf(1-fun5(soil));
evaluate[0] = 1;

//將隸屬度過低的歸爲0
for(i=0; i<dimNum; i++)
if(wTemp[i]<DEF)
wTemp[i] = 0;


//取小法
minTemp = INF;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
minTemp = min(minTemp, wTemp[i]);
MIN_W[0] = minTemp;

//乘積法
mulTemp = 1;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
mulTemp = mulTemp*wTemp[i];
MUL_W[0] = mulTemp;


}




//第2條規則
void rule2()
{
int i;
double minTemp;
double mulTemp;
double wTemp[dimNum];

for(i=0; i<dimNum; i++)
wTemp[i] = INF;

wTemp[0] = min(1-fun1(yieldPerMu), fun1(yieldPerMu));
wTemp[1] = sqrtf(1-fun2(cost));
wTemp[2] = sqrtf(1-fun3(useWork));
wTemp[3] = sqrtf(fun4(netIncome));
wTemp[4] = sqrtf(fun5(soil));
evaluate[1] = 2;

//將隸屬度過低的歸爲0
for(i=0; i<dimNum; i++)
if(wTemp[i]<DEF)
wTemp[i] = 0;


//取小法
minTemp = INF;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
minTemp = min(minTemp, wTemp[i]);
MIN_W[1] = minTemp;

//乘積法
mulTemp = 1;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
mulTemp = mulTemp*wTemp[i];
MUL_W[1] = mulTemp;


}




//第3條規則
void rule3()
{
int i;
double minTemp;
double mulTemp;
double wTemp[dimNum];

for(i=0; i<dimNum; i++)
wTemp[i] = INF;

wTemp[0] = sqrtf(fun1(yieldPerMu));
wTemp[1] = sqrtf(1-fun2(cost));
wTemp[2] = sqrtf(1-fun3(useWork));
wTemp[3] = sqrtf(fun4(netIncome));
wTemp[4] = sqrtf(fun5(soil));
evaluate[2] = 3;


//將隸屬度過低的歸爲0
for(i=0; i<dimNum; i++)
if(wTemp[i]<DEF)
wTemp[i] = 0;


//取小法
minTemp = INF;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
minTemp = min(minTemp, wTemp[i]);
MIN_W[2] = minTemp;

//乘積法
mulTemp = 1;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
mulTemp = mulTemp*wTemp[i];
MUL_W[2] = mulTemp;


}




//第4條規則
void rule4()
{
int i;
double minTemp;
double mulTemp;
double wTemp[dimNum];

for(i=0; i<dimNum; i++)
wTemp[i] = INF;

wTemp[0] = min(fun1(yieldPerMu), 1-fun1(yieldPerMu));
wTemp[1] = min(fun2(cost), 1-fun2(cost));
wTemp[2] = min(fun3(useWork), 1-fun3(useWork));
wTemp[3] = min(fun4(netIncome), 1-fun4(netIncome));
wTemp[4] = sqrtf(fun5(soil));
evaluate[3] = 2;

//將隸屬度過低的歸爲0
for(i=0; i<dimNum; i++)
if(wTemp[i]<DEF)
wTemp[i] = 0;


//取小法
minTemp = INF;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
minTemp = min(minTemp, wTemp[i]);
MIN_W[3] = minTemp;

//乘積法
mulTemp = 1;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
mulTemp = mulTemp*wTemp[i];
MUL_W[3] = mulTemp;


}




//第5條規則
void rule5()
{
int i;
double minTemp;
double mulTemp;
double wTemp[dimNum];

for(i=0; i<dimNum; i++)
wTemp[i] = INF;

wTemp[0] = sqrtf(fun1(yieldPerMu));
wTemp[1] = sqrtf(fun2(cost));
wTemp[2] = sqrtf(fun3(useWork));
wTemp[3] = sqrtf(1-fun4(netIncome));
wTemp[4] = sqrtf(1-fun5(soil));
evaluate[4] = 1;

//將隸屬度過低的歸爲0
for(i=0; i<dimNum; i++)
if(wTemp[i]<DEF)
wTemp[i] = 0;


//取小法
minTemp = INF;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
minTemp = min(minTemp, wTemp[i]);
MIN_W[4] = minTemp;

//乘積法
mulTemp = 1;
for(i=0; i<dimNum; i++)
if(wTemp[i]!=INF)
mulTemp = mulTemp*wTemp[i];
MUL_W[4] = mulTemp;

}




//畝產隸屬度函數
double fun1(double x)
{


if(x<=1500)
return 0;


if(x>1500 && x<=2000)
return ((x-1500)/500)*((x-1500)/500);


if(x>2000)
return 1;
}




//費用隸屬度函數
double fun2(double x)
{
if(x<=4)
return 0;


if(x>4 && x<=7)
return ((x-4)/3)*((x-4)/3);


if(x>7)
return 1;
}


//用工隸屬度函數
double fun3(double x)
{
if(x<=25)
return 0;

if(x>25 && x<=50)
return ((x-25)/25)*((x-25)/25);

if(x>50)
return 1;


}


//收入隸屬度函數
double fun4(double x)
{
if(x<=90)
return 0;

if(x>90 && x<=120)
return ((x-90)/30)*((x-90)/30);

if(x>120)
return 1;
}


//肥力隸屬度函數
double fun5(double x)
{
if(x<=0)
return 0;


if(x>0 && x<=5)
return (x/5)*(x/5);


if(x>5)
return 1;
}
發佈了38 篇原創文章 · 獲贊 34 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章