Advertisement
NokitaKaze

Simplex method

Apr 1st, 2012
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.86 KB | None | 0 0
  1. <?php
  2.  function draw_matrix($x, $hbase, $r, $max_i, $max_j){
  3.   echo '<table><tr><td></td><td>B</td>';
  4.   for ($j=1;$j<=$max_j;$j++){echo '<td><span style="'.($hbase[$j] ? 'color: green;' : '').($r[$j] ? 'text-decoration: underline;' : '').'">x'.$j.'</span></td>';}
  5.   echo '<td>|</td></tr>';
  6.   $a=array();for ($i=1;$i<=$max_i;$i++){$a[]=array($i,'|');}
  7.   $a[]=array(0,'L');
  8.   $u2=false;for ($j=0;$j<=$max_j;$j++){if ((int)$x[-1][$j]!==0){$u2=true;$a[]=array(-1,'W');break;} }
  9.  
  10.   foreach ($a as $ar){
  11.    echo '<tr><td>'.$ar[1].'</td><td>'.(round($x[$ar[0]][0]*100)/100).'</td>';
  12.    for ($j=1;$j<=$max_j;$j++){
  13.     echo '<td style="'.(($hbase[$j]>0 and (int)$x[$ar[0]][$j]!==0) ? 'color: red; ' : '').'"><!-- $x['.$i.', '.$j.']= -->'.(round($x[$ar[0]][$j]*100)/100).'</td>';
  14.    }
  15.    echo '<td>|</td></tr>';
  16.   }
  17.   echo '</table>';
  18.  }
  19.  
  20.  function math_simplex($x, $e, $max_i, $max_j){
  21.   global $debug;
  22.   $hbase=array(null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);// Базовая ли переменная
  23.   $r    =array(null, false, false, false, false, false, false, false, false, false);// Искуственная переменная
  24.   //Заполняем матрицу и список базовых элементов
  25.   $x[-1]=array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  26.   for ($i=1;$i<=$max_i;$i++){
  27.    if ($e[$i]!==(int)0){
  28.     $max_j++;$x[$i][$max_j]=-$e[$i];
  29.     if ($x[$i][$max_j]==1){$hbase[$max_j]=$i;continue;}
  30.    }
  31.    
  32.    //Ищем базовые переменные
  33.    $u=false;
  34.    for ($j=$max_j;$j>=1;$j--){
  35.     if ((int)$x[$i][$j]!==1){continue;}
  36.     $u1=false;for ($i1=1;$i1<=$max_i;$i1++){if ((int)$x[$i1][$j]!==0 and $i1!==$i){$u1=true;break;}}
  37.     if (!$u1){$u=true;break;}
  38.    }
  39.    if (!$u){
  40.     //$max_j++;$x[$i][$max_j]=1;$hbase[$max_j]=$i;$r[$max_j]=true;
  41. //    echo "Для строки <b>{$i}</b> не найдена базовая переменная {$max_j} _ {$hbase[$max_j]}<br />";
  42.     for ($j2=0;$j2<=$max_j;$j2++){$x[-1][$j2]-=$x[$i][$j2];}
  43.    }else{
  44.     $hbase[$j]=$i;
  45. //    echo "Для строки <b>{$i}</b> НАЙДЕНА базовая переменная {$j} _ {$hbase[$j]}<br />";
  46.    }
  47.   }
  48.   if ($e[0]==0){for ($j=1;$j<=$max_j;$j++){$x[0][$j]=-$x[0][$j];}}
  49.  
  50. //  echo $max_i.'; '.$max_j.'<pre>';print_r($hbase);echo '</pre>';
  51.  
  52.   $u=false;
  53.   for ($j=1;$j<=$max_j;$j++){
  54.    if ($hbase[$j]>0 and (int)$x[0][$j]!==0){
  55.     if ($debug){
  56.      echo "Базовая переменная в уравнении x{$j}; ".(!$u ? 'Оригинальный вариант: ' : '');
  57.      if (!$u){$u=true;draw_matrix($x, $hbase, $r, $max_i, $max_j);}
  58.     }
  59.    
  60.     for ($j1=0;$j1<=$max_j;$j1++){
  61.      if ($j1==$j){continue;}
  62.      $x[0][$j1]-=$x[$hbase[$j]][$j1]*$x[0][$j];
  63.     }
  64.     $x[0][$j]=0;
  65.    }
  66.   }
  67.  
  68.  
  69.   //$u1=true;
  70.   //ИТЕРАЦИИ
  71.   while (true){
  72.    if ($debug){echo '<hr/>Итерация';draw_matrix($x, $hbase, $r, $max_i, $max_j);}
  73.    
  74.    //Выбираем уравнение между W и L
  75.    $wneed=false;
  76.    for ($j=0;$j<=$max_j;$j++){if ((int)$x[-1][$j]!==0){$wneed=true;break;}}
  77.    if ($wneed and $debug){Echo 'Нам до сих пор нужна W<br />';};
  78.    if ($wneed){
  79.     //Решаем W
  80.     $u=false;for ($j=1;$j<=$max_j;$j++){if ($x[-1][$j]<0){$u=true;break;}}
  81. //  echo '_'.$u.' and '.($x[-1][0]<0).'; ';
  82.     if (!$u and (int)$x[-1][0]==0){$x[-1]=array(0,0,0,0,0,0,0,0,0,0,0);continue;}
  83.     if (!$u and $x[-1][0]<0){return null;}
  84.     $w=-1;
  85.    }else{
  86.     //Решаем L
  87.     $u=false;for ($i=1;$i<=$max_j;$i++){if ($x[0][$i]<0){$u=true;break;}}
  88.     if (!$u){return $x[0][0]*($e[0]==1 ? -1 : 1);}
  89.     $w=0;
  90.    }
  91.    
  92.    if (true){
  93.     //Находим ведущий столбец
  94.     $nv=0;for ($j=1;$j<=$max_j;$j++){
  95.      if ($x[$w][$j]<$x[$w][$nv] or $nv==0){$nv=$j;}
  96.     }
  97.     if ($debug){echo 'nv='.$nv.' ['.abs($x[$w][$nv]).']; <br>';}
  98.     //Находим ведущую строку
  99.     $nh=0; for ($i=1;$i<=$max_i;$i++){
  100.      if ($x[$i][$nv]<=0){continue;}
  101. //   echo $x[$i][0].'/'.$x[$i][$nv].' = '.($x[$i][0]/$x[$i][$nv]).'; ';
  102.      if ($nh==0){$d=$x[$i][0]/$x[$i][$nv];$nh=$i;continue;}
  103.      $d1=$x[$i][0]/$x[$i][$nv];
  104.      if ($d1<$d){$nh=$i;$d=$d1;}
  105.     }
  106.     if ($nh==0){return 'inf';}
  107.     if ($debug){echo 'nh='.$nh.' ['.$d.'];<br>РЭ = '.$x[$nh][$nv].'; ';}
  108.    
  109.    
  110.     //пересчитываем матрицу
  111.     $x1=$x;$x1[$nh][0]/=$x[$nh][$nv];
  112.     for ($j=1;$j<=$max_j;$j++){$x1[$nh][$j]/=$x[$nh][$nv];}
  113.     for ($i=$w;$i<=$max_i;$i++){
  114.      if ($i==$nh){continue;}
  115.  
  116.      $x1[$i][0]-=$x[$nh][0]*$x[$i][$nv]/$x[$nh][$nv];
  117.      for ($j=1;$j<=$max_j;$j++){
  118.       $x1[$i][$j]-=$x[$nh][$j]*$x[$i][$nv]/$x[$nh][$nv];
  119.      }
  120.     }
  121.     $x=$x1;unset($x1);
  122.     continue;
  123.    }
  124.    exit;
  125.      
  126.    //if ($u1){$u1=false;continue;}
  127.    //echo '<strong>ДЕБАЖНЫЙ ВЫХОД!</strong>'; break;
  128.   }
  129.  }
  130.  
  131.  
  132. ?><!doctype html><html><head>
  133.  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  134.  <title>Симплекс</title>
  135.  <link rel="stylesheet" href="/ascet.css" type="text/css" media="screen">
  136. </head><body><?php
  137.  
  138.  echo '<form method="post"><table class="sad">';
  139.  echo '<tr >';for ($j=1;$j<9;$j++){
  140.   echo '<td><input name="x0_'.$j.'" value="'.(strlen($_POST['x0_'.$j])>0 ? $_POST['x0_'.$j] : '0').'">*x'.$j.'+</td>';
  141.  }
  142.  echo '<td >→<select name="e0"><option value="1" '.((int)$_POST['e0']==1 ? 'selected' : '').'>min</option><option value="0" '.((int)$_POST['e0']==0 ? 'selected' : '').'>max</option></select></td></tr>';
  143.  
  144.  for ($i=1;$i<10;$i++){
  145.   echo '<tr>';
  146.   for ($j=1;$j<9;$j++){
  147.    echo '<td><input name="x'.$i.'_'.$j.'" value="'.(strlen($_POST['x'.$i.'_'.$j])>0 ? $_POST['x'.$i.'_'.$j] : '0').'">*x'.($j).'+</td>';
  148.   }
  149.   echo '<td><select name="e'.$i.'"><option value="-1" '.((int)$_POST['e'.$i]==-1 ? 'selected' : '').'>&lt;=</option><option value="0" '.((int)$_POST['e'.$i]==0 ? 'selected' : '').'>=</option><option value="1" '.((int)$_POST['e'.$i]==1 ? 'selected' : '').'>=&gt;</option></select> <input name="y'.$i.'" value="'.(strlen($_POST['y'.$i])>0 ? $_POST['y'.$i] : '0').'"></td>';
  150.   echo '</tr>';
  151.  }
  152.  echo '</TABLE><input class="nice mrgn" type="submit"><input type="hidden" name="action" value="math"></form>';
  153.  
  154.  if ($_POST['action']!=='math'){echo '</body></html>';return;}
  155.  
  156.  $x=array();$e=array();$max_i=0;$max_j=0;
  157.  for ($i=0;$i<10;$i++){
  158.   $x[$i]=array(0);
  159.   for ($j=1;$j<9;$j++){
  160.    preg_match('|(\\-?[0-9.]+)|',$_POST['x'.$i.'_'.$j], $a);
  161.    $x[$i][$j]=(float)$a[1];
  162.    
  163.    if ($x[$i][$j]!==(float)0){$max_i=$i;$max_j=max($j, $max_j);}
  164.   }
  165.  
  166.   $e[$i]   =(int)$_POST['e'.$i];
  167.   $x[$i][0]=(float)$_POST['y'.$i];
  168.  }
  169.  
  170.  //echo $max_i.'; '.$max_j.'<pre>';echo '</pre>';
  171.  require('./simplex.php');
  172.  
  173.  
  174.  //Вычисляем
  175.  $debug=true;
  176.  echo '<h2>!'.math_simplex($x, $e, $max_i, $max_j).'</h2>';
  177.  
  178.  return;
  179.  $dx=array(
  180.   array(20,0,-1,-1,0,0,0),
  181.   array(20,1,0,1,0,0,0),
  182.   array( 5,0,1,0,-1,1,0),
  183.   array(50,0,1,0,0,0,1),
  184.  );
  185.  echo '<h2>'.math_simplex($dx, array(0,0,0,0,0,0,0,0,0,0,0), 3, 6).'</h2>';
  186.  
  187. ?></body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement