Explorar o código

反向调价逼近算法:快速模式

chenshilong %!s(int64=4) %!d(string=hai) anos
pai
achega
897491ceb2
Modificáronse 1 ficheiros con 10 adicións e 2 borrados
  1. 10 2
      web/building_saas/main/js/models/calc_program.js

+ 10 - 2
web/building_saas/main/js/models/calc_program.js

@@ -2603,6 +2603,11 @@
      let me = this;
      let G_DIGIT = 0.01;   // 系数调整步距(0.1最终结果误差大。0.001目标金额与逼前金额差距大时无法有效逼近)
      let times = 100;      // 逼近轮数
+
+     let quickModel = false;  // 快速模式
+     let qmTimes = 50;        // 快速模式下的极限次数
+     let qmValue = 10;        // 快速模式下允许的误差值上限
+
      let isTest = true;    // 测试
 
      // 取树结点的调价系数。
@@ -2613,7 +2618,7 @@
      // 取根结点的:调后金额跟目标金额差值,看还有多少误差需要处理。
      function  getRootDiff() {
        let root = tender_obj.tenderTree.roots[0];
-       return root.data.feesIndex.common.tenderTotalFee - root.data.targetTotalFee;
+       return (root.data.feesIndex.common.tenderTotalFee - root.data.targetTotalFee).toDecimal(3);
      }
 
      // 生成每单位差值的定额结点列表。
@@ -2719,7 +2724,10 @@
 
      // 多轮逼进
      for (let i = 1; i <= times; i++) {
-       if (d1 == 0) break;              // 结果与目标金额完全一致,完美。
+       if (Math.abs(d1) < 1) break;              // 误差在1以内,结果与目标金额完全一致,完美。
+       if (quickModel){                          // 快速模式:在指定的计算轮数内,能达到指定的差值范围内,也很理想。这个条件用于减少计算轮数,提高效率。
+         if ((Math.abs(d1) < qmValue) && (times > qmTimes)) break;
+       };
        let obj = approach(vArr);
        if (obj.type == 2) break;        // 列表已清空,无结点可调。
        if (obj.type == 3) {             // 结点过调,该结点任务已完成,不再参与调节,从列表中清除