模糊综合评判算法C语言版本

模糊综合评判算法 C语言版本

2008-01-05 22:24

本算法评价集个数为5,评价因子个数为6,采用超标加权法计算权重,线性降半阶隶属函数

#include

#define MatrixRows 5

#define MatrixCols 6

double CalculateAverage(int m,double a[MatrixRows][MatrixCols]) //计算平均值,m表示第m列的平均值

{

double myResult;

int i;

myResult=0;

for(i=0;i

{

myResult+=a[i][m];

}

myResult=myResult/MatrixRows;

// printf("%lf\n",myResult);

return myResult;

}

double EWeight(int m,double a[MatrixRows][MatrixCols],double b[MatrixCols]) //计算权重数组E,m为第m列的权重值

{

double Aver[MatrixCols] ; //m个含水层同一评价因子的平均值 double EResult; //计算权重结果

double ETotal; //归一划权重和

int i;

for(i=0;i

{

Aver[i]=CalculateAverage(i,a);

}

ETotal=0;

for(i=0;i

{

ETotal+=(b[i]/Aver[i]);

}

EResult=(b[m]/Aver[m])/ETotal;

return EResult;

}

double Sort(int m,int n,double a[MatrixRows][MatrixCols])

{

double b[MatrixRows][MatrixCols]; //排序后的结果,对数组的每一个列中的四个数字进行从小到大排列

int i,j,k; //不可以直接对a[MatrixRows][MatrixCols]进行排序,因为是数组是传地址计算

for(i=0;i

for(j=0;j

b[i][j]=a[i][j];

for(j=0;j

{

for(i=0;i

for(k=i;k

{

if(b[i][j]>b[k][j]) //排序

{

double tmp;

tmp=b[i][j];

b[i][j]=b[k][j];

b[k][j]=tmp;

}

}

}

return b[m][n];

}

double Lishudu(int m,int n,double a[MatrixRows][MatrixCols],double b[MatrixCols]) //计算当前样本b[MatrixCols]对各个评价因子的隶属度 {

double c[MatrixRows][MatrixCols]; //排序后的结果 double LSDResult[MatrixCols][MatrixRows]; //隶属度计算结果,即评价集与评价因子的关系矩阵

int i,j,k;

for(i=0;i

for(j=0;j

{

c[i][j]=Sort(i,j,a); //排序

}

for(j=0;j

{

for(i=0;i

{

for(k=0;k

{

if(a[i][j]==c[k][j])

{

if(k==0)

{

if(b[j]

LSDResult[j][i]=1;

if(b[j]>=c[k][j]&&b[j]

LSDResult[j][i]=((c[k+1][j]-b[j])/(c[k+1][j]-c[k][j])); if(b[j]>=c[k+1][j])

LSDResult[j][i]=0;

}

if(k==1||k==2||k==3)

{

if(b[j]

LSDResult[j][i]=0;

if(b[j]>=c[k-1][j]&&b[j]

LSDResult[j][i]=((b[j]-c[k-1][j])/(c[k][j]-c[k-1][j])); if(b[j]>=c[k][j]&&b[j]

LSDResult[j][i]=((c[k+1][j]-b[j])/(c[k+1][j]-c[k][j])); if(b[j]>=c[k+1][j])

LSDResult[j][i]=0;

}

if(k==4)

{

if(b[j]

LSDResult[j][i]=0;

if(b[j]>=c[k-1][j] && b[j]

LSDResult[j][i]=((b[j]-c[k-1][j])/(c[k][j]-c[k-1][j])); if(b[j]>=c[k][j])

LSDResult[j][i]=1;

}

}

}

}

}

return LSDResult[m][n];

}

double FuzzyEvalution(int x,int m,int n,double

a[MatrixRows][MatrixCols],double b[MatrixCols])

{

double E[MatrixCols]; //超标加权法计算权重

double R[MatrixCols][MatrixRows]; //评价集与评价因子关系矩阵 double FEResult[MatrixRows];//最终计算对各个评价集的隶属度 int i,j;

for(i=0;i

for(j=0;j

{

R[i][j]=Lishudu(i,j,a,b); //函数参数

a[MatrixRows][MatrixCols],得到的计算结果为MatrixCols X MatrixRows矩阵

}

for(i=0;i

{

E[i]=EWeight(i,a,b);

}

for(i=0; i

{

FEResult[i]=0;

for(j=0;j

{

FEResult[i]+=E[j]*R[j][i];

}

}

return FEResult[x];

}

void main()

{

double a[MatrixRows][MatrixCols]; //保存评价集标注值

double b[MatrixCols]; //保存待测出水点水样的值

double myResult[MatrixRows]; //保存计算结果

double myweight[MatrixCols]; //计算权重的结果

double mysort[MatrixRows][MatrixCols]; //排序结果

double myLiShuDu[MatrixCols][MatrixRows];//评判集和评判因子的关系矩阵 int i,j;

//////////////////////////////////////////////////////////////////////////

printf("请输入评判集标准值:\n");

for(i=0;i

{

printf("请输入评判集 %d 的标准值:\n",i+1);

for(j=0;j

{

scanf("%lf",&a[i][j]);

}

}

printf("评判集标准值输出:\n");

for(i=0;i

{

for(j=0;j

printf("%lf, ",a[i][j]);

printf("\n");

}

printf("请输入出水点水样的值:\n");

for(i=0;i

{

scanf("%lf",&b[i]);

}

////////////////////////////////////////////////////////////////////////////

for(i=0;i

{

myweight[i]=EWeight(i,a,b);

}

printf("输出一维数组权重值:\n");

for(j=0;j

printf("%lf\n",myweight[j]);

/////////////////////////////////////////////////////////////////////////

for(i=0;i

{

for(j=0;j

{

mysort[i][j]=Sort(i,j,a);

}

}

printf("输出a[MatrixRows][MatrixCols]每一列中的四个数字排序后的结果:\n");

for(i=0;i

{

for(j=0;j

{

printf("%lf, ",mysort[i][j]);

}

printf("\n");

}

/////////////////////////////////////////////////////////////////////////

printf("评判集和评判因子的关系矩阵:\n");

for(i=0;i

for(j=0;j

{

myLiShuDu[i][j]=Lishudu(i,j,a,b);

}

for(i=0;i

{

for(j=0;j

{

printf("%lf, ",myLiShuDu[i][j]);

}

printf("\n");

}

/////////////////////////////////////////////////////////////////////////

for(i=0;i

{

myResult[i]=FuzzyEvalution(i,MatrixRows,MatrixCols,a,b); //模糊综合评判

}

printf("以下为运算结果:\n");

for(i=0;i

{

printf("%lf, \n",myResult[i]);

}

}

模糊综合评判算法 C语言版本

2008-01-05 22:24

本算法评价集个数为5,评价因子个数为6,采用超标加权法计算权重,线性降半阶隶属函数

#include

#define MatrixRows 5

#define MatrixCols 6

double CalculateAverage(int m,double a[MatrixRows][MatrixCols]) //计算平均值,m表示第m列的平均值

{

double myResult;

int i;

myResult=0;

for(i=0;i

{

myResult+=a[i][m];

}

myResult=myResult/MatrixRows;

// printf("%lf\n",myResult);

return myResult;

}

double EWeight(int m,double a[MatrixRows][MatrixCols],double b[MatrixCols]) //计算权重数组E,m为第m列的权重值

{

double Aver[MatrixCols] ; //m个含水层同一评价因子的平均值 double EResult; //计算权重结果

double ETotal; //归一划权重和

int i;

for(i=0;i

{

Aver[i]=CalculateAverage(i,a);

}

ETotal=0;

for(i=0;i

{

ETotal+=(b[i]/Aver[i]);

}

EResult=(b[m]/Aver[m])/ETotal;

return EResult;

}

double Sort(int m,int n,double a[MatrixRows][MatrixCols])

{

double b[MatrixRows][MatrixCols]; //排序后的结果,对数组的每一个列中的四个数字进行从小到大排列

int i,j,k; //不可以直接对a[MatrixRows][MatrixCols]进行排序,因为是数组是传地址计算

for(i=0;i

for(j=0;j

b[i][j]=a[i][j];

for(j=0;j

{

for(i=0;i

for(k=i;k

{

if(b[i][j]>b[k][j]) //排序

{

double tmp;

tmp=b[i][j];

b[i][j]=b[k][j];

b[k][j]=tmp;

}

}

}

return b[m][n];

}

double Lishudu(int m,int n,double a[MatrixRows][MatrixCols],double b[MatrixCols]) //计算当前样本b[MatrixCols]对各个评价因子的隶属度 {

double c[MatrixRows][MatrixCols]; //排序后的结果 double LSDResult[MatrixCols][MatrixRows]; //隶属度计算结果,即评价集与评价因子的关系矩阵

int i,j,k;

for(i=0;i

for(j=0;j

{

c[i][j]=Sort(i,j,a); //排序

}

for(j=0;j

{

for(i=0;i

{

for(k=0;k

{

if(a[i][j]==c[k][j])

{

if(k==0)

{

if(b[j]

LSDResult[j][i]=1;

if(b[j]>=c[k][j]&&b[j]

LSDResult[j][i]=((c[k+1][j]-b[j])/(c[k+1][j]-c[k][j])); if(b[j]>=c[k+1][j])

LSDResult[j][i]=0;

}

if(k==1||k==2||k==3)

{

if(b[j]

LSDResult[j][i]=0;

if(b[j]>=c[k-1][j]&&b[j]

LSDResult[j][i]=((b[j]-c[k-1][j])/(c[k][j]-c[k-1][j])); if(b[j]>=c[k][j]&&b[j]

LSDResult[j][i]=((c[k+1][j]-b[j])/(c[k+1][j]-c[k][j])); if(b[j]>=c[k+1][j])

LSDResult[j][i]=0;

}

if(k==4)

{

if(b[j]

LSDResult[j][i]=0;

if(b[j]>=c[k-1][j] && b[j]

LSDResult[j][i]=((b[j]-c[k-1][j])/(c[k][j]-c[k-1][j])); if(b[j]>=c[k][j])

LSDResult[j][i]=1;

}

}

}

}

}

return LSDResult[m][n];

}

double FuzzyEvalution(int x,int m,int n,double

a[MatrixRows][MatrixCols],double b[MatrixCols])

{

double E[MatrixCols]; //超标加权法计算权重

double R[MatrixCols][MatrixRows]; //评价集与评价因子关系矩阵 double FEResult[MatrixRows];//最终计算对各个评价集的隶属度 int i,j;

for(i=0;i

for(j=0;j

{

R[i][j]=Lishudu(i,j,a,b); //函数参数

a[MatrixRows][MatrixCols],得到的计算结果为MatrixCols X MatrixRows矩阵

}

for(i=0;i

{

E[i]=EWeight(i,a,b);

}

for(i=0; i

{

FEResult[i]=0;

for(j=0;j

{

FEResult[i]+=E[j]*R[j][i];

}

}

return FEResult[x];

}

void main()

{

double a[MatrixRows][MatrixCols]; //保存评价集标注值

double b[MatrixCols]; //保存待测出水点水样的值

double myResult[MatrixRows]; //保存计算结果

double myweight[MatrixCols]; //计算权重的结果

double mysort[MatrixRows][MatrixCols]; //排序结果

double myLiShuDu[MatrixCols][MatrixRows];//评判集和评判因子的关系矩阵 int i,j;

//////////////////////////////////////////////////////////////////////////

printf("请输入评判集标准值:\n");

for(i=0;i

{

printf("请输入评判集 %d 的标准值:\n",i+1);

for(j=0;j

{

scanf("%lf",&a[i][j]);

}

}

printf("评判集标准值输出:\n");

for(i=0;i

{

for(j=0;j

printf("%lf, ",a[i][j]);

printf("\n");

}

printf("请输入出水点水样的值:\n");

for(i=0;i

{

scanf("%lf",&b[i]);

}

////////////////////////////////////////////////////////////////////////////

for(i=0;i

{

myweight[i]=EWeight(i,a,b);

}

printf("输出一维数组权重值:\n");

for(j=0;j

printf("%lf\n",myweight[j]);

/////////////////////////////////////////////////////////////////////////

for(i=0;i

{

for(j=0;j

{

mysort[i][j]=Sort(i,j,a);

}

}

printf("输出a[MatrixRows][MatrixCols]每一列中的四个数字排序后的结果:\n");

for(i=0;i

{

for(j=0;j

{

printf("%lf, ",mysort[i][j]);

}

printf("\n");

}

/////////////////////////////////////////////////////////////////////////

printf("评判集和评判因子的关系矩阵:\n");

for(i=0;i

for(j=0;j

{

myLiShuDu[i][j]=Lishudu(i,j,a,b);

}

for(i=0;i

{

for(j=0;j

{

printf("%lf, ",myLiShuDu[i][j]);

}

printf("\n");

}

/////////////////////////////////////////////////////////////////////////

for(i=0;i

{

myResult[i]=FuzzyEvalution(i,MatrixRows,MatrixCols,a,b); //模糊综合评判

}

printf("以下为运算结果:\n");

for(i=0;i

{

printf("%lf, \n",myResult[i]);

}

}


相关内容

  • 基于云理论和信息融合理论的系统性能评估方法研究
  • CN43-1258/TP计算机工程与科学 2012年第34卷第2期 ISSN1007-130X CoMPUTERENGINEERING&SCIENCE V01.34,No.2,2012 文章编号:1007-130x(2012)02一018卜05 基于云理论和信息融合理论的系统性能评估方法研究 ...

  • [收藏版]数学建模中常用的思想和方法
  • 在数学建模中常用的方法:类比法.二分法.量纲分析法.差分法.变分法.图论法.层次分析法.数据拟合法.回归分析法.数学规划(线性规划,非线性规划,整数规划,动态规划,目标规划).机理分析.排队方法.对策方法.决策方法.模糊评判方法.时间序列方法.灰色理论方法.现代优化算法(禁忌搜索算法,模拟退火算法, ...

  • 模糊评价在网络教育精品课程作业中的应用
  • [摘要]针对目前网络教育精品课程的特点及其作业系统建设的现状,指出现有的网络教育精品课程作业缺乏相应的评价和激励机制.针对以上问题,提出了模糊综合评价法,探讨了该方法的基本思想.数学模型和核心程序,并以某学生的具体作业情况来进行实证研究. [关键词]网络教育精品课程;作业;模糊综合评价 精品课程是具 ...

  • 多目标优化的求解方法与发展
  • 多目标优化的求解方法与发展 耿玉磊 张翔 (福建农林大学机电工程学院,福州金山 350002) 摘要:本文首先介绍了传统多目标优化求解方法和改进:对遗传算法,模糊优化,神经网络等算法在多目标优化中的应用做了介绍:最后介绍了满意度. 关键词:多目标优化 遗传算法 神经网络 1前言 多目标优化(Mult ...

  • 低挥发分无烟煤及其混煤燃烧性能研究
  • 第26卷/2000年第1期湖南电力研究与试验 低挥发分无烟煤及其混煤燃烧性能研究 黄'伟1,熊蔚立1,杨剑峰1,曹映春2 (1.湖南省电力试验研究院,湖南长沙410007:2.湖南省火电建设公司,湖南株洲412000) 摘要:采用热天平和一维火焰炉对耒阳低挥发分无烟煤及其混煤的着火.燃烧.燃尽以及结 ...

  • 边坡稳定性评价方法研究及发展趋势
  • 岩石力学与工程学报 21(7):1087-1091 2002年7月 Chinese Journal of Rock Mechanics and Engineering July,2002 第21卷 第7期 边坡稳定性评价方法研究及发展趋势* 夏元友 李 梅 (武汉理工大学土木工程与建筑学院 武汉 4 ...

  • 基于改进层次分析法的模糊综合评价模型
  • 万 方数据 万 方数据 万 方数据 万 方数据 万 方数据 万 方数据 基于改进层次分析法的模糊综合评价模型 作者: 作者单位: 金菊良, 魏一鸣, 丁晶 金菊良(合肥工业大学,土木建筑工程学院,安徽,合肥,230009), 魏一鸣(中国科学院,科技 政策与管理科学研究所,北京,100080), 丁 ...

  • 动态规划论文
  • <运筹学>课程 专题论文 专 业: 信息与计算科学 班 级:一班 组 长:李春梅 完成人姓名及学号: 论文题目:浅谈不同方法在物流中心选址问题中的 2009年 6 月 29 日 论文评价指标与鉴定意见 浅谈不同方法在物流中心选址问题中的应用比较 专业:信息与计算科学 姓名:李春梅 崔建青 ...

  • 数学建模的摘要写法及注意事项
  • 摘要在整个数模论文中占有及其重要的地位,它是评委对你所写论文的第一印象.在全国大学生数学建模竞赛中,组委会对论文摘要提出了专门的要求,再三明文提醒参赛者要注重摘要的写作.在论文的评阅中,摘要是你的论文是否取得好名次的决定性因素,评委们通过你的摘要就决定是否继续阅读你的论文.换句话说,就算你的论文其他 ...