Skip to content

WilsonSUN2024/Analytical-Network-Process

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 

Repository files navigation

import xlrd
from numpy import random, dot, exp, array
import numpy as np import pandas as pd
import traceback
import time

def AHP(): def is_identity_matrix(matrix): rows = len(matrix) cols = len(matrix[0]) if rows != cols: return False for i in range(rows): for j in range(cols): if i == j and matrix[i][j] != 1: return False elif i != j and matrix[i][j] != 0: return False return True

def gm(): list1 = [] list2 = [] num = 1 for i in range(rowNum): list1.append(list(judmat_arr_empty[i])) for i in range(len(list1)): for j in range(len(list1[i])): num = num * list1[i][j] list2.append(num ** (1 / len(list1))) num = 1 if sum(list2)==0:
gm_wi = list2 else: gm_wi = list2 / sum(list2)
list2 = np.array(gm_wi).reshape(rowNum, 1) gm_va_pro = judmat_arr_empty @ list2 if sum(list2)==0:
gm_va= np.array([0]) else: gm_va = sum(gm_va_pro / list2) / rowNum if rowNum==1 :
gm_CI = [0] else:
gm_CI = (gm_va-rowNum)/(rowNum-1) if RI[rowNum-1]==0: gm_CR = [0] else: gm_CR = gm_CI/RI[rowNum-1] gm_list=list(gm_wi)+list(gm_va)+list(gm_CI)+list(gm_CR) return gm_list

def amm(): col_sum = np.sum(judmat_arr_empty, axis=0)
a = np.sum(bljz_arr_empty / col_sum, axis=1)
asum = sum(a)
amm_wi = a / asum
list2 = np.array(amm_wi).reshape(rowNum, 1) amm_va_pro = judmat_arr_empty @ list2
amm_va = sum(amm_va_pro / list2) / rowNum
if rowNum==1:
amm_CI = [0] else: amm_CI = (amm_va - rowNum) / (rowNum - 1)
if RI[rowNum-1]==0: amm_CR = [0] else: amm_CR = amm_CI / RI[rowNum-1] amm_list=list(amm_wi)+list(amm_va)+list(amm_CI)+list(amm_CR) return amm_list

def eig(): eigen_values, eigen_vectors = np.linalg.eig(judmat_arr_empty) max_eigen_value_index = np.argmax(eigen_values)
eig_va=eigen_values[max_eigen_value_index] eig_vec=eigen_vectors[:,max_eigen_value_index]

    if is_identity_matrix(judmat_arr_empty):      
        eig_wi = []
        for i in range(len(judmat_arr_empty)):
            eig_wi.append(0)
    else:                                         
        eig_wi=eigen_vectors[:,max_eigen_value_index]/sum(eigen_vectors[:,max_eigen_value_index])
    print(rowNum)
    print(eig_wi)
    if rowNum ==1 :
        arr_eig_wi = np.array(eig_wi)  
        rowNum_nozero = np.count_nonzero(arr_eig_wi)
        eig_CI = 0
    else:
        arr_eig_wi = np.array(eig_wi)  
        rowNum_nozero = np.count_nonzero(arr_eig_wi)
        eig_CI = (eig_va - rowNum_nozero) / (rowNum_nozero - 1)
    if RI[rowNum_nozero-1]==0:
        eig_CR = 0
    else:
        eig_CR = eig_CI / RI[rowNum_nozero-1]                      
    eig_list = np.array([eig_va.real,eig_CI.real,eig_CR.real])                     
    eig_arr=np.append(eig_wi,eig_list).real
    return eig_arr

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('max_colwidth', 200)

table_ys = xlrd.open_workbook(r".\ANP_Dataset_1.xls", 'rb')
sheet_ys = table_ys.sheet_names()
sheet_num = len(sheet_ys)
writer = pd.ExcelWriter('001-AHP_Result.xls') 
# print(sheet_num)                          
for k in range(sheet_num):                  
    sheet_ys = table_ys.sheet_by_index(k)
    rowNum = sheet_ys.nrows - 1
    colNum = sheet_ys.ncols - 1
    newlist = []
    for i in range(rowNum):
        rowi = sheet_ys.row_values(i+1)
        newlist.append((rowi[1:]))
    bljz_arr_empty = np.empty([rowNum, colNum])
    for i in range(rowNum):
        judmat_arr_empty[i] = array(newlist[i])

    RI=[0,0,0.52,0.89,1.12,1.24,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59,1.5943] 
    colname=[]
    for i in range(rowNum):
        colname.append('w{}'.format(i+1))
    list333=['lmax','CI','CR']
    for i in list333:
        colname.append(i)
    rowname = ['Geometric Mean Method', 'Arithmetic Mean Method', 'Eigenvector Method']
    if rowNum==1:
        c = np.random.uniform(0, 0, [3, len(judmat_arr_empty) + 3])
        print(c)
        for i in range(len(c)):
            c[i,0]=1
    elif is_identity_matrix(judmat_arr_empty):
        c=np.random.uniform(0,0,[3,len(judmat_arr_empty)+3])         
    else:
        c=np.array([gm(),amm(),eig()])
    df = pd.DataFrame(c,columns=colname,index=rowname)
    print(df)
    df.to_excel(excel_writer=writer, sheet_name='Weight Coefficient{}'.format(k+1)) 
    writer.save()
    writer.close()

