物元可拓法于80年代由我国蔡文教授创立,目前已广泛应用于新产品构思与设计、优化决策、控制、识别与评价等各个领域,无论在理论还是在实践上都发挥了越来越重要的作用。
物元是描述事物的名称、特征及量值3个基本元素的简称,在形式上可记为M=(N,c,v)=(N,c,c(N))。其中M、N、c、v分别是Matter、Name, Character, Value的缩写。可拓集合是用关联度将模糊集合的[0,1]闭合区间连续取值拓广到(-∞,+∞)实数轴,以表达物元的量值为实轴上的一点时符合要求的程度。物元分析是研究物元及其变化并用以解决矛盾问题的规律和方法,可拓学是用形式化的工具,从定性和定量两个角度去研究解决矛盾问题的规律和方法。物元可拓法结合二者,是将辨证逻辑和形式逻辑相结合的可拓逻辑,丰富了事物的内涵,客观地反映了物质世界的真实状态。
本次选用评价因子污染贡献率方法来确定权系数。主要计算程序:
Dim sRow As Integer, sCol As Integer    '起始的行与列
 Dim i As Integer, j As Integer          '循环变量
Dim i As Integer, j As Integer          '循环变量
 Dim Xj As Double                        '定义实测值
Dim Xj As Double                        '定义实测值
 Dim Aij As Double, Bij As Double        '定义标准域区间
Dim Aij As Double, Bij As Double        '定义标准域区间
 Dim Apj As Double, Bpj As Double        '定义节域变量
Dim Apj As Double, Bpj As Double        '定义节域变量
 Dim YZS As Integer                      '定义评价因子个数
Dim YZS As Integer                      '定义评价因子个数
 Dim DJS As Integer                      '定义评价等级数
Dim DJS As Integer                      '定义评价等级数
 '得到起始行列值
'得到起始行列值
 sRow = InputBox("请输入监测数据第一个数的行号!", "输入行号", 0)
sRow = InputBox("请输入监测数据第一个数的行号!", "输入行号", 0)
 sCol = InputBox("请输入监测数据第一个数的列号!", "输入列号", 0)
sCol = InputBox("请输入监测数据第一个数的列号!", "输入列号", 0)
 YZS = InputBox("请输入评价因子个数!", "输入因子个数", 0)
YZS = InputBox("请输入评价因子个数!", "输入因子个数", 0)
 DJS = InputBox("请输入评价等级个数!", "输入评价等级数", 0)
DJS = InputBox("请输入评价等级个数!", "输入评价等级数", 0)
 '插入标记列文字
'插入标记列文字
 With Sheets("sheet1")
