Ранжування при наявності невирішених об'єктів
Короткі теоретичні відомості
Об'єкти називають невирішеними (за ознакою Р або Q), якщо вони сприймаються як однакові і мають однаковий ранг. Це може відбуватися із-за фактичної однаковості об'єктів або недостатньої розрізняльної здатності ранжуючої особи (або алгоритму). Невирішеним об'єктам приписуються однакові значення, рівні середньому значенню рангів при розміщенні об'єктів в будь-якому порядку.
Завдання
Десять об'єктів ранжовані в алфавітному порядку, але деякі об'єкти не вирішені за ознакою Р. Визначити коефіцієнт рангової кореляції .
B-2
O | Q | P
A | 1 | 1
B | 2 | 2
C | 3 | 5
D | 4 | 5
E | 5 | 5
F | 6 | 5
G | 7 | 7
H | 8 | 8
I | 9 | 9
J | 10 | 10
Згідно вказаному правилу ранги об'єктів R, W однакові і рівні:
Програмна реалізація:
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
struct obj{
char o;
int p,q;
} mas[100];
int i,j,num;
int sort_functionP( const void *a, const void *b)
{
if(((obj*)a)->p<((obj*)b)->p)
return -1;
if(((obj*)a)->p==((obj*)b)->p)
return 0;
return 1;
}
int sort_functionQ( const void *a, const void *b)
{
if(((obj*)a)->q<((obj*)b)->q)
return -1;
if(((obj*)a)->q==((obj*)b)->q)
return 0;
return 1;
}
void main()
{
clrscr();
ifstream f("3.dat");
f>>num;
for(i=0; i<num; i++)
f>>mas[i].o>>mas[i].p>>mas[i].q;
qsort((void*)mas, num, sizeof(mas[i]), sort_functionP);
for(i=0; i<num; i++)
cout<<mas[i].o<<' '<<mas[i].p<<' '<<mas[i].q<<endl;
//невизнач. об’єкти за рангом P
int T=0;
i=0;
while(i<num)
{
j=i;
while((i<num-1)&&(mas[i].p!=mas[i+1].p)) //початок невизнач.
j=++i;
while((i<num-1)&&(mas[i].p==mas[i+1].p)) //кінець невизнач.
i++;
if(i!=j)
cout<<mas[j].o<<" "<<mas[i].o<<endl;
T+=(i-j)*(i-j-1);
i++;
}
// невизнач. об’єкти за рангом Q
int U=0;
qsort((void*)mas, num, sizeof(mas[i]), sort_functionQ);
i=0;
while(i<num)
{
j=i;
// початок невизнач.
while((i<num-1)&&(mas[i].q!=mas[i+1].q))
j=++i;
// кінець невизнач.
while((i<num-1)&&(mas[i].q==mas[i+1].q))
i++;
if(i!=j)
cout<<mas[j].o<<" "<<mas[i].o<<endl;
U+=(i-j)*(i-j-1);
i++;
}
cout<<"Число T="<<T<<endl;
cout<<"Число U="<<U<<endl;
int N=num*(num-1);
cout<<"Число N="<<N<<endl;
int Nskor=sqrt(N-T/2)*sqrt(N-U/2);
cout<<" Скореговане число N="<<Nskor<<endl;
//обчислення тау
int EPlus=0;
for(i=0; i<num-1; i++)
{
int sum=0;
for(j=i+1; j<num; j++)
if(mas[i].p<mas[j].p)
sum++;
EPlus+=sum;
}
float tau=2*EPlus;
tau=tau/Nskor-1;
cout<<"tau="<<tau<<endl;
}
Результат роботи програми.
А 1 1
Б 2 2
В 3 3
Г 4 4
Д 5 5
И 7 9
З 7 8
Ж 7 7
Е 7 6
К 10 10
И Е
Число T=6
Число U=0
Число N=90
Скореговане число N=88
tau=-0.113636