Translate

Views

Monday, September 11, 2023

Phương pháp AHP code Python

TLTK:  C5_1_HTTT_lec5_1_2017.pptx - Google Trang trình bày

Code Python: (được viết bởi Nguyễn Công Cường)

import numpy as np
tc = ['Price', 'Distance', 'Labor', 'Wage']
pa = ['A', 'B', 'C']

mttc = np.array([
    [1, 1/5, 3, 4],
    [5, 1, 9, 7],
    [1/3, 1/9, 1, 2],
    [1/4, 1/7, 1/2, 1]
])

patc = []
patc.append(np.array([
    [1, 3, 2],
    [1/3, 1, 1/5],
    [1/2, 5, 1]
]))
patc.append(np.array([
    [1, 6, 1/3],
    [1/6, 1, 1/9],
    [3, 9, 1]
]))
patc.append(np.array([
    [1, 1/3, 1],
    [3, 1, 7],
    [1, 1/7, 1]
]))
patc.append(np.array([
    [1, 1/3, 1/2],
    [3, 1, 4],
    [2, 1/4, 1]
]))
# QUÁ TRÌNH XÁC ĐỊNH TỶ SỐ NHẤT QUÁN
# Bước 1: Nhân ma trận so sánh ban đầu với vectơ trọng số(kết quả thu được vectơ tổng trọng số),
# Bước 2: Chia vectơ tổng trọng số cho vectơ trọng số đã được xác định trước đó(kết quả thu được vectơ nhất quán),
# Bước 3: Tính giá trị riêng lớn nhất (λmax) bằng cách lấy giá trị trung bình của vectơ nhất quán.
# Bước 4: Tính chỉ số nhất quán (CI), chỉ số đo lường mức độ chệch hướng nhất quán: CI = (lamdaMAX - n) / (n-1)
# Bước 5: Tỷ số nhất quán: CR = CI / RI
RI = {}
RI[3] = 0.52
RI[4] = 0.89
RI[5] = 1.11
RI[6] = 1.25
RI[7] = 1.35
RI[8] = 1.40
RI[9] = 1.45
RI[10] = 1.49
RI[11] = 1.52
RI[12] = 1.54
RI[13] = 1.56
RI[14] = 1.58
RI[15] = 1.59

def find_TSNQ(a):
    n, _ = a.shape
    if (n < 2):
        return 1
    bo_trong_so = find_vector(a)
    vector_tong_ts = np.dot(a, bo_trong_so) #B1
    vector_nhat_quan = vector_tong_ts / bo_trong_so #B
    lamda_max = np.sum(vector_nhat_quan) / n #B3
    CI = (lamda_max - n) / (n-1) #B4
    CR = CI / RI[n] #B5
    return CR
   
# PHƯƠNG PHÁP CHUẨN HÓA MA TRẬN
# Bước 1: Tính tổng giá trị từng cột của ma trận so sánh,
# Bước 2: Chia từng phần tử trong ma trận với tổng cột tương ứng (kết quả  thu được ma trận chuẩn hóa),
# Bước 3:Tính tổng từng hàng của ma trận chuẩn hóa,
# Bước 4: Chia tổng từng hàng cho tổng của tất cả các hàng (kết quả thu được vectơ trọng số tương ứng).
def find_vector(a):
    tong_cot = a.sum(axis=0) #B1
    a = a / tong_cot #B2
    tong_hang = a.sum(axis=1) #B3
    return tong_hang / np.sum(a) #B4

############################################################################
nhat_quan= True
tsnq= find_TSNQ(mttc)
if (tsnq > 0.1):
    nhat_quan= False
    print('Ma trận tiêu chí có chỉ số nhất quán là', tsnq, 'nên không nhất quán!')

# demo CR = 0.02
# patc[0]= np.array([
#     [1/1, 1/2, 3/1],
#     [2/1, 1/1, 4/1],
#     [1/3, 1/4, 1/1]
# ])

for i in range(len(tc)):
    if (find_TSNQ(patc[i]) > 0.1):
        # nhat_quan= False
        tsnq = find_TSNQ(patc[i])
        # print('Ma trận phương án theo tiêu chí', tc[i], 'có chỉ số nhất quán là', tsnq, 'nên không nhất quán!')

import sys
if (not nhat_quan):
    sys.exit()
#######################################################################

tstc = find_vector(mttc)
print('\nTRỌNG SỐ CỦA CÁC TIÊU CHÍ:\n', tc, '\n', tstc,'\n')
tstc = tstc.T.reshape(len(tc),1)

mtts = np.empty((3,4))
for i in range(len(tc)):
    vector = find_vector(patc[i])
    mtts[:, i] = vector
    print('\nTRỌNG SỐ CỦA CÁC PHƯƠNG ÁN THEO TIÊU CHÍ:', tc[i], '\n', pa, '\n', vector)

###################################################
print('\n\nTỔNG HỢP BẢNG ĐIỂM CỦA CÁC PHƯƠNG ÁN:')
score = np.dot(mtts, tstc).reshape(1, len(pa))
print(pa)
print(score)

print('\n\nXẾP HẠNG CÁC PHƯƠNG ÁN TỪ ĐIỂM CAO ĐẾN THẤP:')
rank = {}
score = score[0].tolist()
for i in range(len(pa)):
    rank[pa[i]] = score[i]

rank = dict(sorted(rank.items(), key=lambda item: item[1], reverse=True))
for key, value in rank.items():
    print(f"{key}: {value:.2f}")
print()


No comments: