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()


Monday, September 4, 2023

Solution UVA: 576 - Haiku Review

 Problem  VerdictLangTimeBestRankSubmit Time
 | discuss576 - Haiku Review AcceptedC++110.0000.00017387 mins ago


Suggest:
This can be solved through two simple steps:
- Firstly, we remove consecutive vowels.
- Next, we count the vowels in the string to compare with 5/7/5.


#include <bits/stdc++.h>
using namespace std;

bool isVowel(char c) {
    char vowels[] = {'a', 'e', 'i', 'o', 'u', 'y'};
    for (char vowel : vowels) {
        if (c == vowel) {
            return true;
        }
    }
    return false;
}

string fdel(string s) {
    for (int i = 0; s[i+1]; i++)
        if (isVowel(s[i]) && isVowel(s[i + 1])) {
            s.erase(i, 1);
            i--;
        }
    return s;
}

int fcnt(string s){
    int cnt= 0;
    for (int i = 0; s[i]; i++)
        if (isVowel(s[i])) cnt++;
    return cnt;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string s, a, b, c;
    while (true) {
        getline(cin, s);
       
        a="", b="", c="";
        int i;
        for(i=0; s[i]; i++){
            if (s[i]=='/') break;
            a+=s[i];
        }
        for(i=i+1; s[i]; i++){
            if (s[i]=='/') break;
            b+=s[i];
        }
        for(i=i+1; s[i]; i++){
            if (s[i]=='/') break;
            c+=s[i];
        }
           
        if (a == "e" && b == "o" && c == "i") break;
       
        if (fcnt(fdel(a)) != 5) cout<<1;
            else if (fcnt(fdel(b)) != 7) cout<<2;
                else if (fcnt(fdel(c)) != 5) cout<<3;  
                    else cout<<"Y";
        cout<<"\n";
    }
}