Browse Source

物元分析法

chengxr 1 year ago
parent
commit
e60b3e6033

+ 6 - 6
QFD/algorithm/MatterElementAnalysis.cpp

@@ -103,11 +103,11 @@ QVector<int> MatterElementAnalysis::getBestIndex() const
         result << maxLoc(s) + 1;
     }
 
-    for (int i = 0; i < range_cvt_.size(); i++) {
-        qDebug() << "指标 " << i;
-        for (int j = 0; j < range_cvt_.at(i).size(); j++) {
-            qDebug() << range_cvt_.at(i).at(j);
-        }
-    }
+    //    for (int i = 0; i < range_cvt_.size(); i++) {
+    //        qDebug() << "指标 " << i;
+    //        for (int j = 0; j < range_cvt_.at(i).size(); j++) {
+    //            qDebug() << range_cvt_.at(i).at(j);
+    //        }
+    //    }
     return result;
 }

+ 93 - 0
QFD/common/DataEvaluator.cpp

@@ -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;
 }
 

+ 1 - 1
QFD/dbService/SchemeInfoService.cpp

@@ -65,8 +65,8 @@ bool SchemeInfoService::QuerySchemeInfoByEngineerId(QList<SchemaEval *> *schemeL
                 scheme->type       = query.value(7).toInt();
                 schemeList->append(scheme);
             }
-            ret = true;
         }
+        ret = true;
     } else {
         qDebug() << query.lastError();
     }

+ 4 - 3
QFD/widgets/CustomPieChart.cpp

@@ -79,13 +79,14 @@ void CustomPieChart::drawPieChart()
     sumFont.setPointSizeF(!isSetSumFont ? radius / 2.5 : sumFont.pointSizeF());
     painter.setFont(sumFont);
     painter.setPen(QColor(54, 235, 171));
-    painter.drawText(QRectF(-radius, -radius - (radius / 4), diameter, diameter), Qt::AlignCenter,
-                     QString::number(sum));
+    //    painter.drawText(QRectF(-radius, -radius - (radius / 4), diameter, diameter), Qt::AlignCenter,
+    //                     QString::number(sum));
     /* 绘制"总数"文本 */
     painter.setPen(Qt::white);
     sumTextFont.setPointSizeF(!isSetSumTextFont ? radius / 5 : sumTextFont.pointSizeF());
     painter.setFont(sumTextFont);
-    painter.drawText(QRectF(-radius, -radius + fontSize, diameter, diameter), Qt::AlignCenter, "总数");
+    //    painter.drawText(QRectF(-radius, -radius + fontSize, diameter, diameter), Qt::AlignCenter,
+    //    "总数");
 
     painter.setFont(globalFont);
     for (int count = 0; count < total; count++) {

+ 9 - 7
QFD/widgets/EvalReportWidget.cpp

@@ -18,6 +18,8 @@
 #include <QGridLayout>
 #include <QComboBox>
 
+static QSize kFigureSize = QSize(750, 750);
+
 EvalReportWidget::EvalReportWidget(ProjectInfo *proj, int indexType, QWidget *parent)
     : QWidget(parent), m_proj(proj), m_indexType(indexType)
 {
@@ -47,7 +49,7 @@ void EvalReportWidget::initWidgets()
 {
     m_view = new QWidget;
 
-    QSize s = QSize(600, 600);
+    QSize s = kFigureSize;
 
     m_indexTitle = new QLabel(this);
     m_indexTab   = new QTabWidget(this);
@@ -295,7 +297,7 @@ void EvalReportWidget::showIndexWeightPlot()
     if (m_indexCombo->currentIndex() < 5) {
         PlotView::PlotType type = (PlotView::PlotType)m_indexCombo->currentIndex();
         m_indexPlot             = new PlotView(type, values, "", this);
-        m_indexPlot->setFixedSize(600, 600);
+        m_indexPlot->setFixedSize(kFigureSize);
         m_indexPlot->plot();
         m_gridLayout->addWidget(m_indexPlot, 1, 1);
     } else {
@@ -313,7 +315,7 @@ void EvalReportWidget::showIndexWeightPlot()
         }
 
         m_indexPie = new CustomPieChart("", tagList, dataList, colorList);
-        m_indexPie->setFixedSize(600, 600);
+        m_indexPie->setFixedSize(kFigureSize);
         m_gridLayout->addWidget(m_indexPie, 1, 1);
     }
 }
@@ -397,7 +399,7 @@ void EvalReportWidget::showTechScorePlot()
     if (m_techCombo->currentIndex() < 5) {
         PlotView::PlotType type = (PlotView::PlotType)m_techCombo->currentIndex();
         m_techPlot              = new PlotView(type, values, "", this);
-        m_techPlot->setFixedSize(600, 600);
+        m_techPlot->setFixedSize(kFigureSize);
         m_techPlot->plot();
         m_gridLayout->addWidget(m_techPlot, 1, 1);
     } else {
@@ -415,7 +417,7 @@ void EvalReportWidget::showTechScorePlot()
         }
 
         m_techPie = new CustomPieChart("", tagList, dataList, colorList);
-        m_techPie->setFixedSize(600, 600);
+        m_techPie->setFixedSize(kFigureSize);
         m_gridLayout->addWidget(m_techPie, 1, 1);
     }
 }
