Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <meta name="author" name="Giacomo Rizzi">
- <style type="text/css">
- body {
- font: 120% 'monospace';
- }
- input {
- font: inherit;
- }
- form {
- display: none;
- }
- #system input {
- width: 30px;
- text-align: right;
- border: none;
- background: #ddd;
- }
- table {
- margin-top: 50px;
- border-collapse: collapse;
- }
- tbody {
- }
- table td {
- border: 1px solid #000;
- text-align: right;
- }
- </style>
- <script>
- if (!Array.prototype.last){
- Array.prototype.last = function(){
- return this[this.length - 1];
- };
- }
- if (!Array.prototype.max){
- Array.prototype.max = function(){
- var max = 0;
- for(var i in this)
- if (this[i] > this[max]) {
- max = i;
- }
- return max;
- };
- }
- v = {
- 'nvar' : 0,
- 'neq' : 0,
- 'max' : [],
- 'sys' : [],
- 'slack' : [],
- 'model' : []
- };
- window.onload = function() {
- var in_nvar = document.getElementsByName('nvar')[0],
- in_neq = document.getElementsByName('neq')[0],
- in_type = document.getElementsByName('type')[0],
- nvar = document.getElementById('nvar'),
- neq = document.getElementById('neq'),
- prep1 = document.getElementById('prep1'),
- prep2 = document.getElementById('prep2');
- in_nvar.onchange = function() {
- nvar.innerHTML = v.nvar = parseInt(in_nvar.value);
- }
- in_neq.onchange = function() {
- neq.innerHTML = v.neq = parseInt(in_neq.value);
- }
- in_nvar.onchange();
- in_neq.onchange();
- prep1.style.display = 'block';
- prep1.onsubmit = function() {
- if (in_type.value == 'max') {
- ;
- } else if (in_type.value == 'min') {
- ;
- } else {
- alert('You suck');
- return true;
- }
- var tbl = '';
- tbl+= '<tr>'
- tbl+= '<td>'+in_type.value+': </td>';
- for(var i = 0; i < v.nvar; i++) {
- v.max[i] = parseInt(Math.random()*10);
- v.max[i] = 0;
- tbl+= '<td>';
- tbl+= '<input type="text" value="'+v.max[i]+'" onchange="v.max['+i+']=num(this)">x<sub>'+(i+1)+'</sub> ';
- tbl+= '</td>';
- }
- tbl+= '</tr>';
- for(var i = 0; i < v.neq; i++) {
- v.sys[i] = [];
- v.slack[i] = 0;
- tbl+= '<tr>';
- tbl+= '<td>'+(i+1)+')</td>';
- for(var j = 0; j < v.nvar; j++) {
- v.sys[i][j] = parseInt(Math.random()*10);
- v.sys[i][j] = 0;
- tbl+= '<td>';
- tbl+= '<input type="text" value="'+v.sys[i][j]+'" onchange="v.sys['+i+']['+j+']=num(this)">x<sub>'+(j+1)+'</sub> ';
- tbl+= '</td>';
- }
- v.sys[i][j] = parseInt(Math.random()*10)*10;
- v.sys[i][j] = 0;
- tbl+= '<td>';
- tbl+= '<= <input type="text" value="'+v.sys[i][j]+'" onchange="v.sys['+i+']['+j+']=num(this)">';
- tbl+= '</td>';
- tbl+= '</tr>';
- }
- document.getElementById('system').innerHTML = tbl;
- prep1.style.display = 'none';
- prep2.style.display = 'block';
- return false;
- }
- prep2.onsubmit = function() {
- // TODO: remove the test
- /*
- v.max = [300, 200, 350];
- v.sys = [
- [1,1,1,40],
- [4,2,3,120],
- [0,0,1,20]
- ]
- */
- v.model = {};
- // The system part
- for(var i = 0; i < v.neq; i++) {
- v.model[i] = {
- 'c' : 0,
- 's' : v.nvar+i,
- 'b' : parseInt(v.sys[i].last())
- };
- for(var j = 0; j < v.nvar; j++) {
- v.model[i][j] = v.sys[i][j];
- }
- for(var j = 0; j < v.slack.length; j++) {
- v.model[i][v.nvar+j] = i==j?1:0;
- }
- }
- // The target function line
- v.model[v.neq] = {
- 's' : 'c<sub>r</sub>'
- };
- for(var i = 0; i < v.nvar; i++) {
- v.model[v.neq][i] = (in_type.value=='min'?-1:1)*v.max[i];
- }
- for(var i = 0; i < v.slack.length; i++) {
- v.model[v.neq][v.nvar+i] = 0;
- }
- // The delta line
- v.model[v.neq+1] = {
- 's' : 'Δ<sub>r</sub>'
- };
- for(var i = 0; i < v.nvar+v.slack.length; i++) {
- var sum = 0;
- for(var k = 0; k < v.neq; k++) {
- sum+= v.model[k]['c']*v.model[k][i];
- }
- v.model[v.neq+1][i] = v.model[v.neq][i]-sum;
- }
- // The solution line
- v.model[v.neq+2] = {
- 's': 'sol'
- };
- for(var j = 0; j < v.nvar+v.slack.length; j++) {
- var found = -1;
- for(var i = 0; i < v.neq; i++) {
- if (v.model[i][j] == 0) {
- continue;
- }
- if (found >= 0) {
- found = -1;
- break;
- }
- if (v.model[i][j] == 1) {
- found = i;
- }
- }
- if (found >= 0) {
- v.model[v.neq+2][j] = v.model[found].b;
- } else {
- v.model[v.neq+2][j] = 0;
- }
- }
- var y = 0;
- for(var i = 0; i < v.nvar; i++)
- y+= v.max[i]*v.model[v.neq+2][i];
- v.model[v.neq+2].b = 'y = '+y;
- document.getElementById('solution').innerHTML = '';
- setTimeout(function() {
- var i = 0;
- do {
- var m = document.createElement('table');
- drawModel(m);
- document.getElementById('solution').appendChild(m);
- i++;
- } while(!newModel() && i < 100);
- });
- return false;
- }
- }
- function newModel() {
- // Check if the solution is complete
- var complete = true;
- for(var j = 1; j < v.nvar+v.slack.length; j++) {
- if (v.model[v.neq+1][j] > 0) {
- complete = false;
- break;
- }
- }
- if (complete)
- return true;
- // Search the incoming variable
- var max = 0;
- for(var j = 1; j < v.nvar+v.slack.length; j++) {
- if (v.model[v.neq+1][j] > v.model[v.neq+1][max])
- max = j;
- }
- var valid = false;
- for(var i = 0; i < v.neq; i++) {
- if (v.model[i][max] > 0) {
- valid = true;
- break;
- }
- }
- // TODO: adjust this
- if (!valid) {
- alert('Non valida D:');
- return true;
- }
- // Search the outgoing variable
- var min = 0;
- for(var i = 1; i < v.neq; i++) {
- if (v.model[i].b/v.model[i][max] < v.model[min].b/v.model[min][max])
- min = i;
- }
- // Replace the outgoing with the incoming variable
- v.model[min].s = max;
- v.model[min].c = v.model[v.neq][max];
- var pivot = v.model[min][max];
- // Divide the pivot line
- for (var j = 0; j < v.nvar+v.slack.length; j++) {
- v.model[min][j]/= pivot;
- }
- v.model[min].b/= pivot;
- // Adjust all the other cells
- for(var i = 0; i < v.neq; i++) {
- if (i == min)
- continue;
- var c = v.model[i][max];
- for (var j = 0; j < v.nvar+v.slack.length; j++)
- v.model[i][j]-= c*v.model[min][j];
- v.model[i].b-= c*v.model[min].b;
- }
- for(var i = 0; i < v.nvar+v.slack.length; i++) {
- var sum = 0;
- for(var k = 0; k < v.neq; k++) {
- sum+= v.model[k]['c']*v.model[k][i];
- }
- v.model[v.neq+1][i] = v.model[v.neq][i]-sum;
- }
- for(var j = 0; j < v.nvar+v.slack.length; j++) {
- var found = -1;
- for(var i = 0; i < v.neq; i++) {
- if (v.model[i][j] == 0) {
- continue;
- }
- if (v.model[i][j] != 1) {
- found = -1;
- break;
- } else {
- found = i;
- }
- }
- if (found >= 0) {
- v.model[v.neq+2][j] = v.model[found].b;
- } else {
- v.model[v.neq+2][j] = 0;
- }
- }
- var y = 0;
- for(var i = 0; i < v.nvar; i++)
- y+= v.max[i]*v.model[v.neq+2][i];
- v.model[v.neq+2].b = 'y = '+y;
- return false;
- }
- function drawModel(table) {
- var tbl = '';
- tbl+= '<thead>';
- tbl+= '<tr><td>c<sub>i</sub></td><td>Sol</td>';
- for(var i = 0; i < v.nvar+v.slack.length; i++)
- tbl+= '<td>x<sub>'+(i+1)+'</sub></td>';
- tbl+= '<td>b<sub>i</sub></td>';
- tbl+= '</thead>';
- tbl+= '<tbody>';
- for(var i in v.model) {
- if (i == v.neq) {
- tbl+= '</tbody>';
- tbl+= '<tfoot>';
- }
- tbl+= '<tr>';
- tbl+= '<td>'+('c' in v.model[i]? v.model[i].c : '')+'</td>';
- if (i < v.neq) {
- tbl+= '<td>x<sub>'+(v.model[i].s+1)+'</sub></td>';
- } else {
- tbl+= '<td>'+('s' in v.model[i]? v.model[i].s : '')+'</td>';
- }
- for(var j = 0; j < v.nvar+v.slack.length; j++)
- tbl+= '<td>'+v.model[i][j]+'</td>';
- tbl+= '<td>'+('b' in v.model[i]? v.model[i].b : '')+'</td>';
- tbl+= '</tr>';
- }
- tbl+= '</tfoot>';
- table.innerHTML = tbl;
- }
- function num(input) {
- if (isNaN(input.value)) {
- alert('Devi inserire numeri, sciocco!');
- input.value = 0;
- return 0;
- }
- return +input.value;
- }
- </script>
- </head>
- <body>
- <form id="prep1" style="display: block;">
- <h2>Metodo del Simplesso</h2>
- Problema di <select name="type">
- <option value="max">Massimo</option>
- <option value="min">Minimo</option>
- </select>
- <table>
- <tbody>
- <tr>
- <td>Variabili:</td><td><input name="nvar" type="range" min="1" max="10" step="1"></td><td id="nvar">3</td>
- </tr>
- <tr>
- <td>Equazioni:</td><td><input name="neq" type="range" min="1" max="10" step="1"></td><td id="neq">3</td>
- </tr>
- </tbody>
- </table>
- <input type="submit" value="Inserisci dati">
- </form>
- <form id="prep2">
- <table id="system"></table>
- <input type="submit" value="Calcola">
- <div id="solution"></div>
- </form>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement