Advertisement
gufoe

Metodo del Simplesso

Mar 19th, 2014
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
HTML 5 9.42 KB | None | 0 0
  1.  
  2. <!DOCTYPE html>
  3. <html>
  4.     <head>
  5.         <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  6.         <meta name="author" name="Giacomo Rizzi">
  7.            
  8.         <style type="text/css">
  9.            
  10.             body {
  11.                 font: 120% 'monospace';
  12.             }
  13.            
  14.             input {
  15.                 font: inherit;
  16.             }
  17.            
  18.             form {
  19.                 display: none;
  20.             }
  21.            
  22.             #system input {
  23.                 width: 30px;
  24.                 text-align: right;
  25.                 border: none;
  26.                 background: #ddd;
  27.             }
  28.             table {
  29.                 margin-top: 50px;
  30.                 border-collapse: collapse;
  31.             }
  32.             tbody {
  33.             }
  34.             table td {
  35.                 border: 1px solid #000;
  36.                 text-align: right;
  37.             }
  38.         </style>
  39.        
  40.         <script>
  41.         if (!Array.prototype.last){
  42.             Array.prototype.last = function(){
  43.                 return this[this.length - 1];
  44.             };
  45.         }
  46.         if (!Array.prototype.max){
  47.             Array.prototype.max = function(){
  48.                 var max = 0;
  49.                 for(var i in this)
  50.                     if (this[i] > this[max]) {
  51.                         max = i;
  52.                     }
  53.                 return max;
  54.             };
  55.         }
  56.        
  57.         v = {
  58.             'nvar' : 0,
  59.             'neq' : 0,
  60.             'max' : [],
  61.             'sys' : [],
  62.             'slack' : [],
  63.             'model' : []
  64.         };
  65.        
  66.         window.onload = function() {
  67.             var in_nvar = document.getElementsByName('nvar')[0],
  68.                 in_neq  = document.getElementsByName('neq')[0],
  69.                 in_type = document.getElementsByName('type')[0],
  70.                 nvar = document.getElementById('nvar'),
  71.                 neq  = document.getElementById('neq'),
  72.                 prep1 = document.getElementById('prep1'),
  73.                 prep2 = document.getElementById('prep2');
  74.            
  75.             in_nvar.onchange = function() {
  76.                 nvar.innerHTML = v.nvar = parseInt(in_nvar.value);
  77.             }
  78.             in_neq.onchange = function() {
  79.                 neq.innerHTML = v.neq = parseInt(in_neq.value);
  80.             }
  81.             in_nvar.onchange();
  82.             in_neq.onchange();
  83.            
  84.             prep1.style.display = 'block';
  85.            
  86.             prep1.onsubmit = function() {
  87.                
  88.                 if (in_type.value == 'max') {
  89.                     ;
  90.                 } else if (in_type.value == 'min') {
  91.                     ;
  92.                 } else {
  93.                     alert('You suck');
  94.                     return true;
  95.                 }
  96.                
  97.                 var tbl = '';
  98.                
  99.                 tbl+= '<tr>'
  100.                 tbl+= '<td>'+in_type.value+': </td>';
  101.                 for(var i = 0; i < v.nvar; i++) {
  102.                     v.max[i] = parseInt(Math.random()*10);
  103.                     v.max[i] = 0;
  104.                     tbl+= '<td>';
  105.                     tbl+= '<input type="text" value="'+v.max[i]+'" onchange="v.max['+i+']=num(this)">x<sub>'+(i+1)+'</sub> ';
  106.                     tbl+= '</td>';
  107.                    
  108.                 }
  109.                 tbl+= '</tr>';
  110.                
  111.                 for(var i = 0; i < v.neq; i++) {
  112.                     v.sys[i] = [];
  113.                     v.slack[i] = 0;
  114.                     tbl+= '<tr>';
  115.                     tbl+= '<td>'+(i+1)+')</td>';
  116.                     for(var j = 0; j < v.nvar; j++) {
  117.                         v.sys[i][j] = parseInt(Math.random()*10);
  118.                         v.sys[i][j] = 0;
  119.                         tbl+= '<td>';
  120.                         tbl+= '<input type="text" value="'+v.sys[i][j]+'" onchange="v.sys['+i+']['+j+']=num(this)">x<sub>'+(j+1)+'</sub> ';
  121.                         tbl+= '</td>';
  122.                     }
  123.                    
  124.                     v.sys[i][j] = parseInt(Math.random()*10)*10;
  125.                     v.sys[i][j] = 0;
  126.                     tbl+= '<td>';
  127.                     tbl+= '<= <input type="text" value="'+v.sys[i][j]+'" onchange="v.sys['+i+']['+j+']=num(this)">';
  128.                     tbl+= '</td>';
  129.                    
  130.                     tbl+= '</tr>';
  131.                 }
  132.                
  133.                 document.getElementById('system').innerHTML = tbl;
  134.                
  135.                 prep1.style.display = 'none';
  136.                 prep2.style.display = 'block';
  137.                
  138.                 return false;
  139.             }
  140.            
  141.             prep2.onsubmit = function() {
  142.                
  143.                 // TODO: remove the test
  144.                 /*
  145.                 v.max = [300, 200, 350];
  146.                 v.sys = [
  147.                     [1,1,1,40],
  148.                     [4,2,3,120],
  149.                     [0,0,1,20]
  150.                 ]
  151.                 */
  152.                
  153.                
  154.                 v.model = {};
  155.                
  156.                 // The system part
  157.                 for(var i = 0; i < v.neq; i++) {
  158.                     v.model[i] = {
  159.                         'c' : 0,
  160.                         's' : v.nvar+i,
  161.                         'b' : parseInt(v.sys[i].last())
  162.                     };
  163.                     for(var j = 0; j < v.nvar; j++) {
  164.                         v.model[i][j] = v.sys[i][j];
  165.                     }
  166.                     for(var j = 0; j < v.slack.length; j++) {
  167.                         v.model[i][v.nvar+j] = i==j?1:0;
  168.                     }
  169.                 }
  170.                
  171.                 // The target function line
  172.                 v.model[v.neq] = {
  173.                     's' : 'c<sub>r</sub>'
  174.                 };
  175.                
  176.                 for(var i = 0; i < v.nvar; i++) {
  177.                     v.model[v.neq][i] = (in_type.value=='min'?-1:1)*v.max[i];
  178.                 }
  179.                 for(var i = 0; i < v.slack.length; i++) {
  180.                     v.model[v.neq][v.nvar+i] = 0;
  181.                 }
  182.                
  183.                 // The delta line
  184.                 v.model[v.neq+1] = {
  185.                     's' : '&Delta;<sub>r</sub>'
  186.                 };
  187.                
  188.                 for(var i = 0; i < v.nvar+v.slack.length; i++) {
  189.                     var sum = 0;
  190.                    
  191.                     for(var k = 0; k < v.neq; k++) {
  192.                         sum+= v.model[k]['c']*v.model[k][i];
  193.                     }
  194.                    
  195.                     v.model[v.neq+1][i] = v.model[v.neq][i]-sum;
  196.                 }
  197.                
  198.                
  199.                 // The solution line
  200.                 v.model[v.neq+2] = {
  201.                     's': 'sol'
  202.                 };
  203.                
  204.                 for(var j = 0; j < v.nvar+v.slack.length; j++) {
  205.                     var found = -1;
  206.                     for(var i = 0; i < v.neq; i++) {
  207.                         if (v.model[i][j] == 0) {
  208.                             continue;
  209.                         }
  210.                        
  211.                         if (found >= 0) {
  212.                             found = -1;
  213.                             break;
  214.                         }
  215.                        
  216.                         if (v.model[i][j] == 1) {
  217.                             found = i;
  218.                         }
  219.                     }
  220.                    
  221.                     if (found >= 0) {
  222.                         v.model[v.neq+2][j] = v.model[found].b;
  223.                     } else {
  224.                         v.model[v.neq+2][j] = 0;
  225.                     }
  226.                 }
  227.                
  228.                 var y = 0;
  229.                 for(var i = 0; i < v.nvar; i++)
  230.                     y+= v.max[i]*v.model[v.neq+2][i];
  231.                 v.model[v.neq+2].b = 'y = '+y;
  232.                
  233.                 document.getElementById('solution').innerHTML = '';
  234.                 setTimeout(function() {
  235.                     var i = 0;
  236.                     do {
  237.                         var m = document.createElement('table');
  238.                         drawModel(m);
  239.                         document.getElementById('solution').appendChild(m);
  240.                         i++;
  241.                     } while(!newModel() && i < 100);
  242.                 });
  243.                 return false;
  244.             }
  245.         }
  246.        
  247.        
  248.         function newModel() {
  249.            
  250.             // Check if the solution is complete
  251.             var complete = true;
  252.             for(var j = 1; j < v.nvar+v.slack.length; j++) {
  253.                 if (v.model[v.neq+1][j] > 0) {
  254.                     complete = false;
  255.                     break;
  256.                 }
  257.             }
  258.             if (complete)
  259.                 return true;
  260.            
  261.             // Search the incoming variable
  262.             var max = 0;
  263.             for(var j = 1; j < v.nvar+v.slack.length; j++) {
  264.                 if (v.model[v.neq+1][j] > v.model[v.neq+1][max])
  265.                     max = j;
  266.             }
  267.            
  268.             var valid = false;
  269.             for(var i = 0; i < v.neq; i++) {
  270.                 if (v.model[i][max] > 0) {
  271.                     valid = true;
  272.                     break;
  273.                 }
  274.             }
  275.             // TODO: adjust this
  276.             if (!valid) {
  277.                 alert('Non valida D:');
  278.                 return true;
  279.             }
  280.            
  281.             // Search the outgoing variable
  282.             var min = 0;
  283.             for(var i = 1; i < v.neq; i++) {
  284.                 if (v.model[i].b/v.model[i][max] < v.model[min].b/v.model[min][max])
  285.                     min = i;
  286.             }
  287.            
  288.             // Replace the outgoing with the incoming variable
  289.             v.model[min].s = max;
  290.             v.model[min].c = v.model[v.neq][max];
  291.             var pivot = v.model[min][max];
  292.            
  293.             // Divide the pivot line
  294.             for (var j = 0; j < v.nvar+v.slack.length; j++) {
  295.                 v.model[min][j]/= pivot;
  296.             }
  297.             v.model[min].b/= pivot;
  298.            
  299.             // Adjust all the other cells
  300.             for(var i = 0; i < v.neq; i++) {
  301.                 if (i == min)
  302.                     continue;
  303.                 var c = v.model[i][max];
  304.                 for (var j = 0; j < v.nvar+v.slack.length; j++)
  305.                     v.model[i][j]-= c*v.model[min][j];
  306.                
  307.                 v.model[i].b-= c*v.model[min].b;
  308.             }
  309.            
  310.             for(var i = 0; i < v.nvar+v.slack.length; i++) {
  311.                 var sum = 0;
  312.                
  313.                 for(var k = 0; k < v.neq; k++) {
  314.                     sum+= v.model[k]['c']*v.model[k][i];
  315.                 }
  316.                
  317.                 v.model[v.neq+1][i] = v.model[v.neq][i]-sum;
  318.             }
  319.        
  320.             for(var j = 0; j < v.nvar+v.slack.length; j++) {
  321.                 var found = -1;
  322.                 for(var i = 0; i < v.neq; i++) {
  323.                     if (v.model[i][j] == 0) {
  324.                         continue;
  325.                     }
  326.                    
  327.                     if (v.model[i][j] != 1) {
  328.                         found = -1;
  329.                         break;
  330.                     } else {
  331.                         found = i;
  332.                     }
  333.                 }
  334.                
  335.                 if (found >= 0) {
  336.                     v.model[v.neq+2][j] = v.model[found].b;
  337.                 } else {
  338.                     v.model[v.neq+2][j] = 0;
  339.                 }
  340.             }
  341.            
  342.             var y = 0;
  343.             for(var i = 0; i < v.nvar; i++)
  344.                 y+= v.max[i]*v.model[v.neq+2][i];
  345.             v.model[v.neq+2].b = 'y = '+y;
  346.            
  347.             return false;
  348.            
  349.         }
  350.        
  351.         function drawModel(table) {
  352.             var tbl = '';
  353.             tbl+= '<thead>';
  354.             tbl+= '<tr><td>c<sub>i</sub></td><td>Sol</td>';
  355.             for(var i = 0; i < v.nvar+v.slack.length; i++)
  356.                 tbl+= '<td>x<sub>'+(i+1)+'</sub></td>';
  357.             tbl+= '<td>b<sub>i</sub></td>';
  358.             tbl+= '</thead>';
  359.             tbl+= '<tbody>';
  360.            
  361.             for(var i in v.model) {
  362.                
  363.                 if (i == v.neq) {
  364.                     tbl+= '</tbody>';
  365.                     tbl+= '<tfoot>';
  366.                 }
  367.                
  368.                 tbl+= '<tr>';
  369.                 tbl+= '<td>'+('c' in v.model[i]? v.model[i].c : '')+'</td>';
  370.                 if (i < v.neq) {
  371.                     tbl+= '<td>x<sub>'+(v.model[i].s+1)+'</sub></td>';
  372.                 } else {
  373.                     tbl+= '<td>'+('s' in v.model[i]? v.model[i].s : '')+'</td>';
  374.                 }
  375.                 for(var j = 0; j < v.nvar+v.slack.length; j++)
  376.                     tbl+= '<td>'+v.model[i][j]+'</td>';
  377.                 tbl+= '<td>'+('b' in v.model[i]? v.model[i].b : '')+'</td>';
  378.                 tbl+= '</tr>';
  379.             }
  380.             tbl+= '</tfoot>';
  381.             table.innerHTML = tbl;
  382.         }
  383.        
  384.         function num(input) {
  385.             if (isNaN(input.value)) {
  386.                 alert('Devi inserire numeri, sciocco!');
  387.                 input.value = 0;
  388.                 return 0;
  389.             }
  390.             return +input.value;
  391.         }
  392.         </script>
  393.     </head>
  394.     <body>
  395.         <form id="prep1" style="display: block;">
  396.             <h2>Metodo del Simplesso</h2>
  397.             Problema di <select name="type">
  398.                 <option value="max">Massimo</option>
  399.                 <option value="min">Minimo</option>
  400.             </select>
  401.             <table>
  402.                 <tbody>
  403.                     <tr>
  404.                         <td>Variabili:</td><td><input name="nvar" type="range" min="1" max="10" step="1"></td><td id="nvar">3</td>
  405.                     </tr>
  406.                     <tr>
  407.                         <td>Equazioni:</td><td><input name="neq" type="range" min="1" max="10" step="1"></td><td id="neq">3</td>
  408.                     </tr>
  409.                 </tbody>
  410.             </table>
  411.             <input type="submit" value="Inserisci dati">
  412.         </form>
  413.        
  414.         <form id="prep2">
  415.             <table id="system"></table>
  416.             <input type="submit" value="Calcola">
  417.             <div id="solution"></div>
  418.         </form>
  419.     </body>
  420. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement