组件版设计器结合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]