0
点赞
收藏
分享

微信扫一扫

C++实现 Topsis

探头的新芽 2022-03-25 阅读 65

C++实现:

输入

第一行输入矩阵的行数n

第二行输入矩阵的列数m

第三行输入m列的各个权重w(以空格相隔,没有权重则全输入为1)

之后输入n行m列数据矩阵

输入完矩阵之后选择是否将低优指标转换成高优指标(进行输入1,不进行输入0)

输出

输出共一行,表示每个对象的接近程度,结果保留4位小数,以空格相隔。

样例输入

5
3
1 1 1
50.8 4.3 8.7
200 4.9 7.2
71.4 2.5 5
98.5 3.7 2.7
10.2 2.4 0.3
1

样例输出

0.1067 0.0052 0.1896 0.0945 1.0000

#include<iostream>
#include<vector>
#include<math.h>
#include <iomanip>

using namespace std;
int main()
{
	int n, m,f=0;
	cin >> n >> m;
	float *w = new float[m];
	for (int i = 0; i < m; i++)//权重
		cin >> w[i];
	vector<vector<float>>  r(n, vector<float>(m));
	for (int i = 0; i < n;i++)
	for (int j = 0; j < m; j++)
	{
		cin >> r[i][j];
	}
	cin >> f;

	if (f)
	{
		//评价指标同趋化
		for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			r[i][j] = (1.0 / r[i][j]) * 100;
		}
	}

		vector<float> p(m,0) ; //存放每列值的平方的和
		for (int i = 0; i < m;i++)
		for (int j = 0; j < n; j++)
		{
			p[i] += r[j][i] * r[j][i];
		}

		//归一化处理
		for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			r[i][j] /= sqrt(p[j]);
		}

		//计算最优最劣方案
		vector<float> max(m, 0);
		
		vector<float> min(m, 10000);
		

		for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			if (r[i][j]>max[j])
			{
				max[j] = r[i][j];
				
			}
			if (r[i][j]<min[j])
				min[j] = r[i][j];
		}

		//计算各指标与最优最劣方案距离
		vector<float> dt1(n, 0);
		vector<float> dt2(n, 0);

		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				dt1[i] += (r[i][j] - max[j])*(r[i][j] - max[j])*w[j];
				dt2[i] += (r[i][j] - min[j])*(r[i][j] - min[j])*w[j];
			}
			dt1[i] = sqrt(dt1[i]);
			dt2[i] = sqrt(dt2[i]);
		}

		vector<float> dt3(n, 0);//存放接近程度

		for (int i = 0; i < n; i++)
		{
			dt3[i] = dt2[i] / (dt2[i] + dt1[i]);
		}

		for (int i = 0; i < n; i++)
		cout << fixed << showpoint << setprecision(4) << dt3[i] << " ";
	
	
}
举报

相关推荐

TOPSIS 法

TOPSIS法

TOPSIS法 —— python

TOPSIS法 —— matlab

c++ hash实现

C++ 实现复数

C++实现扫雷

0 条评论