[COLOR=white]<html>
<head>
<title>Cutting length optimiser</title>
<style type="text/css">
html, body {
padding: 0px;
margin: 0px;
}
body {
margin: 1em;
font-family: Verdana, Arial, sans-serif;
font-size: 0.8em;
}
div.outer {
background-color: #FFE7B9;
margin-bottom: 1em;
padding: 1em;
}
</style>
<script type="text/javascript">
<!--
// both these arrays hold arrays of "quantity, length"
var woodToCut = [[22, 7114], [2, 7097], [2, 7074], [15, 5016], [15, 5006], [80, 2930], [10, 2740], [110, 2636]];
var woodAvailable = [[30, 15500], [31, 14000]];
var bladeWidth = 10;
var startTime = endTime = null;
function sortPairsByLengthAsc(a, b) {
if (a[1] < b[1]) return(-1);
if (a[1] > b[1]) return(1);
return(0);
}
function sortPairsByLengthDesc(a, b) {
if (a[1] < b[1]) return(1);
if (a[1] > b[1]) return(-1);
return(0);
}
function findMeasurements() {
var s = '';
var iteration = 1;
var runLoop = true;
//var runLoop = false; // leave in to bypass loop!
startTime = new Date().getTime();
while (runLoop) {
s += '<br /><b>Iteration ' + iteration + '</b>\n';
woodAvailable.sort(sortPairsByLengthDesc);
var havePiecesLeft = false;
for (var loop=0; loop<woodToCut.length; loop++) {
// make sure we need to still cut pieces of this length
if (woodToCut[loop][0] != 0) {
havePiecesLeft = true;
s += '<br />Trying to find a piece at least ' + woodToCut[loop][1] + 'mm in length<br />\n';
// now see if we can cut this length from any pieces. if not, we may as well stop!
var foundAt = -1;
for (var loop2=0; loop2<woodAvailable.length; loop2++) {
if (woodAvailable[loop2][1] >= woodToCut[loop][1] && woodAvailable[loop2][0] != 0) {
foundAt = loop2;
break; // could go on here to search remaining lengths to see if an exact (or closer) match is found
}
}
if (foundAt == -1) {
// no point in continuing if we can never finish!
s += '<br /><b>No more pieces of the right length left!</b><br />\n';
runLoop = false;
break;
} else {
var existingLength = newLength = woodAvailable[foundAt][1];
// decrease cutting quantity
woodToCut[loop][0]--;
// perform cutting. remove length, and, if still necessary, 10mm
// if the 10mm isn't available, we know this is the end of a length, and no cutting is necessary
newLength -= woodToCut[loop][1];
if (woodAvailable[foundAt][1] <= bladeWidth) {
s += 'Found! No cut necessary. Single piece available of length: ' + woodAvailable[foundAt][1] + 'mm<br />\n';
} else {
newLength -= bladeWidth;
s += 'Found! Cutting into a ' + existingLength + 'mm piece, leaving a ' + newLength + 'mm piece<br />\n';
}
// decrease count of bits of wood available of this length
woodAvailable[foundAt][0]--;
// and add in 1 piece of the new length, checking first to see if there are already any
// (in which case, we simply increase the quantity)
var foundExisting = false;
for (var loop2=0; loop2<woodAvailable.length; loop2++) {
if (woodAvailable[loop2][1] == newLength) {
foundExisting = true;
woodAvailable[loop2][0]++;
break;
}
}
if (!foundExisting) woodAvailable[woodAvailable.length] = [1, newLength];
}
}
} // for (var loop=0; loop<woodToCut.length; loop++) {
if (!havePiecesLeft) runLoop = false;
s += '<br /><b>Iteration ' + (iteration++) + ' Results</b><br />\n';
for (var loop=0; loop<woodToCut.length; loop++) {
s += 'Cut ' + woodToCut[loop][0] + ' pieces at ' + woodToCut[loop][1] + 'mm<br />\n';
}
}
var delta = new Date().getTime() - startTime;
document.getElementById('results').innerHTML = s;
var mins = parseInt(delta / 1000 / 60, 10);
var secs = (delta - (mins * 60 * 1000)) / 1000;
var s = 'Time taken: ' + mins + (mins == 1 ? ' minute' : ' minutes') + ', ' + secs + ' seconds ';
document.getElementById('stats').innerHTML = s;
}
window.onload = function() {
// sort "wood to cut" list by length, in descending order
woodToCut.sort(sortPairsByLengthDesc);
woodAvailable.sort(sortPairsByLengthDesc);
// Show user-friendly details
var s = '<br /><b>Cutting Requirements</b><br />\n';
for (var loop=0; loop<woodToCut.length; loop++) {
s += 'Cut ' + woodToCut[loop][0] + ' pieces at ' + woodToCut[loop][1] + 'mm<br />\n';
}
s += '<br /><b>Wood Available</b><br />\n';
for (var loop=0; loop<woodAvailable.length; loop++) {
s += woodAvailable[loop][0] + ' pieces at ' + woodAvailable[loop][1] + 'mm<br />\n';
}
document.getElementById('requirements').innerHTML = s;
findMeasurements();
};
//-->
</script>
</head>
<body>
<div class="outer">
<b>Requirements</b>
<div id="requirements">None yet</div>
</div>
<div class="outer">
<b>Results</b>
<div id="results">None yet</div>
</div>
<div class="outer">
<b>Statistics</b>
<div id="stats">None yet</div>
</div>
</body>
</html>[/color]