|
@@ -13,6 +13,7 @@
|
|
|
#include <dbService/CNodeDataService.h>
|
|
|
#include <dbService/SchemeProcessService.h>
|
|
|
#include <dbService/UserConfigService.h>
|
|
|
+#include <dbService/MindWeightService.h>
|
|
|
|
|
|
#include <QMap>
|
|
|
#include <QDebug>
|
|
@@ -86,9 +87,84 @@ bool DataEvaluator::evaluateWeightFromExpert()
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- QMap<QString, QMap<QString, double>> allWeights;
|
|
|
+ QMap<QString, double> indexWeights;
|
|
|
|
|
|
- for (QString expertId : nodeData.keys()) {
|
|
|
+ // 结果集结, 先计算各个专家的数据, 再取均值
|
|
|
+ if (m_gatherType == Result) {
|
|
|
+ QMap<QString, QMap<QString, double>> mWeights;
|
|
|
+
|
|
|
+ for (QString expertId : nodeData.keys()) {
|
|
|
+ for (int i = 1; i < mind->levels(); i++) {
|
|
|
+ for (CNodeData node : mind->nodesInLevel(i)) {
|
|
|
+ QList<CNodeData> subNodes = mind->subNodes(node);
|
|
|
+ QVector<qreal> nxnValus; // n x n矩阵
|
|
|
+ for (int j = 0; j < subNodes.size(); j++) {
|
|
|
+ QString abs = subNodes[j].name;
|
|
|
+ for (int k = 0; k < subNodes.size(); k++) {
|
|
|
+ QString ord = subNodes[k].name;
|
|
|
+ QString key = abs + "-" + ord;
|
|
|
+ double v;
|
|
|
+ QStringList nodeValue = nodeData[expertId][key]->nodeValue.split("/");
|
|
|
+ if (nodeValue.size() == 1) {
|
|
|
+ v = nodeValue[0].toDouble();
|
|
|
+ } else {
|
|
|
+ v = nodeValue[0].toDouble() / nodeValue[1].toDouble();
|
|
|
+ }
|
|
|
+ nxnValus.append(v);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算权重并存储
|
|
|
+ QScopedPointer<HierarchicalAnalysis> ha(new HierarchicalAnalysis(subNodes.size(), nxnValus));
|
|
|
+ QVector<qreal> weights = ha->getWeights();
|
|
|
+
|
|
|
+ for (int l = 0; l < weights.size(); ++l) {
|
|
|
+ if (mWeights.keys().contains(expertId) == false) {
|
|
|
+ mWeights[expertId] = QMap<QString, double>();
|
|
|
+ }
|
|
|
+ CNodeData pNode = mind->node(subNodes[l].pNumber);
|
|
|
+ if (mWeights[expertId].keys().contains(pNode.name)) {
|
|
|
+ mWeights[expertId][subNodes[l].name] = mWeights[expertId][pNode.name] * weights[l];
|
|
|
+ } else {
|
|
|
+ mWeights[expertId][subNodes[l].name] = weights[l];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 求平均权重
|
|
|
+ for (int i = 1; i < mind->levels(); i++) {
|
|
|
+ for (CNodeData node : mind->nodesInLevel(i)) {
|
|
|
+ QList<CNodeData> subNodes = mind->subNodes(node);
|
|
|
+ for (int j = 0; j < subNodes.size(); j++) {
|
|
|
+ double sum = 0;
|
|
|
+ for (QString expertId : nodeData.keys()) {
|
|
|
+ sum += mWeights[expertId][subNodes[j].name];
|
|
|
+ }
|
|
|
+ indexWeights[subNodes[j].name] = sum / nodeData.keys().size();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else { // 矩阵集结, 先计算各个专家数据的均值, 在求权重
|
|
|
+ // 求专家数据均值
|
|
|
+ QMap<QString, double> avgNodeValue;
|
|
|
+ for (QString key : nodeData.values().first().keys()) {
|
|
|
+ double sum = 0;
|
|
|
+ for (QString expertId : nodeData.keys()) {
|
|
|
+ double v;
|
|
|
+ QStringList nodeValue = nodeData[expertId][key]->nodeValue.split("/");
|
|
|
+ if (nodeValue.size() == 1) {
|
|
|
+ v = nodeValue[0].toDouble();
|
|
|
+ } else {
|
|
|
+ v = nodeValue[0].toDouble() / nodeValue[1].toDouble();
|
|
|
+ }
|
|
|
+ sum += v;
|
|
|
+ }
|
|
|
+ avgNodeValue[key] = sum / nodeData.keys().size();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 求权重
|
|
|
for (int i = 1; i < mind->levels(); i++) {
|
|
|
for (CNodeData node : mind->nodesInLevel(i)) {
|
|
|
QList<CNodeData> subNodes = mind->subNodes(node);
|
|
@@ -98,24 +174,37 @@ bool DataEvaluator::evaluateWeightFromExpert()
|
|
|
for (int k = 0; k < subNodes.size(); k++) {
|
|
|
QString ord = subNodes[k].name;
|
|
|
QString key = abs + "-" + ord;
|
|
|
- double v;
|
|
|
- QStringList nodeValue = nodeData[expertId][key]->nodeValue.split("/");
|
|
|
- if (nodeValue.size() == 1) {
|
|
|
- v = nodeValue[0].toDouble();
|
|
|
- } else {
|
|
|
- v = nodeValue[0].toDouble() / nodeValue[1].toDouble();
|
|
|
- }
|
|
|
- nxnValus.append(v);
|
|
|
+ nxnValus.append(avgNodeValue[key]);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // 计算权重并存储
|
|
|
QScopedPointer<HierarchicalAnalysis> ha(new HierarchicalAnalysis(subNodes.size(), nxnValus));
|
|
|
QVector<qreal> weights = ha->getWeights();
|
|
|
- qDebug() << __FUNCTION__ << __LINE__ << expertId << nxnValus << weights << endl;
|
|
|
+
|
|
|
+ for (int l = 0; l < weights.size(); ++l) {
|
|
|
+ CNodeData pNode = mind->node(subNodes[l].pNumber);
|
|
|
+ if (indexWeights.keys().contains(pNode.name)) {
|
|
|
+ indexWeights[subNodes[l].name] = indexWeights[pNode.name] * weights[l];
|
|
|
+ } else {
|
|
|
+ indexWeights[subNodes[l].name] = weights[l];
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return true;
|
|
|
+ QStringList valueList;
|
|
|
+ for (QString key : indexWeights.keys()) {
|
|
|
+ valueList.append(QString("%1:%2").arg(key).arg(indexWeights[key]));
|
|
|
+ }
|
|
|
+ QString valueStr = valueList.join(";");
|
|
|
+
|
|
|
+ bool ret = MindWeightService().saveUniqueWeightData(m_process.projectId, m_process.indexType, m_process.dSource,
|
|
|
+ algorithm, valueStr);
|
|
|
+
|
|
|
+ qDebug() << __FUNCTION__ << __LINE__ << ret << valueStr << endl;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
bool DataEvaluator::evaluateWeightFromMeasure()
|