package mit16_410_13; import java.util.LinkedList; import java.io.PrintStream; class KpBmax { int kp; double bmax; KpBmax(int kp, double bmax) { this.kp=kp; this.bmax=bmax; } } class Constraint { double value; LinkedList vars; String slack; Constraint (double value, LinkedList vars, String slack) { this.value=value; this.vars=vars; if (slack!=null) this.slack=slack.intern(); } Constraint (double value, LinkedList vars) { this.value=value; this.vars=vars; this.slack=null; } } public class Simplex { boolean solved; String objectivevariable; int varindex; LinkedList variables; LinkedList slackvars; LinkedList m1; LinkedList m2; LinkedList m3; Constraint ofun; int [] izrov, iposv; int N, M, NM1M2; double [][]a; long startTime; long stopTime; public Simplex () { solved=false; varindex=0; ofun=null; startTime=0; stopTime=0; objectivevariable=null; variables=new LinkedList(); slackvars=new LinkedList(); m1=new LinkedList(); m2=new LinkedList(); m3=new LinkedList(); } public void addConstraint (String inequality, double value, LinkedList vars, String slack) { if (slack!=null) { slack=slack.intern(); slackvars.add(slack); } if (inequality.equals("<=")) { //M1 maybeAddVariables(vars); m1.add(new Constraint(value, vars, slack)); } else if (inequality.equals(">=")) { //M2 maybeAddVariables(vars); m2.add(new Constraint(value, vars, slack)); } else if (inequality.equals("=")) { //M3 if (slack!=null) System.out.println("Unnecessary slack variable specified in equality constraint - ignored"); maybeAddVariables(vars); m3.add(new Constraint(value, vars)); } else System.out.println("Bad inequality in constraint."); } public void addConstraint (String inequality, double value, LinkedList vars) { maybeAddVariables(vars); addConstraint(inequality, value, vars, null); } public void addObjectiveFunction (String name, LinkedList vars) { objectivevariable=name; maybeAddVariables(vars); ofun=new Constraint(0.0, vars); } public void describeProblem (PrintStream out) { if (ofun==null) out.println("WARNING: No Objective Function"); out.print("Objective Function: "); if (ofun!=null) { out.print(objectivevariable); out.print(" = "); printCoefVars(out, ofun.vars, false); out.println(""); } out.println("Constraints:"); // Print M1 for (int i=0; i= "); out.println(c.value); } // Print M3 for (int i=0; i0) printPostPadded(out, getVarName(iposv[i-1]), 5); else if (objectivevariable!=null) printPostPadded(out, objectivevariable, 5); else out.print(" "); printDouble(out, a[i][0]); for (int j=1; j<=N; j++) if (izrov[j-1] < NM1M2) printDouble(out, a[i][j]); out.println(""); } } } public void printSolution (PrintStream out) { if (objectivevariable!=null) { printPostPadded(out, objectivevariable, 5); out.print(" = "); printDouble(out, getSolutionValue(objectivevariable)); out.println(""); } for (int i=0; i0) { if (getVarName(iposv[i-1]).equals(varname)) return a[i][0]; } else { if (objectivevariable!=null) { if (objectivevariable.equals(varname)) return a[i][0]; } } } } return 0.0; } return 0; // Maybe we should complain rather than return a silly value? } public static int solve (double [][] a, int nrows, int ncols, int m1, int m2, int m3, int [] izrov, int [] iposv) throws Exception { double EPS=1.0e-14; int i, k, ip, is, kh, nl1; double q1; KpBmax res=new KpBmax(0, 0.0); int m=nrows-2; int n=ncols-1; if (m != (m1+m2+m3)) { System.out.println("Bad input constraint counts in Simplex"); throw new SimplexException("Bad input constraint counts in Simplex"); } int [] l1=new int[n+1], l3=new int [m]; nl1=n; for (k=0; k EPS) break one; } } for (i=m1+1; i<=m1+m2; i++) if (l3[i-m1-1] == 1) for (k=0; k= (n+m1+m2)) { for (k=0; k= 1 && l3[kh-1] != 0) { l3[kh-1]=0; ++a[m+1][res.kp]; for (i=0; i 0.0) { res.bmax=a[mm][ll[k]]; res.kp=ll[k]; } } } } static int simp2 (double [][] a, int m, int n, int kp) { double EPS=1.0e-14; int k, i, ip=0; double qp=0.0, q0=0.0, q, q1; for (i=0; im) return ip; q1 = -a[i+1][0]/a[i+1][kp]; ip=i+1; for (i=ip; i0) val=Math.round(100000.0*(val+0.00001))/100000.0; else if (val<0) val=Math.round(100000.0*(val-0.00001))/100000.0; String rep=Double.toString(val).trim(); if (rep.length()>10) rep=rep.substring(0, 10); int dotpos=rep.indexOf("."); int replen=rep.length(); String prepad= " "; // 5 spaces String nurep=prepad.substring(dotpos).concat(rep); printPostPadded(out, nurep, 10); } void printPostPadded (PrintStream out, String rep, int fieldsize) { String pad=" "; // 20 spaces if (rep.length()>fieldsize) rep=rep.substring(0, fieldsize); else rep=rep.concat(pad.substring(rep.length(), fieldsize)); System.out.print(rep); } void maybeAddVariables (LinkedList vars) { for (int i=0; i0)&&leadingsign) out.print("+"); if (coef==-1) out.print("-"); else if (coef!=1) out.print(coef); out.print(var.name()); } leadingsign=true; } } } // Fin