📄 ch14-2.c
字号:
/*说明:本程序来源于作者本人的科研课题,实际应用的程序 */
/*中有关隶属函数的数据均为课题组成员成果通过大量实验获得,*/
/*本书源程序中的数据并非可以应用的真实数据,敬请谅解 */
#include<stdlib.h>
#define FUZZYVAR 3
#define MAXFUZZYSETNUM 5
#define MAXY 100
#define JIANGROULEVEL 35
/*洗涤剂及辅剂的宏定义*/
#define NOFULIAO 0/*没有辅料*/
#define XIDIJI 1/*洗涤剂*/
#define PIAOBAI 2/*漂白剂*/
#define SHANGJIANG 3/*上浆*/
#define RUHUA 4/*乳化*/
#define PIAOJIANG 5/*漂白+上浆*/
#define PIAOROU 6/*漂白+柔化*/
#define ZHONGHEJI 7/*中和剂*/
#define ROURUANJI 8/*柔软剂*/
#define XIDIJI_RUHUA 9/*洗涤剂+乳化剂*/
typedef unsigned char uchar;
typedef unsigned int uint;
/*模糊推理输出参数结构*/
/*洗涤过程每一阶段参数结构*/
struct tagFuzzyOut
{
uchar EffMark; /*错误标志*/
uchar FoTemperture;/*洗涤温度*/
uchar FoWaterLevel;/*洗涤水位*/
uchar FoWashMode;/*洗涤方式:指标准洗、轻柔洗*/
uchar FoWashSpeed;/*洗涤速度*/
uchar FoWashTime;/*洗涤时间*/
uchar FoAbulentType;/*辅剂类型:指漂白剂、柔化剂等*/
uchar FoAbulentVolume;
uchar FoDrainMode; /* =0 不排水
=1 排水
=2 中脱(排水后中速脱水)
=3 高脱(排水后高速脱水)
*/
uchar FoJunbuSpeed; /*均布速度*/
uchar FoZhongtuoSpeed;/*中脱速度*/
uchar FoGaotuoSpeed; /*高脱速度*/
uchar FoZhongtuoTime; /*中脱时间*/
uchar FoGaotuoTime; /*高脱时间*/
};
/* 最多阶段数:一次初洗,3次主洗,3次过清,2次处理*/
xdata struct tagFuzzyOut FuzzyOut[9];
/*调用模糊推理程序前人工输入:ExtraAbulentPro,AbulentTempture,
并应检测布质ClothType、布量ClothVolume、初洗浑浊度cxTurbityValue
*/
xdata uchar ExtraAbulentPro,AbulentTemperture;//定义辅剂类型、辅剂温度
xdata uchar ClothType=15,ClothVolume=23;//定义布质、布量
xdata uint cxTurbityValue=60;//初洗浑浊度值
void FuzzyInfer(void);//模糊推理函数
main()
{
int i;
i=10;
ClothType=15;
ClothVolume=25;
cxTurbityValue=23;
ExtraAbulentPro=PIAOJIANG;
AbulentTemperture=1;
FuzzyInfer();
}
/* 确定成员函数
1.FUZZYVAR =输入模糊变量数(常量): 布质,布量,浑浊度
2.fSetNum[FUZVAR]: 每个模糊变量对应的模糊集数
3.隶属函数:梯形,a, b, c, d四点表示,高度为固定值
4.Trapezoid 顺序记录所有模糊集隶属函数的a,b,c,d,.....数据
5.mfNode 指向Trapzoid
*/
struct tagTrapezoid
{
uchar left;
uchar mid1;
uchar mid2;
uchar right;
};
xdata struct tagTrapezoid TabTrapezoid[11]={{0,0,20,40},{20,40,60,80},{60,80,100,100},
{0,0,10,15},{10,15,15,20},{15,20,20,25},{20,25,25,25},
{0,0,10,25},{10,25,40,55},{40,55,70,85},{70,85,100,100}};
xdata uchar fSetNum[FUZZYVAR]={3,4,4};
/*主洗、过清阶段数与布量、初/主洗浑浊度关系*/
xdata uchar TabStageNum[8][4]={1,1,1,1,1,1,1,2,1,1,2,2,2,2,3,3,
1,1,2,2,1,2,2,2,2,2,2,3,2,2,3,3};
/* 洗涤方式:0=轻柔洗 1=标准洗 2=单向洗 */
/*洗涤转速、均布、中脱及高脱速度与布质、布量关系*/
xdata uchar TabMotorSpeed[4][12]={1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12};
/* 水位与布质、布量关系*/
xdata uchar TabWaterLevel[6][12]={1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12};
/* 主洗水温 ?*/
/* 主洗洗涤剂量与布量、浑浊度关系*/
xdata uint TabAbulentVolume[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
/*主洗、过清、处理洗涤时间与布量、浑浊度关系 (一次过清、一般处理、中和处理、柔化处理、上浆处理)*/
xdata uchar TabXidiTime[6][16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
/*主洗、过清、处理脱水方式与布量、布质关系 */
xdata uchar TabDrainMode[3][12]={1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12};
/*中、高脱时间与布质、布量关系*/
xdata uchar TabDrainTime[2][12]={1,2,3,4,5,6,7,8,9,10,11,12,
1,2,3,4,5,6,7,8,9,10,11,12};
/*推理过程*/
void FuzzyInfer(void)
{
uchar NumToFset(uchar num,uchar m_Sz,uchar *sp);
xdata int i,j,k,stagenum[4];
xdata int sum1,sum2,sum3[10],sim;
xdata uchar fm_ClothType,fm_ClothVolume,fm_cxTurbityValue,Simility[FUZZYVAR][MAXFUZZYSETNUM];
fm_ClothType=NumToFset(0,ClothType,Simility[0]);
fm_ClothVolume=NumToFset(1,ClothVolume,Simility[1]);
fm_cxTurbityValue=NumToFset(2,cxTurbityValue,Simility[2]);
/* 确定主洗、过清阶段数,处理阶段数由辅料种类决定,初洗阶段数=1 */
stagenum[0]=1;
j=fSetNum[1];
for(i=0;i<2;i++)stagenum[i+1]=TabStageNum[i*j+fm_ClothVolume][fm_cxTurbityValue];
if((stagenum[1]<2)&&((ExtraAbulentPro==PIAOBAI)||(ExtraAbulentPro==RUHUA)||(ExtraAbulentPro==XIDIJI_RUHUA)
||(ExtraAbulentPro==PIAOJIANG)||(ExtraAbulentPro==PIAOROU)))stagenum[1]=2; /* 漂白至少应有2步主洗*/
FuzzyOut[0].EffMark=stagenum[0];
if(stagenum[1]==1)
{
FuzzyOut[1].EffMark=1;
FuzzyOut[2].EffMark=FuzzyOut[3].EffMark=0;
}
else if(stagenum[1]==2)
{
FuzzyOut[1].EffMark=FuzzyOut[2].EffMark=1;
FuzzyOut[3].EffMark=0;
}
else {
FuzzyOut[1].EffMark=FuzzyOut[2].EffMark=1;
FuzzyOut[3].EffMark=1;
}
if(stagenum[2]==1)
{
FuzzyOut[4].EffMark=1;
FuzzyOut[5].EffMark=0;
FuzzyOut[6].EffMark=0;
}
else if(stagenum[2]==2)
{
FuzzyOut[4].EffMark=FuzzyOut[5].EffMark=1;
FuzzyOut[6].EffMark=0;
}
else
{
FuzzyOut[4].EffMark=1;
FuzzyOut[5].EffMark=1;
FuzzyOut[6].EffMark=1;
}
switch(ExtraAbulentPro)
{
case PIAOBAI:
case SHANGJIANG:
case ROURUANJI:
case NOFULIAO:
FuzzyOut[7].EffMark=1;
FuzzyOut[8].EffMark=0;
stagenum[3]=1;
break;
case PIAOJIANG:
case PIAOROU:
FuzzyOut[7].EffMark=FuzzyOut[8].EffMark=1;
stagenum[3]=2;
break;
}
/* 洗涤方式: 标准洗涤*/
for(i=0;i<9;i++)FuzzyOut[i].FoWashMode=1;
/* 料种 */
for(i=0;i<9;i++)FuzzyOut[i].FoAbulentType=NOFULIAO;
switch(ExtraAbulentPro)
{
case PIAOBAI:
case PIAOROU:
case PIAOJIANG:
FuzzyOut[1].FoAbulentType=XIDIJI;
if(stagenum[1]==2)
{
FuzzyOut[2].FoAbulentType=PIAOBAI;
}
else
{
FuzzyOut[2].FoAbulentType=XIDIJI;
FuzzyOut[3].FoAbulentType=PIAOBAI;
}
FuzzyOut[7].FoAbulentType=ZHONGHEJI;
if(ExtraAbulentPro==PIAOJIANG)FuzzyOut[8].FoAbulentType=SHANGJIANG;
if(ExtraAbulentPro==PIAOROU)FuzzyOut[8].FoAbulentType=ROURUANJI;
break;
case RUHUA:
FuzzyOut[1].FoAbulentType=XIDIJI;
if(stagenum[1]==2)
{
FuzzyOut[2].FoAbulentType=RUHUA;
}
else
{
FuzzyOut[2].FoAbulentType=XIDIJI;
FuzzyOut[3].FoAbulentType=RUHUA;
}
break;
case XIDIJI_RUHUA:
if(stagenum[1]==1)FuzzyOut[1].FoAbulentType=XIDIJI_RUHUA;
else if(stagenum[1]==2)
{
FuzzyOut[1].FoAbulentType=XIDIJI;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -