【数模/美赛板子】存一下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;
}
经验分享 程序员 微信小程序 职场和发展