首页  >> 水信息共享平台  >> 资料共享
评价指标标准化C++类TStddize源代码
作者 wbadmin   查看 1099   发表时间 2007/6/20 15:07  【论坛浏览】
在多目标优选、多指标评价中,需对评价数据进行标准化cjnkh
标准化过程中需要处理一些细节问题,如适中型指标、基点等cjnkh
以下代码个人写成,尚未全面测试,欢迎探讨cjnkh
cjnkh
  代码:
/* 评价指标标准化的类cjnkh
=====调用流程=====cjnkh
TStddize(int mm, int nn); cjnkh
setValue(double *xx, TIndexInfo *xxInfo, bool replaceFlag);cjnkh
int doStddize();cjnkh
getValue(double *rr);cjnkh
~TStddize();cjnkh
=====调用需要的参数=====cjnkh
参数1:mm指标数目,行数;nn为指标数目,列数 cjnkh
参数2:指标值矩阵xx(mm行,nn列)cjnkh
参数3:指标值附加信息xxInfo,TIndexInfo型向量,实为mm行1+3列矩阵cjnkh
第一个为指标类型(+/-/^),其次为最小基点、最大基点、适中基点值cjnkh
参数4:replaceFlag为真,则以基点值替代最大最小值cjnkh
=====调用返回的参数=====cjnkh
参数5:标准化矩阵rr(mm行,nn列)cjnkh
*/cjnkh
cjnkh
#include cjnkh
cjnkh
cjnkh
struct TIndexInfo cjnkh
{cjnkh
char indexType;cjnkh
double indexMin;cjnkh
double indexMax;cjnkh
double indexMid;cjnkh
};cjnkh
cjnkh
class TStddizecjnkh
{cjnkh
public:cjnkh
TStddize(int mm, int nn);cjnkh
~TStddize();cjnkh
void setValue(double *xx, TIndexInfo *xxInfo, bool replaceFlag);cjnkh
int doStddize();cjnkh
void getValue(double *rr);cjnkh
protected:cjnkh
private:cjnkh
int m; //指标数,行数cjnkh
int n; //样本数,列数cjnkh
double *x; //特征值矩阵cjnkh
double *r; //标准值矩阵/相对隶属度矩阵cjnkh
double *xMin; //样本中的最小值,m维列向量,直接用于标准值计算cjnkh
double *xMax; //样本中的最大值,m维列向量cjnkh
double *xMid; //样本中的适中值,m维列向量cjnkh
TIndexInfo *xInfo; //指标附加信息cjnkh
bool absoluteFlag;cjnkh
};cjnkh
cjnkh
TStddize::TStddize(int mm, int nn)cjnkh
{cjnkh
m = mm;cjnkh
n = nn;cjnkh
x = new double[m*n];cjnkh
r = new double[m*n];cjnkh
xMin = new double[m];cjnkh
xMax = new double[m];cjnkh
xMid = new double[m];cjnkh
xInfo = new TIndexInfo[m];cjnkh
}cjnkh
cjnkh
void TStddize::setValue(double *xx, TIndexInfo *xxInfo, bool replaceFlag)cjnkh
{cjnkh
memcpy(x, xx, m*n*sizeof(double));cjnkh
memcpy(xInfo, xxInfo, m*sizeof(TIndexInfo));cjnkh
absoluteFlag = replaceFlag;cjnkh
}cjnkh
cjnkh
int TStddize::doStddize()cjnkh
{cjnkh
int i, j;cjnkh
//在评价对象中找出各指标的最大最小值cjnkh
for (i=0; icjnkh
{cjnkh
xMin = x[i*n+0];cjnkh
xMax = x[i*n+0];cjnkh
for (j=0; jcjnkh
{cjnkh
if (x[i*n+j])cjnkh
xMin = x[i*n+j];cjnkh
if (x[i*n+j]>xMax)cjnkh
xMax = x[i*n+j];cjnkh
}cjnkh
xMid = (xInfo+i)->indexMid; cjnkh
}cjnkh
cjnkh
//根据flag确定参与标准化运算的极值,如果为真则用xInfo值替代cjnkh
if (absoluteFlag)cjnkh
{cjnkh
for (i=0; icjnkh
{cjnkh
xMin = (xInfo+i)->indexMin;cjnkh
xMax = (xInfo+i)->indexMax;cjnkh
if (xMin>=xMax) cjnkh
return -1; cjnkh
}cjnkh
}cjnkh
cjnkh
//标准化运算cjnkh
for (i=0; icjnkh
{cjnkh
switch((xInfo+i)->indexType) cjnkh
{cjnkh
case '+':cjnkh
for (j=0; jcjnkh
{cjnkh
if (x[i*n+j]<=xMin)cjnkh
r[i*n+j] = 0.0;cjnkh
else if (x[i*n+j]>=xMax)cjnkh
r[i*n+j] = 1.0;cjnkh
elsecjnkh
r[i*n+j] = (x[i*n+j]-xMin)/(xMax-xMin);cjnkh
}cjnkh
break;cjnkh
case '-':cjnkh
for (j=0; jcjnkh
{cjnkh
if (x[i*n+j]<=xMin)cjnkh
r[i*n+j] = 1.0;cjnkh
else if (x[i*n+j]>=xMax)cjnkh
r[i*n+j] = 0.0;cjnkh
elsecjnkh
r[i*n+j] = (xMax-x[i*n+j])/(xMax-xMin);cjnkh
}cjnkh
break;cjnkh
case '^':cjnkh
for (j=0; jcjnkh
{cjnkh
if (xMid<=xMin) //所有特征值均大于适中值,变为xMid~xMax之间的成本型cjnkh
r[i*n+j] = (xMax-x[i*n+j])/(xMax-xMid);cjnkh
else if (xMid>=xMax) //所有特征值均小于适中值,变为xMin~xMid之间的效益型cjnkh
r[i*n+j] = (x[i*n+j]-xMin)/(xMid-xMin);cjnkh
else //正常情况下按照~xMin~xMid~xMax~分段进行标准化cjnkh
{cjnkh
if (x[i*n+j]<=xMin)cjnkh
r[i*n+j] = 0.0;cjnkh
else if (x[i*n+j]<=xMid) //在此区间内为效益型指标cjnkh
r[i*n+j] = (x[i*n+j]-xMin)/(xMid-xMin);cjnkh
else if (x[i*n+j]) //在此区间内为成本型指标cjnkh
r[i*n+j] = (xMax-x[i*n+j])/(xMax-xMid);cjnkh
else cjnkh
r[i*n+j] = 0.0;cjnkh
}cjnkh
}cjnkh
break;cjnkh
default: cjnkh
return -2; //如非效益、成本、居中型之一,则出错返回!cjnkh
}cjnkh
}cjnkh
return 0;cjnkh
}cjnkh
cjnkh
void TStddize::getValue(double *rr)cjnkh
{cjnkh
memcpy(rr, r, m*n*sizeof(double));cjnkh
}cjnkh
cjnkh
cjnkh
TStddize::~TStddize()cjnkh
{cjnkh
delete []x; delete []r; delete []xInfo;cjnkh
delete []xMin; delete []xMax; delete []xMid;cjnkh
}
cjnkh

序号 评论者 共有评论 1   【论坛浏览】  【发表评论】 评论时间
1 conroy 回复 #1 wbadmin 的帖子
不错, 程序逻辑很清晰,数据和操作进行了分离,封装得很好
2007/6/20 17:10
 共有评论数 1  每页显示 10
页码 1/1  |<  <<   1   >>  >| 
登录信息  
文章列表  
Powered by DiY-Page 5.1.2 © 2005-2008