アットウィキロゴ

lp1

import java.util.*;

public class lpx{
int n;           // 変数の個数
int m;            // 条件式の数
double[][]  a;  
                
public lpx(int n1, int m1, double[][] a1 ) {
   n = n1;
   m = m1;
   a = new double[m+1][n+m+1];

   for(int i=0; i<m+1;  i++)
     for(int j=0; j<n+m+1;  j++)
           a[i][j] = a1[i][j];
}
        
public void simplex(){
    int p,q;
    double d,k,pivo;
    double min;
    while (true) {
      p=0; q=0;
      d=0; k=0; pivo=0;
      
      min = 10000;
      for(int i=0; i<n;  i++) {
        if ( a[m][i] < min ) {
          min = a[m][i];
          q = i;
        }
      }
      if ( min == 0 ) break; // 最小値>=0 なら終了  

      min = 10000;
      for(int i=0; i<m;  i++) {
        k = a[i][n+m]/a[i][q];
        if ( a[i][q] > 0  &&  k < min ) {
          min = k;
          p = i;
        }
      }
      
      pivo = a[p][q]; // ピボット要素
      //ピボット行の要素をピボット要素で割る
      for(int i=0; i<=n+m;  i++) {
        a[p][i] = a[p][i]/pivo;
      }
      
      // 掃き出し
      for(int i=0; i<=m;  i++) {
        if ( i != p ) {
          d = a[i][q];
          for(int j=0; j<n+m+1;  j++) {
            a[i][j] = a[i][j] - a[p][j]*d;
          }
        }
      }
    }
}

public void prn() {
   for(int i=0; i<=m;  i++){
     for(int j=0; j<=m+n;  j++){
       System.out.printf("%7.2f",a[i][j] );  
     }
       System.out.println("");  
   }
   System.out.println("");
}

public void prnAns() {
   System.out.println("[ 答え ] ");
   for(int i=0; i<n;  i++){
     int mark = -1;
     for(int j=0; j<m;  j++){
       if ( a[j][i] == 1 )  mark = j;
     }
     if ( mark != -1 ) {
       System.out.println(" x" + (i+1) + "=" + a[mark][n+m]);
     }
   }
     System.out.println(" f(x)の最大値 = " + a[m][n+m]);
}
  
        public static void main(String[] args) {
                        //他を試みるときは,ここを書き換える.

   int n1 = 2;
   int m1 = 3;
   double[][] a1={{1, 2, 1, 0, 0, 14},{1, 1, 0, 1, 0, 8},{3, 1, 0, 0, 1, 18},{-2, -3, 0, 0, 0, 0}};

   lpx  lp = new lpx(n1,m1,a1);

   System.out.println("問題");  
   lp.prn();
  
   lp.simplex();
   System.out.println("シンプレックス法により解いた結果");
   lp.prn();
   lp.prnAns();
}
}
最終更新:2011年08月22日 06:34