计算N阶矩阵的随机一致性指标RI
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告(一)
课程名称数学建模
实验项目Matlab基本操作及其实际应用实验环境PC机、Matlab
学院/班级
学号/姓名
指导教师
实验日期
成绩
一、实验名称:
随机一致性指标求解
二、实验目的:
1)掌握用matlab求解随机一致性指标的方法
2)加深对随机一致性指标概念的理解
三、实验内容:
用matlab或C++编写程序分别计算n=3-30时的n阶矩阵的随机一致性检验指标的值RI。
//本组实验随机数产生正互反矩阵,这个数目必须取的相当大(超过1000000,所以此程序跑起来比较费时),才比较接近标准答案
#include
#include
#include
#include
#include
using namespace std;
int getNameta(double a[],int n); //获取当前随机正互反矩阵的最大λ
void createMatrix(double a[],int n); //建立随机正互反矩阵
int getMax(double b[],int n); //获取b矩阵中的最大值
void Mifa(double a[],double b[],int n); //幂法过程
void main()
{
int n; //矩阵阶数
int m = 3000; //建立的随机正互反矩阵个数
int all = 0; //所有最大λ的和
int tem = 0;
int ri = 0; //最终的RI(为了计算方便,将实际的RI扩大了100倍进行计算了)
cout << "Please enter the size of the matrix:" << endl;
cout << "n = " ;
cin >> n;
if(n > 2&& n <= 30){
for(int i =0;i double *a = new double[n*n]; //声明n*n的随机正互反矩阵 for(int j =0;j { a[j] = 1; } createMatrix(a,n); //建立n*n的随机正互反矩阵 all += getNameta(a,n); //获得最大λ} tem = all/m; //计算得RI ri = (tem - n*100); ri = ri/(n-1); //计算得到的RI (乘以100后的结果) int baiwei = ri/100; int shiwei = (ri-100*baiwei)/10; int gewei = ri-100*baiwei-10*shiwei; cout << "The RI of the " << n <<" size matrix is " << baiwei << "." << shiwei << gewei << endl; } else if(n ==1) { cout << "The RI of the " << n <<" size matrix is " << 0 << endl; } else cout << "The size of n you input is wrong" << endl; } void createMatrix(double a[],int n) { double sample[17]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,1.0/2.0,1.0/3.0,1.0/4.0,1.0/ 5.0,1.0/6.0,1.0/7.0,1.0/8.0,1.0/9.0}; for(int i=0;i for(int j=i;j { int t; t = rand()%17; if( j == i){ a[n*i+j]=1.0; } else{ a[n*i+j] = sample[t]; a[n*j+i] = 1.0/sample[t]; } } } int getNameta(double a[],int n) { int tem=0; double *b=new double[n]; for(int i=0;i b[i]=1.0/n; } Mifa(a,b,n); int max=getMax(b,n); while(tem != max) { tem = max; for(int d = 0;d { b[d] = b[d]*100/max; } Mifa(a,b,n); max = getMax(b,n); } int nameta; nameta = tem; return nameta; }