#include<iostream>
#include<vector>
#include <sstream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
/*vector<float> fuction1(vector<vector<float>> v1)
{
vector<float> sum;
float sum1 = 0;
//列向量归一化
for (int i = 0; i < v1[0].size(); i++)//列数
{
sum1 = 0;
for (int j = 0; j < v1.size(); j++)//行数
{
sum1 += v1[j][i];
}
sum.push_back(sum1);
}
*/
int main()
{
int n;
std::cin >> n;
cin.ignore(); // 忽略换行符
// 创建一个n x n x 3的数组来存储三角模糊数的值
vector<vector<vector<double>>> array(n, vector<vector<double>>(n, vector<double>(3)));
// 读取并解析矩阵的每一行数据
for (int i = 0; i < n; ++i) {
string line;
if (!getline(cin, line)) { // 读取一行,并检查是否读取成功
cerr << "Error: Unexpected end of input." << endl;
return 1; // 输入结束或出现错误时退出程序
}
istringstream iss(line); // 使用istringstream来解析字符串
string token;
int j = 0; // 用于追踪当前列
// 读取并解析每个三角模糊数
while (getline(iss, token, ' ')) { // 使用空格作为分隔符
istringstream itss(token); // 再次使用istringstream来解析数字
double value;
char delimiter; // 用于读取逗号或其他分隔符
// 读取并存储三角模糊数的每个值
for (int k = 0; k < 3; ++k) {
if (!(itss >> value)) { // 读取数字,并检查是否读取成功
cerr << "Error: Invalid input format." << endl;
return 1; // 输入格式不正确时退出程序
}
array[i][j][k] = value; // 存储值到数组中
// 清除逗号或其他分隔符
if (k < 2 && !(itss >> delimiter)) {
cerr << "Error: Missing delimiter." << endl;
return 1; // 缺少分隔符时退出程序
}
}
++j; // 移到下一列
}
}
// 按照指定的格式打印矩阵
/*for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
for (int k = 0; k < 3; ++k) {
cout << array[i][j][k] << " "; // 打印当前值并加上空格
}
}
cout << endl; // 行末输出换行符
}*/
//一,计算权重向量
//1.求行和
std::vector<std::vector<std::vector<double>>> array1(n, std::vector<std::vector<double>>(1, std::vector<double>(3)));
std::vector <double>array2(3);
std::vector<std::vector<std::vector<double>>> array3(n, std::vector<std::vector<double>>(1, std::vector<double>(3)));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < 3; k++)
{
array1[i][0][k] += array[i][j][k];
array2[k] += array[i][j][k];
}
}
}
/*for (int i = 0; i < n; i++)
{
for (int k = 0; k < 3; k++)
{
// cout << "array1" << array1[i][0][k]<<" ";
//cout << " array2[k]" << array2[k]<<" ";
}
cout << endl;
array10.8 array11 array11.2
array11.4 array11.6 array11.8
array11.7 array11.9 array12.1
array2[k]3.9 array2[k]4.5 array2[k]5.1
array2[k]3.9 array2[k]4.5 array2[k]5.1
array2[k]3.9 array2[k]4.5 array2[k]5.1
}*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < 3; k++)
{
if (k == 0)
{
array3[i][0][0] = array1[i][0][0] / array2[2];
}
if (k == 1)
{
array3[i][0][1] = array1[i][0][1] / array2[1];
}
if (k == 2)
{
array3[i][0][2] = array1[i][0][2] / array2[0];
}
}
}
}
/*for (int i = 0; i < n; i++)
{
for (int k = 0; k < 3; k++)
{
cout << "array3[i][0][k]" << array3[i][0][k] << " ";
array3[i][0][k]0.156863 array3[i][0][k]0.222222 array3[i][0][k]0.307692
array3[i][0][k]0.27451 array3[i][0][k]0.355556 array3[i][0][k]0.461538
array3[i][0][k]0.333333 array3[i][0][k]0.422222 array3[i][0][k]0.538462
}
cout << endl;
}*/
//std::vector<std::vector<std::vector<double>>> array4(n, std::vector<std::vector<double>>(1, std::vector<double>(3)));//可能度矩阵
std::vector<std::vector<double>> array4(n, std::vector<double>(n, 0.0));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
double denominator1 = array3[i][0][1] - array3[i][0][0] + array3[j][0][1] - array3[j][0][0];
double denominator2 = array3[i][0][2] - array3[i][0][1] + array3[j][0][2] - array3[j][0][1];
// 避免除零错误
double n1 = (denominator1 != 0.0) ? (array3[j][0][1] - array3[i][0][0]) / denominator1 : 0.0;
if (n1 < 0) n1 = 0;
double n2 = (denominator2 != 0.0) ? (array3[j][0][2] - array3[i][0][1]) / denominator2 : 0.0;
if (n2 < 0) n2 = 0;
// 计算 array4 的值
//double value = 0.5 * (1 - std::max(n1, 0.0)) + 0.5 * (1 - std::max(n2, 0.0));
array4[i][j]= 0.5 * std::max(1.0 - std::max(n1, 0.0), 0.0) +
0.5 * std::max(1.0 - std::max(n2, 0.0), 0.0);
//array4[i][j] = (value < 0) ? 0.0 : value;
}
}
/*for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << " array4[i][j]" << array4[i][j]<<" ";
}
cout << endl;
}*/
//三。转为模糊一致性矩阵
//1.求行和
std::vector <double>array5(n);//可能度矩阵行和
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
array5[i] += array4[i][j];
}
}
/*for (int i = 0; i < n; i++)
{
cout << array5[i] << " ";
//0.5 1.65385 2.34615
}*/
//2.建立模糊一致性矩阵
std::vector<std::vector<double>> array6(n, std::vector<double>(n, 0.0));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
array6[i][j] = ((array5[i] - array5[j]) / (2 * (n - 1))) + 0.5;
//cout << "array6[i][j]" << array6[i][j] << " ";
}
//cout << endl;
}
//四.计算排序向量
//1.行求和
std::vector <double>array7(n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
array7[i]+= array6[i][j];
}
}
for (int i = 0; i < n; i++)
{
cout << std::fixed << std::setprecision(5)<< (array7[i] + (0.5 * n) - 1) / (n * (n - 1)) << " ";
}
}
中国矿业大学-信息安全E
最新推荐文章于 2025-11-24 10:48:04 发布
2701

被折叠的 条评论
为什么被折叠?



