HierarchicalAnalysis.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "HierarchicalAnalysis.h"
  2. #include <QtMath>
  3. #include <QDebug>
  4. HierarchicalAnalysis::HierarchicalAnalysis(const QStringList& nodes, const QVector<qreal>& nxnValus)
  5. : m_nodes(nodes),
  6. m_sqartnValues(QVector<double>(nodes.count(), 0)),
  7. m_weights(QVector<double>(nodes.count(), 0)),
  8. m_averageWeights(QVector<double>(nodes.count(), 0)),
  9. m_CI(0),
  10. m_CR(0)
  11. {
  12. // qDebug() << "HierarchicalAnalysis nodes" << nodes;
  13. calc(nxnValus);
  14. }
  15. void HierarchicalAnalysis::calc(const QVector<qreal>& nxnValus)
  16. {
  17. // qDebug() << "HierarchicalAnalysis nxnValus" << nxnValus;
  18. QVector<qreal> nodeMul(m_nodes.count(), 1);
  19. for (int m = 0; m < m_nodes.count(); ++m)
  20. {
  21. for (int n = 0; n < m_nodes.count(); ++n)
  22. {
  23. nodeMul[m] *= nxnValus[m * m_nodes.count() + n];
  24. }
  25. }
  26. // qDebug() << "nodeMul" << nodeMul;
  27. qreal nSum = 0;
  28. for (int n = 0; n < m_sqartnValues.count(); ++n)
  29. {
  30. m_sqartnValues[n] = qPow(nodeMul[n], (qreal)1 / m_sqartnValues.count());
  31. nSum += m_sqartnValues[n];
  32. }
  33. // qDebug() << "sqartnValues" << m_sqartnValues;
  34. for (int w = 0; w < m_weights.count(); ++w)
  35. {
  36. m_weights[w] = m_sqartnValues[w] / nSum;
  37. }
  38. // qDebug() << "weights" << m_weights;
  39. // m0*w0+m1*w1+m2*w2+m3*w3...mn*wn
  40. for (int m = 0; m < m_nodes.count(); ++m)
  41. {
  42. for (int n = 0; n < m_nodes.count(); ++n)
  43. {
  44. m_averageWeights[m] += nxnValus[m * m_nodes.count() + n] * m_weights[n];
  45. }
  46. }
  47. // qDebug() << "averageWeights" << m_averageWeights;
  48. // Awi/Wi
  49. QVector<qreal> awiDividedWi(m_nodes.count(), 0);
  50. qreal awiDividedWiAverage = 0;
  51. for (int m = 0; m < m_nodes.count(); ++m)
  52. {
  53. awiDividedWi[m] = m_averageWeights[m] / m_weights[m];
  54. awiDividedWiAverage += awiDividedWi[m];
  55. }
  56. awiDividedWiAverage /= m_nodes.count();
  57. // qDebug() << "awiDividedWi" << awiDividedWi;
  58. // CI=(λ-n)/(n-1)
  59. m_CI = (awiDividedWiAverage - m_nodes.count()) / (m_nodes.count() - 1);
  60. qreal result = RI[m_nodes.count() - 1];
  61. if (result == 0)
  62. {
  63. m_CR = 0;
  64. }
  65. else
  66. {
  67. m_CR = m_CI / RI[m_nodes.count() - 1];
  68. }
  69. // qDebug() << RI[m_nodes.count() - 1] << "m_CI" << m_CI << "m_CR" << m_CR;
  70. }