Browse Source

修改灰色聚类算法

codeCLown 2 months ago
parent
commit
01bb81d765
2 changed files with 24 additions and 37 deletions
  1. 21 34
      QFD/algorithm/GreyClusterEvaluation.cpp
  2. 3 3
      QFD/algorithm/GreyClusterEvaluation.h

+ 21 - 34
QFD/algorithm/GreyClusterEvaluation.cpp

@@ -16,9 +16,7 @@ GreyClusterEvaluation::GreyClusterEvaluation(const GCEMat &mat, const GCERangeMa
 
     for (int i = 0; i < sample_num_; ++i) {
         GCEMat cvtMat;
-        for (int j = 0; j < level_num_; ++j) {
-            cvtMat.append(QVector<GCEmat>(level_num_, { 0.0, 0.0 }));
-        }
+        cvtMat.append(QVector<GCEmat>(level_num_, { 0.0, 0.0 }));
         ranges_cv_.append(cvtMat);
     }
     QVector<GCEmat> cvrang_weights(level_num_, { 0.0, 0.0 });
@@ -38,41 +36,30 @@ void GreyClusterEvaluation::evaluate(const QVector<double> &weights)
 
 void GreyClusterEvaluation::triangularwhiteningweight(int sam, double front_val, double back_val)
 {
-    auto pFunc1 = [](double left, double right) { return (left + right) / 2; };
-    auto pFunc2 = [](double v, double left_left, double left_right) {
-        if (left_left == left_right) {
-            return 0.0;
-        }
-        return (v - left_left) / (left_right - left_left);
-    };
-    auto pFunc3 = [](double v, double left_right, double right_right) {
-        if (right_right == left_right) {
-            return 0.0;
-        }
-        return (right_right - v) / (right_right - left_right);
-    };
-
     for (int i = 0; i < level_num_; ++i) {
         Q_ASSERT(ranges_.at(sam).at(i).level == i);
-        double r1 = pFunc1(ranges_.at(sam).at(i).left_val, ranges_.at(sam).at(i).right_val);
-        double r2 = pFunc2(front_val, ranges_.at(sam).at(i).left_left, r1);
-        double r3 = pFunc3(front_val, r1, ranges_.at(sam).at(i).right_right);
-        if ((front_val >= ranges_.at(sam).at(i).left_left) && (front_val <= r1)) {
-            ranges_cv_[sam][i].front_val = r2;
-        } else if ((front_val >= r1) && (front_val <= ranges_.at(sam).at(i).right_right)) {
-            ranges_cv_[sam][i].front_val = r3;
-        } else {
+        // 计算前
+        double a1, a2, a3, a4;
+        a1              = ranges_.at(sam).at(i).left_left;
+        a2              = ranges_.at(sam).at(i).left_val;
+        a3              = ranges_.at(sam).at(i).right_val;
+        a4              = ranges_.at(sam).at(i).right_right;
+        double lambda_k = (a2 + a3) / 2;
+
+        if (front_val > a4 || front_val < a1) {
             ranges_cv_[sam][i].front_val = 0;
+        } else if ((front_val >= a1) && (front_val < lambda_k)) {
+            ranges_cv_[sam][i].front_val = (front_val - a1) / (lambda_k - a1);
+        } else if ((front_val > lambda_k) && (front_val <= a4)) {
+            ranges_cv_[sam][i].front_val = (a4 - front_val) / (a4 - lambda_k);
         }
 
-        r2 = pFunc2(back_val, ranges_.at(sam).at(i).left_left, r1);
-        r3 = pFunc3(back_val, r1, ranges_.at(sam).at(i).right_right);
-        if ((back_val >= ranges_.at(sam).at(i).left_left) && (back_val <= r1)) {
-            ranges_cv_[sam][i].back_val = r2;
-        } else if ((back_val >= r1) && (back_val <= ranges_.at(sam).at(i).right_right)) {
-            ranges_cv_[sam][i].back_val = r3;
-        } else {
+        if (back_val > a4 || back_val < a1) {
             ranges_cv_[sam][i].back_val = 0;
+        } else if ((back_val >= a1) && (back_val < lambda_k)) {
+            ranges_cv_[sam][i].back_val = (back_val - a1) / (lambda_k - a1);
+        } else if ((back_val > lambda_k) && (back_val <= a4)) {
+            ranges_cv_[sam][i].back_val = (a4 - back_val) / (a4 - lambda_k);
         }
     }
 }
@@ -115,12 +102,12 @@ BestIndex GreyClusterEvaluation::getBestIndex() const
     //    }
 
     for (int i = 0; i < ranges_cv_.size(); i++) {
-        qDebug() << "指标" << i;
+        qDebug() << "指标" << i << " 深度" << ranges_cv_.at(i).count();
         int n = 0;
         for (auto &item : ranges_cv_.at(i)) {
             qDebug() << QString("    前 %1 : 后 %2").arg(item.front_val).arg(item.back_val);
             n++;
-            if (n >= 4)
+            if (n >= level_num_)
                 break;
         }
     }

+ 3 - 3
QFD/algorithm/GreyClusterEvaluation.h

@@ -22,8 +22,8 @@ struct GCEmat
 };
 struct BestIndex
 {
-    int front_index;
-    int back_index;
+    int front_index; // 实现前
+    int back_index;  // 实现后
 };
 
 typedef QVector<GCEmat> GCEMat;
@@ -59,7 +59,7 @@ private:
 
     GCEMat mat_;
     GCERangeMat ranges_;
-    QVector<GCEMat> ranges_cv_;
+    QVector<GCEMat> ranges_cv_; //白化权函数值
     QVector<GCEmat> ranges_weight_;
 };