With Sheets("sheet1")
 For i = 1 To DJS
  For i = 1 To DJS
 Cells(sRow + DJS + 2 + i, sCol - 1).Value = "关联函数k_等级" & i
      Cells(sRow + DJS + 2 + i, sCol - 1).Value = "关联函数k_等级" & i
 Next i
  Next i
 Cells(sRow + 2 * DJS + 3, sCol - 1).Value = "X/S"
  Cells(sRow + 2 * DJS + 3, sCol - 1).Value = "X/S"
 Cells(sRow + 2 * DJS + 4, sCol - 1).Value = "归一化权重"
  Cells(sRow + 2 * DJS + 4, sCol - 1).Value = "归一化权重"
 For i = 1 To DJS
  For i = 1 To DJS
 Cells(sRow + 2 * DJS + 4 + i, sCol - 1).Value = "关联度K_等级" & i
      Cells(sRow + 2 * DJS + 4 + i, sCol - 1).Value = "关联度K_等级" & i
 Next i
  Next i
 Cells(sRow + 3 * DJS + 5, sCol - 1).Value = "可拓指数"
  Cells(sRow + 3 * DJS + 5, sCol - 1).Value = "可拓指数"
 
  
 '按列循环计算
  '按列循环计算
 For j = sCol To sCol + YZS - 1
  For j = sCol To sCol + YZS - 1
 '赋初值
    '赋初值
 Xj = Cells(sRow, j).Value            '实测值
    Xj = Cells(sRow, j).Value            '实测值
 Apj = Cells(sRow + 1, j).Value       '可拓域最小值
    Apj = Cells(sRow + 1, j).Value       '可拓域最小值
 Bpj = Cells(sRow + DJS + 2, j).Value '可拓域最大值
    Bpj = Cells(sRow + DJS + 2, j).Value '可拓域最大值
 
    
 For i = 1 To DJS
    For i = 1 To DJS
 '对aij,bij赋值
      '对aij,bij赋值
 Aij = Cells(sRow + i, j).Value
      Aij = Cells(sRow + i, j).Value
 Bij = Cells(sRow + i + 1, j).Value
      Bij = Cells(sRow + i + 1, j).Value
 
      
 '按条件选择公式计算关联度
      '按条件选择公式计算关联度
 If Xj > Aij And Xj < Bij Then 'xj<Xij 点x位于本标准之内
      If Xj > Aij And Xj < Bij Then 'xj<Xij 点x位于本标准之内
 
      
 If Xj <= ((Aij + Bij) / 2) Then
        If Xj <= ((Aij + Bij) / 2) Then
 Cells(sRow + i + DJS + 2, j).Value = -(Aij - Xj) / (Bij - Aij)
          Cells(sRow + i + DJS + 2, j).Value = -(Aij - Xj) / (Bij - Aij)
 Else
        Else
 Cells(sRow + i + DJS + 2, j).Value = -(Xj - Bij) / (Bij - Aij)
          Cells(sRow + i + DJS + 2, j).Value = -(Xj - Bij) / (Bij - Aij)
 End If
        End If
 
        
 Else          'xj<>Xij 点x位于本标准之外
      Else          'xj<>Xij 点x位于本标准之外
 
      
 If Xj < Aij Then 'x位于标准的左边,此时有x<(ai+bi)/2
        If Xj < Aij Then 'x位于标准的左边,此时有x<(ai+bi)/2
 
        
 If Xj <= (Apj + Bpj) / 2 Then
          If Xj <= (Apj + Bpj) / 2 Then
 Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (Apj - Aij)
            Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (Apj - Aij)
 Else
          Else
 Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (2 * Xj - Bpj - Aij)
            Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (2 * Xj - Bpj - Aij)
 End If
          End If
 
        
 ElseIf Xj > Bij Then 'x位于标准的右边,此时有x>(ai+bi)/2
        ElseIf Xj > Bij Then 'x位于标准的右边,此时有x>(ai+bi)/2
 
        
 If Xj <= (Apj + Bpj) / 2 Then
          If Xj <= (Apj + Bpj) / 2 Then
 Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Apj + Bij - 2 * Xj)
            Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Apj + Bij - 2 * Xj)
 Else
          Else
 Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Bij - Bpj)
            Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Bij - Bpj)
 End If
          End If
 
          
 End If
        End If
 End If
      End If
 Next i
    Next i
 Next j
  Next j
 
  

 '计算X/S
    '计算X/S
 For j = sCol To sCol + YZS - 1
    For j = sCol To sCol + YZS - 1
 Dim a As Double
        Dim a As Double
 a = 0
        a = 0
 For i = 1 To DJS + 2
        For i = 1 To DJS + 2
 a = a + Cells(sRow + i, j)
            a = a + Cells(sRow + i, j)
 Next i
        Next i
 Cells(sRow + 2 * DJS + 3, j).Value = Cells(sRow, j).Value * (DJS + 2) / a
        Cells(sRow + 2 * DJS + 3, j).Value = Cells(sRow, j).Value * (DJS + 2) / a
 Next j
    Next j
 '计算权重
    '计算权重
 '计算x/s的总和
    '计算x/s的总和
 a = 0
    a = 0
 For i = sCol To sCol + YZS - 1
    For i = sCol To sCol + YZS - 1
 a = a + Cells(sRow + 2 * DJS + 3, i)
        a = a + Cells(sRow + 2 * DJS + 3, i)
 Next i
    Next i
 
    
 For j = sCol To sCol + YZS - 1
    For j = sCol To sCol + YZS - 1
 Cells(sRow + 2 * DJS + 4, j).Value = Cells(sRow + 2 * DJS + 3, j).Value / a
        Cells(sRow + 2 * DJS + 4, j).Value = Cells(sRow + 2 * DJS + 3, j).Value / a
 Next j
    Next j
 
    
 '计算关联度
    '计算关联度
 Cells(sRow + 2 * DJS + 4, sCol + YZS) = "综合关联度"
    Cells(sRow + 2 * DJS + 4, sCol + YZS) = "综合关联度"
 For i = 1 To DJS
    For i = 1 To DJS
 For j = sCol To sCol + YZS - 1
        For j = sCol To sCol + YZS - 1
 Cells(sRow + 2 * DJS + 4 + i, j).Value = Cells(sRow + DJS + 2 + i, j).Value * Cells(sRow + 2 * DJS + 4, j).Value
            Cells(sRow + 2 * DJS + 4 + i, j).Value = Cells(sRow + DJS + 2 + i, j).Value * Cells(sRow + 2 * DJS + 4, j).Value
 Next j
        Next j
 Dim k As Integer
        Dim k As Integer
 a = 0
        a = 0
 For k = sCol To sCol + YZS - 1
        For k = sCol To sCol + YZS - 1
 a = a + Cells(sRow + 2 * DJS + 4 + i, k) '综合关联度累加
           a = a + Cells(sRow + 2 * DJS + 4 + i, k) '综合关联度累加
 Next k
        Next k
 Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value = a
        Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value = a
 Next i
    Next i
 '计算可拓指数
    '计算可拓指数
 '找最小与最大关联度
    '找最小与最大关联度
 Dim Kmax, Kmin As Double
    Dim Kmax, Kmin As Double
 Kmax = Cells(sRow + 2 * DJS + 4 + 1, sCol + YZS).Value
    Kmax = Cells(sRow + 2 * DJS + 4 + 1, sCol + YZS).Value
 Kmin = Kmax
    Kmin = Kmax
 For i = 2 To DJS
    For i = 2 To DJS
 If Kmax < Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then
      If Kmax < Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then
 Kmax = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value
        Kmax = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value
 End If
      End If
 If Kmin > Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then
      If Kmin > Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then
 Kmin = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value
        Kmin = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value
 End If
      End If
 Next i
    Next i
 
    
 Dim KXP() As Double
    Dim KXP() As Double
 ReDim KXP(DJS) As Double
    ReDim KXP(DJS) As Double
 For i = 1 To DJS
    For i = 1 To DJS
 KXP(i) = (Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value - Kmin) / (Kmax - Kmin)
      KXP(i) = (Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value - Kmin) / (Kmax - Kmin)
 Next i
    Next i
 Dim FZ, FM As Double
    Dim FZ, FM As Double
 For i = 1 To DJS
    For i = 1 To DJS
 FZ = FZ + i * KXP(i)
      FZ = FZ + i * KXP(i)
 FM = FM + KXP(i)
      FM = FM + KXP(i)
 Next i
    Next i
 Cells(sRow + 3 * DJS + 5, sCol).Value = FZ / FM
    Cells(sRow + 3 * DJS + 5, sCol).Value = FZ / FM
 End With
