⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fuzzypr2.cs

📁 模糊模式识别,类结构,根据陈守煜的方法编写 C#语言
💻 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 + -