using System;
using KarstIModel;
namespace KarstModel
{
/// <summary>
/// FuzzyJudge 模糊综合评判方法。
/// </summary>
public class FuzzyJudge:IModel
{
private bool hasPara=false;//是否设置了所有参数
private double[,] r;//单因素评判矩阵,行数与权重分配矩阵列数相同,列数与评判集
矩阵列数相同
private double[,] rr;//r的原始数据
private double[] u;//权重分配向量(一维矩阵)
private double[] v;//评判集向量(一维矩阵)
private double[] b;//评判结果向量(一维矩阵)
private double result;//以结果向量为权表述的计算结果
private System.Windows.Forms.CheckedListBox.CheckedIndexCollection
preTreatment;//数据预处理,多选项:标准差变换和极差变换
private long methodID;
private int[] GoeID;
public FuzzyJudge()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IModel 成员
public void run()
{
if(!hasPara) return;
//标准化
rr=new double[r.GetUpperBound(0)+1,r.GetUpperBound(1)+1];
for(int i=0;i<r.GetUpperBound(0)+1;i++)
for(int j=0;j<r.GetUpperBound(1)+1;j++)
rr[i,j] =r[i,j];
if(preTreatment.Count>0)
{
if(preTreatment.Contains(0)) r=DataStandard.Standardization
(r);
if(preTreatment.Contains(1)) r=DataStandard.Difference(r);
}
switch(methodID)
{
case 0:b=Judge1(r,u);break;
case 1:b=Judge2(r,u);break;
case 2:b=Judge3(r,u);break;
case 3:b=Judge4(r,u);break;
}
result=0;
double d1=0,d2=0;
for(int i=0;i<b.Length;i++)
{
d1=d1+b[i]*v[i];
d2=d2+b[i];
}
result=d1/d2;
}
public bool setParameters(System.Collections.Hashtable para)
{
try
{
GoeID=(int [])para["GoeID"];
r=(double [,])para["r"];
u=(double [])para["u"];
v=(double [])para["v"];
preTreatment=
(System.Windows.Forms.CheckedListBox.CheckedIndexCollection)para["preTreatment"];
methodID=(long)para["methodID"];
//单因素评判矩阵:行数与权重分配矩阵列数相同,列数与评判集矩阵
列数相同
if((r.GetUpperBound(0)+1!=u.Length)||(r.GetUpperBound(1)+1!
=v.Length))
{
System.Windows.Forms.MessageBox.Show("单因素评判矩阵:
行数与权重分配矩阵列数应该相同,列数与评判集矩阵列数应该相同");
return false;
}
b=new double[r.GetUpperBound(1)+1];
hasPara=true;
return true;
}
catch
{
return true;
}
}
public System.Collections.Hashtable GetParameters()
{
// TODO: 添加 FuzzyJudge.GetParameters 实现
return null;
}
public System.Collections.Hashtable GetResult()
{
// TODO: 添加 FuzzyJudge.GetResult 实现
return null;
}
public System.Data.DataTable GetResultAsTable()
{
// TODO: 添加 FuzzyJudge.GetResultAsTable 实现
return null;
}
public string GetResultAsString()
{
string sR="";
//显示评判集各元素
sR=sR+"共有"+(r.GetUpperBound(1)+1)+"个评判元素\n";
for(int i=0;i<r.GetUpperBound(1)+1;i++)
sR=sR+" "+v[i]+" ";
sR=sR+"\n";
//显示权向量各元素
sR=sR+"共有"+(r.GetUpperBound(0)+1)+"个权向量元素\n";
for(int i=0;i<r.GetUpperBound(0)+1;i++)
sR=sR+" "+u[i]+" ";
sR=sR+"\n";
//显示评判矩阵各元素
sR=sR+"评判矩阵为"+(r.GetUpperBound(0)+1)+"行,"+(r.GetUpperBound(1)
+1)+"列矩阵:\n";
for(int i=0;i<r.GetUpperBound(0)+1;i++)
{
for(int j=0;j<r.GetUpperBound(1)+1;j++)
sR=sR+" "+rr[i,j]+" ";
sR=sR+"\n";
}
//显示综合评判方法
switch(methodID)
{
case 0:sR=sR+"--综合评判方法:模糊变换M(∧∨)-
-"+"\n";break;
case 1:sR=sR+"--综合评判方法:以乘代替取小M(·∨)-
-"+"\n";break;
case 2:sR=sR+"--综合评判方法:以加代替取大M(∧+)-
-"+"\n";break;
case 3:sR=sR+"--综合评判方法:加权平均M(·+)-
-"+"\n";break;
}
//显示评判结果
sR=sR+"评判结果向量元素\n";
for(int i=0;i<r.GetUpperBound(1)+1;i++)
sR=sR+" "+b[i]+" ";
sR=sR+"\n";
//以结果向量为权表述的计算结果
sR=sR+"以结果向量为权表述的计算结果:"+result;
return sR;
}
public string GetKeywords()
{
// TODO: 添加 FuzzyJudge.GetKeywords 实现
return null;
}
public string GetDiscription()
{
// TODO: 添加 FuzzyJudge.GetDiscription 实现
return null;
}
public string GetSubjects()
{
// TODO: 添加 FuzzyJudge.GetSubjects 实现
return null;
}
public IModel[] GetChildren()
{
// TODO: 添加 FuzzyJudge.GetChildren 实现
return null;
}
public ParaData[] GetParaData()
{
ParaData[] ans=new ParaData[5];
ans[0]=new ParaData(-1,"r","单因素评判矩阵r(两维)",2,"double","单因素
评判矩阵,行数与权重分配矩阵列数相同,列数与评判集矩阵列数相同","");
ans[1]=new ParaData(-1,"preTreatment","评判矩阵需数据预处理(多
选)",4,"int","数据预处理(多选项)","标准差变换,极差变换");
ans[2]=new ParaData(-1,"u","权重分配向量u(一维矩阵)",1,"double","权重
分配矩阵,相加等于1","");
ans[3]=new ParaData(-1,"v","评判集向量v(一维矩阵)",1,"double","评判集
矩阵","");
ans[4]=new ParaData(-1,"methodID","评判方法(单选)",3,"int","评判方法(
单选)","模糊变换M(∧∨),以乘代替取小M(·∨),以加代替取大M(∧+),加权平均M(·+)");
return ans;
}
public ModelData GetModelData()
{
ModelData ans=new ModelData();
ans.name="FuzzyJudge";
ans.realName="模糊综合评判(常规)";
ans.useMethod="按向导输入参数后运行即可";
ans.uses="模糊综合评判(常规)";
ans.filename="karstModel.dll";
ans.description="模糊综合评判(常规)";
ans.keyWords="模糊综合评判(常规)";
ans.classes=4;
return ans;
}
#endregion
/// <summary>
/// 评判方法:模糊变换M(∧∨)
/// r:评判矩阵,u:权重矩阵,
/// 返回结果为证券结果矩阵b
/// </summary>
private double[] Judge1(double[,] r,double[] u)
{
int M,N,i,j;
N=r.GetUpperBound(0)+1;M=r.GetUpperBound(1)+1;
double[] b=new double[M];
for(j=0;j<M;j++)
for(i=0;i<N;i++)
if(u[i]<r[i,j]) r[i,j]=u[i];//取小
for(j=0;j<M;j++)
{
b[j]=0;
for(i=0;i<N;i++)
if(b[j]<r[i,j])b[j]=r[i,j];//取大
}
return b;
}
/// <summary>
/// 评判方法:以乘代替取小M(·∨)
/// r:评判矩阵,u:权重矩阵
/// 返回结果为证券结果矩阵b
/// </summary>
private double[] Judge2(double[,] r,double[] u)
{
int M,N,i,j;
N=r.GetUpperBound(0)+1;M=r.GetUpperBound(1)+1;
double[] b=new double[M];
for(j=0;j<M;j++)
for(i=0;i<N;i++)
r[i,j]=u[i]*r[i,j];//取乘
for(j=0;j<M;j++)
{
b[j]=0;
for(i=0;i<N;i++)
if(b[j]<r[i,j])b[j]=r[i,j];//取大
}
return b;
}
/// <summary>
/// 评判方法:以加代替取大M(∧+)
/// r:评判矩阵,u:权重矩阵
/// 返回结果为证券结果矩阵b
/// </summary>
private double[] Judge3(double[,] r,double[] u)
{
int M,N,i,j;
N=r.GetUpperBound(0)+1;M=r.GetUpperBound(1)+1;
double[] b=new double[M];
for(j=0;j<M;j++)
for(i=0;i<N;i++)
if(u[i]<r[i,j]) r[i,j]=u[i];//取小
for(j=0;j<M;j++)
{
b[j]=0;
for(i=0;i<N;i++)
b[j]=b[j]+r[i,j];//取加
}
return b;
}
/// <summary>
/// 评判方法:加权平均M(·+)
/// r:评判矩阵,u:权重矩阵
/// 返回结果为证券结果矩阵b
/// </summary>
private double[] Judge4(double[,] r,double[] u)
{
int M,N,i,j;
N=r.GetUpperBound(0)+1;M=r.GetUpperBound(1)+1;
double[] b=new double[M];
for(j=0;j<M;j++)
for(i=0;i<N;i++)
r[i,j]=r[i,j]*u[i];//取乘
for(j=0;j<M;j++)
{
b[j]=0;
for(i=0;i<N;i++)
b[j]=b[j]+r[i,j];//取加
}
return b;
}
}
}