فهرست منبع

改进算法,精准逼近:误差≤1。

chenshilong 4 سال پیش
والد
کامیت
8bfdcf6ee1
1فایلهای تغییر یافته به همراه16 افزوده شده و 5 حذف شده
  1. 16 5
      web/building_saas/main/js/models/calc_program.js

+ 16 - 5
web/building_saas/main/js/models/calc_program.js

@@ -2190,7 +2190,8 @@
        $.bootstrapLoading.end();
      });
    };
-   // 计算本节点及所有会被影响到的节点,如:所有父节点(默认,可选)、公式引用节点(默认,可选)。修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点。
+   // 计算本节点及所有会被影响到的节点,如:所有父节点(默认,可选)、公式引用节点(默认,可选)。
+   // 修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点。
    calculate(treeNode, calcParents = true, calcFormulas = true, tender) {
      let me = this;
      let changedNodes = [];
@@ -2603,9 +2604,9 @@
      let me = this;
 
      let G_DIGIT = 0.01;      // 系数调整步距(0.1最终结果误差大。0.001目标金额与逼前金额差距大时无法有效逼近)
-     let times = 200;         // 逼近计算的极限次数。正常情况下“单位系数金额”列表中的结点耗尽即退出,这里指定轮数是最后保险阀,防止无限死循环。
+     let times = 300;         // 逼近计算的极限次数。正常情况下“单位系数金额”列表中的结点耗尽即退出,这里指定轮数是最后保险阀,防止无限死循环。
      let calcModel = 1;       // 计算模式:1 精度优先(差值不接近0不停,直到结点用完或极限次数用完。时间长精度高)2 速度优先(达到指定差值范围即熔断逼近。时间短差值大)
-     let diffProp = 0.0001;   // 速度优先模式下的:差值比例
+     let diffProp = 0.0001;   // 计算模式=2(速度优先)时有效。 计算可接受的差值D。差值D = 根结点金额 * diffProp
      let isTest = true;       // 测试
 
      // 取树结点的调价系数。
@@ -2717,7 +2718,11 @@
          closeNode.data.quantityCoe.equipment = coe
        };
        me.calculate(closeNode);
-       if (isTest) console.log(`       [索引${obj.nodeIdx} 行${obj.node.data.tender_rowNo}]过调,已回退`);
+       if (isTest) {
+         let _sp = `        `;   // 保留空格,打印对齐
+         let _node = `[行${obj.node.data.tender_rowNo} 索引${obj.nodeIdx}]`;
+         console.log(`${_sp} ${_node} 过调,已回退`);
+       }
      }
 
      let root = tender_obj.tenderTree.roots[0];
@@ -2752,7 +2757,12 @@
 
        let d2 = getRootDiff();
 
-       if (isTest) console.log(`【第 ${i} 轮】调整[索引${obj.nodeIdx} 行${obj.node.data.tender_rowNo}] ${obj.node.data.tender_previousCoe} → ${getCoe(obj.node)},差值${d1} → ${d2}`);
+       if (isTest){
+         let _node = `[行${obj.node.data.tender_rowNo} 索引${obj.nodeIdx}]`;
+         let _coe = `${obj.node.data.tender_previousCoe} → ${getCoe(obj.node)}`;
+         let _d = `差值${d1} → ${d2}`;
+         console.log(`【第 ${i} 轮】调整${_node} ${_coe},${_d}`);
+       }
 
        if (Math.abs(d2) > Math.abs(d1)){    // 逼近后差距反而变大,证明过调,回退一步
          undoLastApproach(obj);
@@ -2804,6 +2814,7 @@
    };
 
    doTenderCalc(callback) {
+     $.bootstrapLoading.start();
      let sOption = calcTools.getTenderCalcType();
      let tender;
      if (sOption == 'coeBase')