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