|
@@ -7,6 +7,7 @@
|
|
|
#include "algorithm/EntropyWeights.h"
|
|
|
#include "algorithm/PCA.h"
|
|
|
#include "algorithm/HierarchicalAnalysis.h"
|
|
|
+#include "algorithm/MatterElementAnalysis.h"
|
|
|
|
|
|
#include <dbService/ClassSet.h>
|
|
|
#include <dbService/NodeMatrixService.h>
|
|
@@ -16,6 +17,7 @@
|
|
|
#include <dbService/MindWeightService.h>
|
|
|
#include <dbService/MindScoreService.h>
|
|
|
#include <dbService/SchemeInfoService.h>
|
|
|
+#include <dbService/GradeIndexInfoService.h>
|
|
|
|
|
|
#include <QMap>
|
|
|
#include <QDebug>
|
|
@@ -411,6 +413,97 @@ bool DataEvaluator::evaluateScheme()
|
|
|
|
|
|
bool DataEvaluator::evaluateEfficiencyMEA()
|
|
|
{
|
|
|
+ /// 获取指标体系
|
|
|
+ QList<CNodeData> nodeList;
|
|
|
+ bool mindRet = CNodeDataService().QueryAllValid(nodeList, m_process.projectId, m_process.indexType);
|
|
|
+ CMind *mind = new CMind(this);
|
|
|
+ mind->setNodeList(nodeList);
|
|
|
+
|
|
|
+ /// 获取物元配置效能分级
|
|
|
+ QList<SchemePlanManager::SchemeProcessInfo> processList;
|
|
|
+ bool processRet = SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_process.projectId,
|
|
|
+ m_process.indexType);
|
|
|
+ int domainLevel = m_process.efficiencyGrades;
|
|
|
+ for (auto process : processList) {
|
|
|
+ if (process.type == SchemePlanManager::RunEvaluate) {
|
|
|
+ domainLevel = process.efficiencyGrades;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 获取物元配置数据
|
|
|
+ QList<GradeIndexInfo *> rangeList;
|
|
|
+ bool gradeRet = GradeIndexInfoService().QueryGradeIndexInfoByProjectId(&rangeList, m_process.projectId);
|
|
|
+ /// 整理物元配置数据, int:层级 QString:指标名称 QPair:区间左右值
|
|
|
+ QMap<QString, QMap<int, QPair<double, double>>> rangeData;
|
|
|
+ for (GradeIndexInfo *info : rangeList) {
|
|
|
+ if (rangeData.keys().contains(info->gradeIndexName) == false) {
|
|
|
+ rangeData[info->gradeIndexName] = QMap<int, QPair<double, double>>();
|
|
|
+ }
|
|
|
+ QString v = info->gradeIndexValue;
|
|
|
+ if (v.length() > 2 && v.contains(", ")) {
|
|
|
+ QStringList l = v.mid(1, v.length() - 2).split(", ");
|
|
|
+ QPair<double, double> range(l.first().toDouble(), l.last().toDouble());
|
|
|
+ rangeData[info->gradeIndexName][info->gradeLevel] = range;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 获取样本数据
|
|
|
+ QMap<int, QMap<QString, double>> schemeData;
|
|
|
+ bool schemeRet = getSchemeData(schemeData);
|
|
|
+
|
|
|
+ QMap<QString, double> weightData;
|
|
|
+ bool weightRet = getWeightData(weightData);
|
|
|
+
|
|
|
+ /// 获取权重数据
|
|
|
+ if (mindRet == false || processRet == false || gradeRet == false || schemeRet == false || weightRet == false) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 物元分析
|
|
|
+ MEAMat mat; // 样本数据
|
|
|
+ MEARangeMat ranges; // 等级数据
|
|
|
+ QVector<double> weights; // 权重数据
|
|
|
+
|
|
|
+ QList<CNodeData> indexList = mind->leaves(); // 最后一级指标
|
|
|
+ for (int key : schemeData.keys()) {
|
|
|
+ QVector<double> m;
|
|
|
+ for (int i = 0; i < indexList.size(); ++i) {
|
|
|
+ m.append(schemeData[key][indexList[i].name]);
|
|
|
+ }
|
|
|
+ mat.append(m);
|
|
|
+ }
|
|
|
+
|
|
|
+ QVector<MEARange> jointRanges;
|
|
|
+ for (int level = 1; level < domainLevel + 1; ++level) {
|
|
|
+ QVector<MEARange> levelRanges;
|
|
|
+ for (int i = 0; i < indexList.size(); ++i) {
|
|
|
+ QPair<double, double> p = rangeData[indexList[i].name][level];
|
|
|
+ MEARange levRange = MEARange { i, p.first, p.second };
|
|
|
+ levelRanges.append(levRange);
|
|
|
+
|
|
|
+ if (level == 1) {
|
|
|
+ MEARange jointRange = MEARange { i, p.first };
|
|
|
+ jointRanges.append(jointRange);
|
|
|
+ } else if (level == domainLevel) {
|
|
|
+ jointRanges[i].max_value = p.second;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ranges.append(levelRanges);
|
|
|
+ }
|
|
|
+ ranges.append(jointRanges);
|
|
|
+
|
|
|
+ for (int i = 0; i < indexList.size(); ++i) {
|
|
|
+ weights.append(weightData[indexList[i].name]);
|
|
|
+ }
|
|
|
+
|
|
|
+ MatterElementAnalysis me(mat, ranges);
|
|
|
+ me.evaluate(weights);
|
|
|
+ QVector<int> index = me.getBestIndex();
|
|
|
+ qDebug() << __FUNCTION__ << __LINE__ << index << endl;
|
|
|
+
|
|
|
+ qDebug() << __FUNCTION__ << __LINE__ << me.getRangeWeights() << endl;
|
|
|
+
|
|
|
return false;
|
|
|
}
|
|
|
|