def construct_general_supermatrix(): global num_C,A,B print('\n--------------------Supermatrix Calculation------------------------------\n') num_C= int(input('Please enter the total number of major C (factor sets):')) num_Cij = int(input('Please enter the total number of Cij (factors): ')) table_ys = xlrd.open_workbook(r".\001-AHP_Result.xls", 'rb') sheet_ys = table_ys.sheet_names() sheet_num = len(sheet_ys) newlist = [] for k in range(sheet_num-num_C):
sheet_ys = table_ys.sheet_by_index(k+num_C) rowNum = sheet_ys.nrows - 3 colNum = sheet_ys.ncols - 4 for i in range(rowNum): rowi = sheet_ys.row_values(i + 3) for j in range(len(rowi[1:][:-3])):
newlist.append(rowi[1:][:-3][j]) A = np.array(newlist).reshape(num_Cij,num_Cij).T print(A) writer = pd.ExcelWriter('002-Supermatrix-Weight_Matrix.xls') A = pd.DataFrame(A) A.columns=range(1,len(A.columns)+1)
A.index=range(1,len(A.index)+1)
A.to_excel(excel_writer=writer, sheet_name='Supermatrix')
writer.save()

print('\n---------------------Start Weight Matrix Calculation-------------------\n')
newlist2 = []
for k in range(num_C):                            
    sheet_ys = table_ys.sheet_by_index(k)
    rowNum = sheet_ys.nrows - 3
    colNum = sheet_ys.ncols - 4
    for i in range(rowNum):
        rowi = sheet_ys.row_values(i + 3)
        newlist2.append(rowi[1:][:-3])
B = np.array(newlist2).reshape(num_C,num_C).T
print(B)
B = pd.DataFrame(B)
B.columns = range(1, len(B.columns) + 1) 
B.index = range(1, len(B.index) + 1) 
B.to_excel(excel_writer=writer, sheet_name='Weight Matrix') 
writer.save()
writer.close()






def jqcjz():                         # 加权超矩阵

print('\n-----------------开始计算加权超矩阵------------------\n')
listCij_num = []
#  得知超矩阵的组成
for k in range(num_C):
    a = int(input(f'请告知您C{k+1}内的因素个数:'))
    listCij_num.append(a)
lCs = [0]
t=0
for i in listCij_num:                  # 数据处理
    t = i+t
    lCs.append(t)
# print(lCs)
# 读取数据进行运算
C=np.array(A)                     # array 化 A --超矩阵
D=np.array(B)                     # array 化 B --加权矩阵
# print(D)
for i in range(num_C):                  # 行次数  --大C           # 矩阵一个位置扩大x倍
    for k in range(num_C):              # 列次数  --大C           # 矩阵一个位置扩大x倍
        C[lCs[i]:lCs[i+1],lCs[k]:lCs[k+1]]*=D[i,k]

# 归一化
C_sum = np.sum(C,axis=0)
for i in range(len(C_sum)):
    if C_sum[i] == 0 :
        C_sum[i] = 1
print(C_sum)
C = C/C_sum
print(C)
#存储数据
JQCJZ = pd.DataFrame(C)
JQCJZ.columns = range(1, len(JQCJZ.columns) + 1)  # 调整列标
JQCJZ.index = range(1, len(JQCJZ.index) + 1)  # 调整行标
writer = pd.ExcelWriter('003-加权超矩阵.xls')  # 数据写入的表单创建
JQCJZ.to_excel(excel_writer=writer, sheet_name='加权超矩阵')  # 把数据输出到excel
writer.save()
writer.close()

About

This is a automated programming to calculate the relative weight of each factors

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published