Lynn.Dou 发表于 2021-8-30 12:29:44

组件版设计器结合jsLPSolver实现规划求解 - part3

本帖最后由 Lynn.Dou 于 2021-8-30 13:53 编辑

接上文:组件版设计器结合jsLPSolver实现规划求解 - part2
本篇文章主要介绍如何将jsLPSolver与弹窗结合,实现规划求解。

1、
在part1中为了更便于理解问题,我们做了一个表,如下图:

那么首先就先将这些数据初始化在designer中。
代码如下:
var sheet = spread.getActiveSheet();
                var arr = [["飞机", "容量", "数量", "容纳人数", "费用"], ["美国", 30000, 1, 16, 9000], ["英国", 20000, 1, 8, 5000], ["总", null, null, null, null]];
                sheet.setArray(1, 1, arr);
                sheet.setFormula(4, 2, "=C3*D3+C4*D4");
                sheet.getRange(1, 1, 4, 5).setBorder(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin), { all:true });
                sheet.getRange(1, 1, 1, 5).backColor("green").foreColor("white");2、
在弹窗中内输入数据后,点击确认按钮可以获取到我们填写的数据(result)。
此时结合jsLPSolver, 将获取的数据进行计算,获取最优值。
这里需要注意,为了灵活应用选择的数据,需要对 jsLPSolver 中model进行json拼接,
然后执行Solve方法。
代码如下:
// 定义option,初始化显示
    var option = {
      radioValue: "max",
      compare1: "max",
      compare2: "max",
      compare3: "max",
      target1: "请输入最优目标值1(容量)",
      target2: "请输入最优目标值2(容量)",
      optimalQuantity1: "最终计算值1单元格",
      optimalQuantity2: "最终计算值2单元格",
      person1: "请输入可容纳人数",
      person2: "请输入可容纳人数",
      cost1: "请输入运输成本",
      cost2: "请输入运输成本",
      dialogOption: {
            activeTab: "solverTab"
      }
    }
// 点击弹窗确认按钮后执行的代码逻辑
    GC.Spread.Sheets.Designer.showDialog("newTab", option, (result) => {
      console.log(result);
      var sheet = spread.getActiveSheet();
      var range1 = sheet.getRange(getRangeStr(result.target1));
      var range2 = sheet.getRange(getRangeStr(result.target2));
      var range3 = sheet.getRange(getRangeStr(result.optimalQuantity1));// 最终计算美国飞机数量
      var range4 = sheet.getRange(getRangeStr(result.person1));
      var range5 = sheet.getRange(getRangeStr(result.cost1));
      var range6 = sheet.getRange(getRangeStr(result.optimalQuantity2));// 最终计算英国飞机数量
      var range7 = sheet.getRange(getRangeStr(result.person2));
      var range8 = sheet.getRange(getRangeStr(result.cost2));

      sheet.suspendPaint();
      var target1value = sheet.getValue(range1.row, range1.col);
      var target2value = sheet.getValue(range2.row, range2.col);
      var person1value = sheet.getValue(range4.row, range4.col);
      var cost1value = sheet.getValue(range5.row, range5.col);
      var person2value = sheet.getValue(range7.row, range7.col);
      var cost2value = sheet.getValue(range8.row, range8.col);
      sheet.resumePaint();

      // 赋值给model
      var att1 = "capacity";
      var att2 = "plane";
      var att3 = "person";
      var att4 = "cost";
      //约束条件 类型
      var cons1Type = result.compare1; // 或max、min、equal
      var cons2Type = result.compare2;
      var cons3Type = result.compare3;
      var cons1Value = Number(result.quantityNumber);//44
      var cons2Value = Number(result.personNumber);//512
      var cons3Value = Number(result.costNumber);//300000
      //优化类型
      var onTypeValue = result.radioValue;

      var myModel = {};
      // 优化,对应的变量名,如:利润 profit
      myModel.optimize = att1;
      // 优化类型,max 或 min
      myModel.opType = onTypeValue;

      // 变量,根据实际情况动态添加
      myModel.variables = {};

      var var1 = {};
      var1 = target1value;
      var1 = 1;
      var1 = person1value;
      var1 = cost1value;
      myModel.variables.var1Name = var1;

      var var2 = {};
      var2 = target2value;
      var2 = 1;
      var2 = person2value;
      var2 = cost2value;
      myModel.variables.var2Name = var2;

      // 约束条件
      myModel.constraints = {};

      var cons1Name = {};
      cons1Name = cons1Value;
      myModel.constraints = cons1Name;

      var cons2Name = {};
      cons2Name = cons2Value;
      myModel.constraints = cons2Name;

      var cons3Name = {};
      cons3Name = cons3Value;
      myModel.constraints = cons3Name;

      var myResult = mySolver.Solve(myModel);
      console.log(myResult)
      //解析结果,给单元格赋值
      sheet.suspendPaint();
      sheet.setValue(range3.row, range3.col, myResult.var1Name);
      sheet.setValue(range6.row, range6.col, myResult.var2Name);
      sheet.resumePaint();
    })

输入数据测试一下(操作步骤请参考下方动图):
打印输出 result 可以看到,我们在弹窗中填写/选择的数据已经获取到。
打印输出 myResult,可以获取到最佳分配方案和最优值。

3、
最后我们使用setValue方法将myResult赋值,实现自动完成规划求解。
sheet.suspendPaint();
      sheet.setValue(range3.row, range3.col, myResult.var1Name);
      sheet.setValue(range6.row, range6.col, myResult.var2Name);
      sheet.resumePaint();
完整操作步骤见下方动图,完整demo请参考附件demo(Vue版本)

本篇文章只是做简单示例,有很多因素暂未考虑,仅作参考作用。
大家可以结合自己业务情况进一步调研完善下。





页: [1]
查看完整版本: 组件版设计器结合jsLPSolver实现规划求解 - part3