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