本帖最后由 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[att1] = target1value;
- var1[att2] = 1;
- var1[att3] = person1value;
- var1[att4] = cost1value;
- myModel.variables.var1Name = var1;
- var var2 = {};
- var2[att1] = target2value;
- var2[att2] = 1;
- var2[att3] = person2value;
- var2[att4] = cost2value;
- myModel.variables.var2Name = var2;
- // 约束条件
- myModel.constraints = {};
- var cons1Name = {};
- cons1Name[cons1Type] = cons1Value;
- myModel.constraints[att2] = cons1Name;
- var cons2Name = {};
- cons2Name[cons2Type] = cons2Value;
- myModel.constraints[att3] = cons2Name;
- var cons3Name = {};
- cons3Name[cons3Type] = cons3Value;
- myModel.constraints[att4] = 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版本)
本篇文章只是做简单示例,有很多因素暂未考虑,仅作参考作用。
大家可以结合自己业务情况进一步调研完善下。
|
|