【数模/美赛板子】存一下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;
}
