📄 fuzzypr2.cs
字号:
using System;
using System.Collections;
namespace KarstModel
{
/// <summary>
/// FuzzyPR ,模糊模型识别,陈守煜的方法。
/// </summary>
public class FuzzyPR: IModel
{
private int n;//样品个数
private int m;//指标个数
private int c;//类别数
private double[,] y;//指标分类标准值
private double[,] s;//标准指标相对隶属度的矩阵
private double[,] x;//样品的m个指标值向量为x
private double[,] r;//n个样品的相对隶属度组成矩阵R
private int[,] min_max;//样品j的m个指标相对隶属度值落入矩阵S不同的类别上限值
private double[] w1;//等级权重
private double[,] w;//权重矩阵W
private double[,] u;//样品对于各类别的隶属度矩阵U
private int[] grade;//最后等级
private Hashtable parameter;//输入参数,为Hashtable
private bool runed;//是否已执行模型
private bool hasPara;//是否已设置模型所需要的参数
public FuzzyPR()
{
runed=false;
hasPara=false;
}
public void run()
{
computeS();
computeR();
computeMin_max();
computeW();
computeU();
computeGrade();
runed=true;
}
public bool setParameters(Hashtable para)
{
parameter=para;
try
{
//只有以下三个为原始输入数据
//int row=((double [,])para["y"]).GetUpperBound(0);
//int col=((double [,])para["y"]).GetUpperBound(1);
m=((double [,])para["y"]).GetUpperBound(0)-((double [,])para["y"]).GetLowerBound(0);
n=((double [,])para["y"]).GetUpperBound(1)-((double [,])para["y"]).GetLowerBound(1)+1;
c=((double [,])para["x"]).GetUpperBound(0)-((double [,])para["y"]).GetLowerBound(0)+1;
y=new double[m,n];
x=new double[n,c];
w1=new double[c];
//m=y.GetUpperBound(0)+1;
//n=y.GetUpperBound(1)+1;
//c=x.GetUpperBound(0);
y=(double [,])para["y"];
x=(double [,])para["x"];
w1=(double [])para["w1"];
s=new double[m,c+1];
r=new double[n,m];
w=new double[m,n];
u=new double[c,n];
min_max=new int[2,n];
grade=new int[n];
hasPara=true;
return true;
}
catch(Exception e)
{
//MsgBox("输入参数出错:"+e.ToString(),MsgBoxStyle.DefaultButton2,"模型库系统");
e.ToString();
hasPara=false;
return false;
}
}
public Hashtable GetParameters()
{
if (hasPara)
return parameter;
else
return null;
}
public string ResultToString()
{
if (runed)
{
string ans="";
for(int i=0;i<grade.GetUpperBound(0)+1;i++)
ans=ans+grade[i].ToString()+"\n";
////ans=grade.ToString();
return ans;
}
else
return null;
}
public Hashtable GetResult()
{
if (runed)
{
Hashtable ans=new Hashtable();
ans.Add("grade",grade);
return ans;
}
else
return null;
}
public string GetKeywords()
{
string ans="";
return ans;
}
public string GetDiscription()
{
string ans="";
return ans;
}
public string GetSubjects()
{
string ans="";
return ans;
}
public IModel[] GetChildren()
{
return null;//没有子模型
}
private void computeS()
{
for(int i=0;i<m;i++)
for(int h=0;h<=c;h++)
{
s[i,h]=(y[i,h]-y[i,c])/(y[i,0]-y[i,c]);
}
}
private void computeR()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
r[i,j]=(x[i,j]-y[i,c])/(y[i,0]-y[i,c]);
if(r[i,j]>1)r[i,j]=1;
else if (r[i,j]<0) r[i,j]=0;
}
}
private void computeMin_max()
{
for(int j=0;j<n;j++)
{
min_max[0,j]=c;//假设最小类别为C类
min_max[1,j]=0;//假设最大类别为0类
for(int i=0;i<m;i++)
{
for(int h=0;h<c;h++)
{
if(r[i,j]<s[i,h]&&r[i,j]>s[i,h+1]&&min_max[0,j]>h+1)
min_max[0,j]=h+1;
if(r[i,j]<s[i,h]&&r[i,j]>s[i,h+1]&&min_max[1,j]<h+1)
min_max[1,j]=h+1;
}
}
}
}
private void computeW()
{
//计算末归一化的指标
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
for(int h=0;h<c;h++)
{
if (r[i,j]>=s[i,0])
w[i,j]=w1[0];
else if (r[i,j]<=s[i,c])
w[i,j]=w1[c-1];
else if (r[i,j]==s[i,h])
w[i,j]=w1[h];
else if(r[i,j]<s[i,h]&&r[i,j]>=s[i,h+1])
//w[i,j]=1.0+0.1*((r[i,j]-s[i,h])/(s[i,h]-s[i,h])-h);
w[i,j]=(w1[h]-w1[h+1])*(r[i,j]-s[i,h])/(s[i,h]-s[i,h+1])+w1[h];
}
}
//进行归一化
for(int j=0;j<n;j++)
{
double sum=0.0;
for(int i=0;i<m;i++)
sum+=w[i,j];
for(int i=0;i<m;i++)
w[i,j]=w[i,j]/sum;
}
}
private void computeU()
{
for(int h=0;h<c;h++)
for(int j=0;j<n;j++)
{
if(h+1<min_max[0,j]||h+1>min_max[1,j])
u[h,j]=0;
else if (h+1==min_max[0,j]&&h+1==min_max[1,j])
u[h,j]=1;
else
{
double t = 0;
for(int k = min_max[0,j];k< min_max[1,j];k++)
{
double fz = 0;
double fm = 0;
for(int i=0;i<m;i++)
{
double wij = w[i,j];
double rij = r[i,j];
double sih = s[i,h];
double sik = s[i,k];
fz = fz + wij * (rij - sih) * (rij - sih);
fm = fm + wij * (rij - sik) * (rij - sik);
}
t = t + fz / fm;
}
u[h,j]=1/t;
}
}
}
private void computeGrade()
{
int grad;double uij;
for(int j=0;j<n;j++)
{
grad=1;uij=u[0,j];
for(int i=1;i<c;i++)
{
if (u[i,j]>uij)
{
uij=u[i,j];
grad=i+1;
}
}
grade[j]=grad;
}
}
public ParaData[] GetParaData()
{
ParaData[] ans=new ParaData[3];
ans[0]=new ParaData(-1,"x","样品的m个指标值向量为x",2,"double","样品的m个指标值向量为x","");
ans[1]=new ParaData(-1,"y","指标分类标准值y",2,"double","指标分类标准值y","");
ans[2]=new ParaData(-1,"w1","等级权重w1",1,"double","等级权重w1","");
return ans;
}
public ModelData GetModelData()
{
ModelData ans=new ModelData();
ans.name="FuzzyPR";
ans.classes=3;
ans.description="模型识别,FuzzyPR ,模糊模型识别,陈守煜的方法";
ans.filename="Model.dll";
ans.keyWords="模糊模型识别";
ans.realName="模糊模型识别";
ans.useMethod="按向导输入运行";
ans.uses="模型识别,综合评价";
return ans;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -