1.步骤
(1).数据的标准化处理;
(2).选出最优方案和最劣方案;
(3).计算出各个对象和最优以及最劣之间的距离;

数学建模之topsis法(c语言实现)_i++


(4).再使用Dbest/(Dbest+Dwors)计算出各对象的评分,值越小的评价越高,依次排序;

2.源代码

#include <iostream>
#define m 8
#define n 3
void max(float a[][n], float b[], float c[]);
int main()
{
	FILE* fpr, * fpw;
	fopen_s(&fpr, "1.txt", "r");
	fopen_s(&fpw, "2.txt", "w");
	float sum = 0.0, aver, c = 0.0, r, minn[n], maxx[n], s1 = 0.0, s2 = 0.0, s[m][2], best[m], z, a[m][n];
	int  sort[m];
	for (int i = 0; i < m; i++)//读取数据
		for (int j = 0; j < n; j++)
			fscanf_s(fpr, "%f", &a[i][j]);
/*	for (int j = 0; j < n; j++)//具体题目具体改编,逆数据取倒
		for (int i = 0; i < m; i++)
			a[i][j] = 1.0 / a[i][j];*/
	max(a, maxx, minn);//求最值
	for (int j = 0; j < n; j++)//极差标准化处理
		for (int i = 0; i < m; i++)
			a[i][j] = (a[i][j] - minn[j]) / (maxx[j] - minn[j]);
/*	for (int j = 0; j < n; j++)//求各列之和
		for (int i = 0; i < m; i++)
			sum += a[i][j];
	aver = sum / (n * m);
	for (int j = 0; j < n; j++)
		for (int i = 0; i < m; i++)
			c += abs((a[i][j] - aver) * (a[i][j] - aver) / (n * m));
	r = sqrt(c);//标准差求解
	for (int j = 0; j < n; j++)//归一化处理(z-score 0均值标准化)
		for (int i = 0; i < m; i++)
			a[i][j] = (a[i][j]-aver) / r;*/
	max(a, maxx, minn);//求最值
	fprintf(fpw,"归一化处理后的数据为:\n");
	for (int j = 0; j < m; j++)
	{
		for (int i = 0; i < n; i++)
			fprintf(fpw,"%f  ", a[j][i]);
		fprintf(fpw,"\n");
	}
	max(a, maxx, minn);//求最值
	for (int j = 0; j < m; j++)//求正负距离
	{
		for (int i = 0; i < n; i++)
		{
			s1 += (a[j][i] - maxx[i]) * (a[j][i] - maxx[i]);
			s2 += (a[j][i] - minn[i]) * (a[j][i] - minn[i]);
		}
		s[j][0] = sqrt(s1);
		s[j][1] = sqrt(s2);
	}
	for (int j = 0; j < m; j++)//求每组距离的最大值
	{
		z = s[j][0];
		for (int i = 0; i < 2; i++)
			if (z < s[j][i])
				z = s[j][i];
		best[j] = z;
	}
	for (int i = 0; i < m; i++)
		best[i] = best[i] / (s[i][0] + s[i][1]);
	fprintf(fpw,"\n最优数据为:\n");
	for (int i = 0; i < n; i++)
		fprintf(fpw,"%f ", maxx[i]);
	fprintf(fpw,"\n");
	fprintf(fpw,"\n最差数据为:\n");
	for (int i = 0; i < n; i++)
		fprintf(fpw,"%f ", minn[i]);
	fprintf(fpw,"\n");
	fprintf(fpw,"\n每组数据的正负距离为:\n");
	for (int j = 0; j < m; j++)
	{
		for (int i = 0; i < 2; i++)
			fprintf(fpw,"%f  ", s[j][i]);
		fprintf(fpw,"\n");
	}
	fprintf(fpw,"\n每组数据的权值为:\n");
	for (int i = 0; i < m; i++)
		fprintf(fpw,"%f\n", best[i]);
	for (int i = 0; i < m; i++)
		sort[i] = 1;
	for (int i = 0; i < m; i++)
		for (int j = 0; j < m; j++)
			if (best[j] < best[i])
				sort[i] += 1;
	fprintf(fpw,"\n各数据排名为:\n");
	for (int i = 0; i < m; i++)
		fprintf(fpw,"%d\n", sort[i]);
	return 0;
}
void max(float a[][n], float b[], float c[])//求最大及最小值
{
	for (int i = 0; i < n; i++)
		b[i] = c[i] = a[0][i];
	for (int j = 0; j < n; j++)
		for (int i = 0; i < m; i++)
		{
			if (a[i][j] > b[j])
				b[j] = a[i][j];
			if (a[i][j] < c[j])
				c[j] = a[i][j];
		}
}

3.I/O(输入和输出放在txt文件内)
输入:

1150.3 3565.71 69
1189.7 3656.705 69
1193.7 3618.585 69
1221.9 3624.21 72
1229.8 3591.705 83
1230.6 3630.495 86
1276.1 3594.075 93
1337.7 3614.955 102

输出:

归一化处理后的数据为:
0.000000 0.000000 0.000000
0.210245 1.000000 0.000000
0.231590 0.581075 0.000000
0.382071 0.642892 0.090909
0.424226 0.285676 0.424242
0.428495 0.711963 0.515152
0.671291 0.311720 0.727273
1.000000 0.541184 1.000000

最优数据为:
1.000000 1.000000 1.000000

最差数据为:
0.000000 0.000000 0.000000

每组数据的正负距离为:
1.732051 0.000000
2.150282 1.021863
2.527779 1.198117
2.779474 1.415287
2.983076 1.563521
3.089240 1.844038
3.193676 2.115941
3.226465 2.601939

每组数据的权值为:
1.000000
0.677864
0.678435
0.662606
0.656112
0.626204
0.601489
0.553576

各数据排名为:
8
6
7
5
4
3
2
1