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:
Post a Comment