找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-30 12:29  /   查看:2946  /  回复:0
本帖最后由 Lynn.Dou 于 2021-8-30 13:53 编辑

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

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

  13.         sheet.suspendPaint();
  14.         var target1value = sheet.getValue(range1.row, range1.col);
  15.         var target2value = sheet.getValue(range2.row, range2.col);
  16.         var person1value = sheet.getValue(range4.row, range4.col);
  17.         var cost1value = sheet.getValue(range5.row, range5.col);
  18.         var person2value = sheet.getValue(range7.row, range7.col);
  19.         var cost2value = sheet.getValue(range8.row, range8.col);
  20.         sheet.resumePaint();

  21.         // 赋值给model
  22.         var att1 = "capacity";
  23.         var att2 = "plane";
  24.         var att3 = "person";
  25.         var att4 = "cost";
  26.         //约束条件 类型
  27.         var cons1Type = result.compare1; // 或max、min、equal
  28.         var cons2Type = result.compare2;
  29.         var cons3Type = result.compare3;
  30.         var cons1Value = Number(result.quantityNumber);//44
  31.         var cons2Value = Number(result.personNumber);//512
  32.         var cons3Value = Number(result.costNumber);//300000
  33.         //优化类型
  34.         var onTypeValue = result.radioValue;

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

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

  42.         var var1 = {};
  43.         var1[att1] = target1value;
  44.         var1[att2] = 1;
  45.         var1[att3] = person1value;
  46.         var1[att4] = cost1value;
  47.         myModel.variables.var1Name = var1;

  48.         var var2 = {};
  49.         var2[att1] = target2value;
  50.         var2[att2] = 1;
  51.         var2[att3] = person2value;
  52.         var2[att4] = cost2value;
  53.         myModel.variables.var2Name = var2;

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

  56.         var cons1Name = {};
  57.         cons1Name[cons1Type] = cons1Value;
  58.         myModel.constraints[att2] = cons1Name;

  59.         var cons2Name = {};
  60.         cons2Name[cons2Type] = cons2Value;
  61.         myModel.constraints[att3] = cons2Name;

  62.         var cons3Name = {};
  63.         cons3Name[cons3Type] = cons3Value;
  64.         myModel.constraints[att4] = cons3Name;

  65.         var myResult = mySolver.Solve(myModel);
  66.         console.log(myResult)
  67.         //解析结果,给单元格赋值
  68.         sheet.suspendPaint();
  69.         sheet.setValue(range3.row, range3.col, myResult.var1Name);
  70.         sheet.setValue(range6.row, range6.col, myResult.var2Name);
  71.         sheet.resumePaint();
  72.     })
复制代码


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

3、
最后我们使用setValue方法将myResult赋值,实现自动完成规划求解。
  1. sheet.suspendPaint();
  2.         sheet.setValue(range3.row, range3.col, myResult.var1Name);
  3.         sheet.setValue(range6.row, range6.col, myResult.var2Name);
  4.         sheet.resumePaint();
复制代码

完整操作步骤见下方动图,完整demo请参考附件demo(Vue版本)

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





111.gif

规划求解-vue.zip

106.27 KB, 下载次数: 146

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部