End With
实例文件 Dim i As Integer, j As Integer          '循环变量
Dim i As Integer, j As Integer          '循环变量 Dim Xj As Double                        '定义实测值
Dim Xj As Double                        '定义实测值 Dim Aij As Double, Bij As Double        '定义标准域区间
Dim Aij As Double, Bij As Double        '定义标准域区间 Dim Apj As Double, Bpj As Double        '定义节域变量
Dim Apj As Double, Bpj As Double        '定义节域变量 Dim YZS As Integer                      '定义评价因子个数
Dim YZS As Integer                      '定义评价因子个数 Dim DJS As Integer                      '定义评价等级数
Dim DJS As Integer                      '定义评价等级数 '得到起始行列值
'得到起始行列值 sRow = InputBox("请输入监测数据第一个数的行号!", "输入行号", 0)
sRow = InputBox("请输入监测数据第一个数的行号!", "输入行号", 0) sCol = InputBox("请输入监测数据第一个数的列号!", "输入列号", 0)
sCol = InputBox("请输入监测数据第一个数的列号!", "输入列号", 0) YZS = InputBox("请输入评价因子个数!", "输入因子个数", 0)
YZS = InputBox("请输入评价因子个数!", "输入因子个数", 0) DJS = InputBox("请输入评价等级个数!", "输入评价等级数", 0)
DJS = InputBox("请输入评价等级个数!", "输入评价等级数", 0) '插入标记列文字
'插入标记列文字 With Sheets("sheet1")
With Sheets("sheet1") For i = 1 To DJS
  For i = 1 To DJS Cells(sRow + DJS + 2 + i, sCol - 1).Value = "关联函数k_等级" & i
      Cells(sRow + DJS + 2 + i, sCol - 1).Value = "关联函数k_等级" & i Next i
  Next i Cells(sRow + 2 * DJS + 3, sCol - 1).Value = "X/S"
  Cells(sRow + 2 * DJS + 3, sCol - 1).Value = "X/S" Cells(sRow + 2 * DJS + 4, sCol - 1).Value = "归一化权重"
  Cells(sRow + 2 * DJS + 4, sCol - 1).Value = "归一化权重" For i = 1 To DJS
  For i = 1 To DJS Cells(sRow + 2 * DJS + 4 + i, sCol - 1).Value = "关联度K_等级" & i
      Cells(sRow + 2 * DJS + 4 + i, sCol - 1).Value = "关联度K_等级" & i Next i
  Next i Cells(sRow + 3 * DJS + 5, sCol - 1).Value = "可拓指数"
  Cells(sRow + 3 * DJS + 5, sCol - 1).Value = "可拓指数" 
   '按列循环计算
  '按列循环计算 For j = sCol To sCol + YZS - 1
  For j = sCol To sCol + YZS - 1 '赋初值
    '赋初值 Xj = Cells(sRow, j).Value            '实测值
    Xj = Cells(sRow, j).Value            '实测值 Apj = Cells(sRow + 1, j).Value       '可拓域最小值
    Apj = Cells(sRow + 1, j).Value       '可拓域最小值 Bpj = Cells(sRow + DJS + 2, j).Value '可拓域最大值
    Bpj = Cells(sRow + DJS + 2, j).Value '可拓域最大值 
     For i = 1 To DJS
    For i = 1 To DJS '对aij,bij赋值
      '对aij,bij赋值 Aij = Cells(sRow + i, j).Value
      Aij = Cells(sRow + i, j).Value Bij = Cells(sRow + i + 1, j).Value
      Bij = Cells(sRow + i + 1, j).Value 
       '按条件选择公式计算关联度
      '按条件选择公式计算关联度 If Xj > Aij And Xj < Bij Then 'xj<Xij 点x位于本标准之内
      If Xj > Aij And Xj < Bij Then 'xj<Xij 点x位于本标准之内 
       If Xj <= ((Aij + Bij) / 2) Then
        If Xj <= ((Aij + Bij) / 2) Then Cells(sRow + i + DJS + 2, j).Value = -(Aij - Xj) / (Bij - Aij)
          Cells(sRow + i + DJS + 2, j).Value = -(Aij - Xj) / (Bij - Aij) Else
        Else Cells(sRow + i + DJS + 2, j).Value = -(Xj - Bij) / (Bij - Aij)
          Cells(sRow + i + DJS + 2, j).Value = -(Xj - Bij) / (Bij - Aij) End If
        End If 
         Else          'xj<>Xij 点x位于本标准之外
      Else          'xj<>Xij 点x位于本标准之外 
       If Xj < Aij Then 'x位于标准的左边,此时有x<(ai+bi)/2
        If Xj < Aij Then 'x位于标准的左边,此时有x<(ai+bi)/2 
         If Xj <= (Apj + Bpj) / 2 Then
          If Xj <= (Apj + Bpj) / 2 Then Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (Apj - Aij)
            Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (Apj - Aij) Else
          Else Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (2 * Xj - Bpj - Aij)
            Cells(sRow + i + DJS + 2, j).Value = (Aij - Xj) / (2 * Xj - Bpj - Aij) End If
          End If 
         ElseIf Xj > Bij Then 'x位于标准的右边,此时有x>(ai+bi)/2
        ElseIf Xj > Bij Then 'x位于标准的右边,此时有x>(ai+bi)/2 
         If Xj <= (Apj + Bpj) / 2 Then
          If Xj <= (Apj + Bpj) / 2 Then Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Apj + Bij - 2 * Xj)
            Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Apj + Bij - 2 * Xj) Else
          Else Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Bij - Bpj)
            Cells(sRow + i + DJS + 2, j).Value = (Xj - Bij) / (Bij - Bpj) End If
          End If 
           End If
        End If End If
      End If Next i
    Next i Next j
  Next j 
  
 '计算X/S
    '计算X/S For j = sCol To sCol + YZS - 1
    For j = sCol To sCol + YZS - 1 Dim a As Double
        Dim a As Double a = 0
        a = 0 For i = 1 To DJS + 2
        For i = 1 To DJS + 2 a = a + Cells(sRow + i, j)
            a = a + Cells(sRow + i, j) Next i
        Next i Cells(sRow + 2 * DJS + 3, j).Value = Cells(sRow, j).Value * (DJS + 2) / a
        Cells(sRow + 2 * DJS + 3, j).Value = Cells(sRow, j).Value * (DJS + 2) / a Next j
    Next j '计算权重
    '计算权重 '计算x/s的总和
    '计算x/s的总和 a = 0
    a = 0 For i = sCol To sCol + YZS - 1
    For i = sCol To sCol + YZS - 1 a = a + Cells(sRow + 2 * DJS + 3, i)
        a = a + Cells(sRow + 2 * DJS + 3, i) Next i
    Next i 
     For j = sCol To sCol + YZS - 1
    For j = sCol To sCol + YZS - 1 Cells(sRow + 2 * DJS + 4, j).Value = Cells(sRow + 2 * DJS + 3, j).Value / a
        Cells(sRow + 2 * DJS + 4, j).Value = Cells(sRow + 2 * DJS + 3, j).Value / a Next j
    Next j 
     '计算关联度
    '计算关联度 Cells(sRow + 2 * DJS + 4, sCol + YZS) = "综合关联度"
    Cells(sRow + 2 * DJS + 4, sCol + YZS) = "综合关联度" For i = 1 To DJS
    For i = 1 To DJS For j = sCol To sCol + YZS - 1
        For j = sCol To sCol + YZS - 1 Cells(sRow + 2 * DJS + 4 + i, j).Value = Cells(sRow + DJS + 2 + i, j).Value * Cells(sRow + 2 * DJS + 4, j).Value
            Cells(sRow + 2 * DJS + 4 + i, j).Value = Cells(sRow + DJS + 2 + i, j).Value * Cells(sRow + 2 * DJS + 4, j).Value Next j
        Next j Dim k As Integer
        Dim k As Integer a = 0
        a = 0 For k = sCol To sCol + YZS - 1
        For k = sCol To sCol + YZS - 1 a = a + Cells(sRow + 2 * DJS + 4 + i, k) '综合关联度累加
           a = a + Cells(sRow + 2 * DJS + 4 + i, k) '综合关联度累加 Next k
        Next k Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value = a
        Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value = a Next i
    Next i '计算可拓指数
    '计算可拓指数 '找最小与最大关联度
    '找最小与最大关联度 Dim Kmax, Kmin As Double
    Dim Kmax, Kmin As Double Kmax = Cells(sRow + 2 * DJS + 4 + 1, sCol + YZS).Value
    Kmax = Cells(sRow + 2 * DJS + 4 + 1, sCol + YZS).Value Kmin = Kmax
    Kmin = Kmax For i = 2 To DJS
    For i = 2 To DJS If Kmax < Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then
      If Kmax < Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then Kmax = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value
        Kmax = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value End If
      End If If Kmin > Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then
      If Kmin > Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value Then Kmin = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value
        Kmin = Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value End If
      End If Next i
    Next i 
     Dim KXP() As Double
    Dim KXP() As Double ReDim KXP(DJS) As Double
    ReDim KXP(DJS) As Double For i = 1 To DJS
    For i = 1 To DJS KXP(i) = (Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value - Kmin) / (Kmax - Kmin)
      KXP(i) = (Cells(sRow + 2 * DJS + 4 + i, sCol + YZS).Value - Kmin) / (Kmax - Kmin) Next i
    Next i Dim FZ, FM As Double
    Dim FZ, FM As Double For i = 1 To DJS
    For i = 1 To DJS FZ = FZ + i * KXP(i)
      FZ = FZ + i * KXP(i) FM = FM + KXP(i)
      FM = FM + KXP(i) Next i
    Next i Cells(sRow + 3 * DJS + 5, sCol).Value = FZ / FM
    Cells(sRow + 3 * DJS + 5, sCol).Value = FZ / FM End With
End With 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号