@@ -491,7 +493,7 @@ void EvalReportWidget::showSchemeScorePlot()
     if (m_schemeCombo->currentIndex() < 5) {
         PlotView::PlotType type = (PlotView::PlotType)m_schemeCombo->currentIndex();
         m_schemePlot            = new PlotView(type, values, "", this);
-        m_schemePlot->setFixedSize(600, 600);
+        m_schemePlot->setFixedSize(kFigureSize);
         m_schemePlot->plot();
         m_gridLayout->addWidget(m_schemePlot, 3, 1);
     } else {
@@ -509,7 +511,7 @@ void EvalReportWidget::showSchemeScorePlot()
         }
 
         m_schemePie = new CustomPieChart("", tagList, dataList, colorList);
-        m_schemePie->setFixedSize(600, 600);
+        m_schemePie->setFixedSize(kFigureSize);
         m_gridLayout->addWidget(m_schemePie, 3, 1);
     }
 }

+ 7 - 6
QFD/widgets/MatterElementConfigWidget.cpp

@@ -302,7 +302,6 @@ void MatterElementConfigWidget::initDomainTable()
         connect(tModel, &QStandardItemModel::itemChanged, this, &MatterElementConfigWidget::onTableItemChanged);
 
         int indexNumber = m_allConfigItems.at(pindex).childs.size();
-        qDebug() << indexNumber;
 
         tModel->setColumnCount(4 * m_domainLevel);
         tModel->setRowCount(indexNumber);
@@ -577,8 +576,8 @@ void MatterElementConfigWidget::onSaveBtnClick()
 void MatterElementConfigWidget::onTableItemChanged(QStandardItem *item)
 {
     /// 判断是否为第一个或最后一个区间
-    int index1 = 3;
-    int index2 = (m_domainLevel - 1) * 4 + 3;
+    int index1 = 3;                            // 第一个区间列索引
+    int index2 = (m_domainLevel - 1) * 4 + 3;  // 最后一个区间列索引
     if (item->column() != index1 && item->column() != index2) {
         return;
     }
@@ -601,17 +600,19 @@ void MatterElementConfigWidget::onTableItemChanged(QStandardItem *item)
     }
     QString range = QString("(%1, %2)").arg(left1).arg(right2);
     if (left1.toDouble() > right2.toDouble()) {
-        range = QString("(%1, %2)").arg(right1).arg(left2);
+        //        range = QString("(%1, %2)").arg(right1).arg(left2);
     }
 
     /// 显示节域值
-    QStandardItem *rangeItem = item->model()->item(item->row(), m_domainLevel * 4 + 3);
+    int jointIndex           = m_domainLevel * 4 + 3;  // 节域列索引
+    QStandardItem *rangeItem = item->model()->item(item->row(), jointIndex);
     if (rangeItem) {
         rangeItem->setText(range);
     } else {
         rangeItem = new QStandardItem(range);
         rangeItem->setEditable(false);
-        item->model()->setItem(item->row(), m_domainLevel * 4 + 3, rangeItem);
+
+        item->model()->setItem(item->row(), jointIndex, rangeItem);
     }
 }