【数模/美赛板子】存一下TOPSIS的代码板子
输入格式:
n m w1 w2 ... wm a11 a12 ... a1m a21 ... a2m an1 ... anm
#include <iostream> #include <cmath> #include <algorithm> using namespace std; const int MAX_N = 101; //候选者数 const int MAX_M = 101; //评价指标数 int N, M; double dat[MAX_N][MAX_M]; //评价数据 double weight[MAX_M]; //每个评价指标的权重 double ideal_solution[MAX_M]; //理想解 double negative_ideal_solution[MAX_M]; //劣解 //计算欧几里得距离 double euclidean_distance(double a[]) { double sum = 0; for (int i = 0; i < M; i++) { sum += a[i] * a[i]; } return sqrt(sum); } int main() { cin>>N>>M; //输入每个评价指标的权重 for (int i = 0; i < M; i++) { cin >> weight[i]; } //输入评价数据 for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> dat[i][j]; } } //计算理想解和劣解 for (int i = 0; i < M; i++) { double max_value = -1e9, min_value = 1e9; for (int j = 0; j < N; j++) { max_value = max(max_value, dat[j][i]); min_value = min(min_value, dat[j][i]); } ideal_solution[i] = max_value; negative_ideal_solution[i] = min_value; } //计算每个候选者与理想解和劣解的相似度 double similarity_to_ideal_solution[N], similarity_to_negative_ideal_solution[N]; for (int i = 0; i < N; i++) { double a[M], b[M]; for (int j = 0; j < M; j++) { a[j] = dat[i][j] - ideal_solution[j]; b[j] = dat[i][j] - negative_ideal_solution[j]; } similarity_to_ideal_solution[i] = euclidean_distance(a); similarity_to_negative_ideal_solution[i] = euclidean_distance(b); } //计算每个候选者的综合得分 double scores[N]; for (int i = 0; i < N; i++) { scores[i] = similarity_to_negative_ideal_solution[i] / (similarity_to_negative_ideal_solution[i] + similarity_to_ideal_solution[i]); } //找到最优解 int best_index = 0; double best_score = -1e9; for (int i = 0; i < N; i++) { cout<<scores[i]<<" "<<i+1<<endl; // 输出评分 if (scores[i] > best_score) { best_score = scores[i]; best_index = i; } } // //输出最优解 // cout << "最优解是: " << best_index + 1 << endl; return 0; }