Skip to content

Instantly share code, notes, and snippets.

@sabotuer99
Created June 17, 2017 05:03
Show Gist options
  • Save sabotuer99/bd2813ba4334cee453a8a878bbabfb63 to your computer and use it in GitHub Desktop.
Save sabotuer99/bd2813ba4334cee453a8a878bbabfb63 to your computer and use it in GitHub Desktop.
Truck Position DP, Version 2
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Analysis')
.addItem('Generate Positions', 'genPositions')
.addToUi();
}
function genPositions() {
var data = SpreadsheetApp.getActive().getSheetByName("data").getDataRange().getValues();
var positions = data.length;
var girders = data[0].length;
var state = {}
state.data = data;
state.combos = [];
state.max = positions;
runCombine(state);
var combos = state.combos;
var resultsPage = SpreadsheetApp.getActive().getSheetByName("Results");
resultsPage.clear();
//if(combos.length * combos[0].length < 2000000){
// resultsPage.getRange(1,1,combos.length,combos[0].length).setValues(combos);
//} else {
//just put everything in csv file
resultsPage.getRange(1,1,1,1).setValues([["Results saved to results(x).csv files in Drive"]]);
saveCSV(combos);
//}
}
function saveCSV(combos){
console.log("Started csv generation");
var folder = DriveApp.getRootFolder();
var content = "";
var h = combos.map(function (a) { return a.join(",") + "\n";});
for(var i = 0; i < h.length; i += 50000){
var rows = h.slice(i, i + 50000);
content = rows.join("");
var datestr = new Date().toISOString();
var filename = "results("+ i +")"+datestr+".csv";
folder.createFile(filename, content);
}
}
function runCombine(state){
var end = state.max;
var D = [];
var done = {};
for(var i = (end-2); i >= 1; i--){
var aRow = state.data[i - 1].slice();
aRow.unshift(i.toString());
aRow.unshift(1);
var bRow = state.data[i].slice();
bRow.unshift((i+1).toString());
bRow.unshift(1);
var cRow = state.data[i + 1].slice();
cRow.unshift((i+2).toString());
cRow.unshift(1);
D[i] = [];
if(!done.hasOwnProperty(aRow[1])){
D[i].push(aRow);
done[aRow[1]] = true;
}
if(!done.hasOwnProperty(bRow[1])){
D[i].push(bRow);
done[bRow[1]] = true;
}
if(!done.hasOwnProperty(cRow[1])){
D[i].push(cRow);
done[cRow[1]] = true;
}
for(var j = i + 12; j <= (end-2); j++){
//limit combination length
var limit = 3;
var fD = D[j].slice().filter(function (row) { return row[0] < limit; });
//for(var x = 0; x < D[j].length; x++){
//var row = D[j][x];
for(var x = 0; x < fD.length; x++){
var row = fD[x];
var depth = row[0] + 1;
var aname = aRow[1] + "_" + row[1];
var bname = bRow[1] + "_" + row[1];
var cname = cRow[1] + "_" + row[1];
var aNewRow = [depth, aname];
var bNewRow = [depth, bname];
var cNewRow = [depth, cname];
for(var k = 2; k < row.length; k++){
aNewRow.push(row[k] + aRow[k]);
bNewRow.push(row[k] + bRow[k]);
cNewRow.push(row[k] + cRow[k]);
}
if(!done.hasOwnProperty(aNewRow[1])){
D[i].push(aNewRow);
done[aNewRow[1]] = true;
}
if(!done.hasOwnProperty(bNewRow[1])){
D[i].push(bNewRow);
done[bNewRow[1]] = true;
}
if(!done.hasOwnProperty(cNewRow[1])){
D[i].push(cNewRow);
done[cNewRow[1]] = true;
}
}
}
console.log(i + ": " + D[i].length);
}
D.forEach(function (group) {
group.forEach(function (combo){
var name = combo[1];
var mpCombo = [name];
for(var m = 2; m < combo.length; m++)
mpCombo.push(combo[m] * mpFactor(combo[0]));
state.combos.push(mpCombo);
});
});
}
function mpFactor(depth){
if(depth >= 4)
return 0.65;
if(depth == 3)
return 0.85;
if(depth == 2)
return 1;
return 1.2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment