麦子的家

   :: 首页  :: 新随笔  ::  ::  :: 管理

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;
  }


 }
}

posted on 2006-05-26 10:39  麦子  阅读(1594)  评论(5编辑  收藏  举报