
給定幾行分數和變數,如何在 Excel 或表格中發現權重?

- 使用下面的腳本:
function solveWeights() {
// Get data, process, then outputs on the actual column header.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const vars = sheet.getLastColumn() - 1;
let data = sheet.getRange(1, 1, vars 1, vars 1).getValues();
let headers = data.shift();
let solution = [nerdamer.solveEquations(data.map(row => {
return `${row[0]}=${row.slice(1).map((x, i) => x headers[i 1]).join(' ')}`;
})).toString().split(',').filter((_, i) => i % 2 == 1).map((x, i) => `${headers[i 1]} = ${x}`)]
sheet.getRange(1, 2, solution.length, solution[0].length).setValues(solution);
}
樣本資料:

輸出:

筆記:
- 您可以在輸出范圍中添加偏移量,這樣它就不會覆寫您的列。
- 準備多個庫會減慢執行速度,因此可能需要一段時間,但應該需要大約 5 秒才能完成(使用 4 列/變數資料)
編輯:
- 如果不想使用外部庫,可以使用
LinearOptimizationService. 請參閱下面的示例:
function solveWeight() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getActiveSheet();
const vars = sheet.getLastColumn() - 1;
// fetch N rows based on how many variables are present
const data = sheet.getRange(1, 1, vars 1, vars 1).getValues();
let headers = data.shift();
headers = headers.slice(1);
let engine = LinearOptimizationService.createEngine();
// add variable
headers.forEach(header => {
// set the range of the weights' possible values (e.g. 0 - 100)
engine.addVariable(header, 0, 100);
});
// create constraint
data.forEach(row => {
let sum = row.shift();
let constraint = engine.addConstraint(sum, sum);
// set all values as coefficients
row.forEach((value, index) => {
constraint.setCoefficient(headers[index], value);
});
});
// get lowest possible values
engine.setMinimization();
let solution = engine.solve();
if (!solution.isValid())
Logger.log('No solution: ' solution.getStatus());
else
headers.forEach(header => {
// workaround due to rounding issue of javascript
console.log(header ' value is: ' solution.getVariableValue(header).toFixed(2))
});
}
輸出:

筆記:
- 這種方法的缺點是您需要宣告權重的范圍,以及其他變數,例如每個權重的系數等。上面的代碼假設所有權重都在 0 - 100 之間。
- 線性優化服務上的代碼只記錄資料,您可以將其修改為自定義函式,或者直接將其寫入作業表。
參考:
- 線性優化服務
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488093.html
標籤:谷歌应用脚本 谷歌表格公式 线性规划 excel求解器 线性优化
上一篇:如何呼叫存盤在陣列中的函式
