You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

287 lines
9.5 KiB

/*
This software is a Java wrapper for the lp_solve optimization library.
Copyright (C) 2004 Juergen Ebert (juergen.ebert@web.de)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import lpsolve.*;
/**
* Java version of the C Demo program that comes with the lp_solve software.
*
* @author Juergen Ebert
*/
public class Demo {
public Demo() {
}
public void execute() throws LpSolveException {
VersionInfo info = LpSolve.lpSolveVersion();
System.out.println("This demo (Java version) will show most of the features of lp_solve "
+ info.getMajorversion()
+ "." + info.getMinorversion()
+ "." + info.getRelease()
+ "." + info.getBuild());
pressRet();
System.out.println("We start by creating a new problem with 4 variables "
+ "and 0 constraints");
System.out.println("We use: LpSolve problem = LpSolve.makeLp(0, 4);");
LpSolve problem = LpSolve.makeLp(0, 4);
pressRet();
/* Let's first demonstrate the logfunc callback feature */
LogListener logfunc = new LogListener() {
public void logfunc(LpSolve problem, Object handle, String buf) {
System.out.println(buf);
}
};
problem.putLogfunc(logfunc, null);
problem.solve(); /* just to see that a message is send via the logfunc routine ... */
problem.putLogfunc(null, null); /* ok, that is enough, no more callback */
/* Set an abort function. This is optional */
AbortListener abortfunc = new AbortListener() {
public boolean abortfunc(LpSolve problem, Object handle) {
/* If set to true, then solve is aborted and returncode will indicate this. */
return false;
}
};
problem.putAbortfunc(abortfunc, null);
/* Set a message function. Again optional */
MsgListener msgfunc = new MsgListener() {
public void msgfunc(LpSolve problem, Object handle, int msg) {
// System.out.println("Message = " + msg);
}
};
problem.putMsgfunc(msgfunc, null,
LpSolve.MSG_PRESOLVE | LpSolve.MSG_LPFEASIBLE | LpSolve.MSG_LPOPTIMAL
| LpSolve.MSG_MILPEQUAL | LpSolve.MSG_MILPFEASIBLE | LpSolve.MSG_MILPBETTER);
System.out.println("We can show the current problem with problem.printLp()");
problem.printLp();
pressRet();
System.out.println("Now we add some constraints:");
System.out.println("problem.strAddConstraint(\"3 2 2 1\", LpSolve.LE, 4);");
problem.strAddConstraint("3 2 2 1", LpSolve.LE, 4);
problem.printLp();
pressRet();
System.out.println("problem.strAddConstraint(\"0 4 3 1\", LpSolve.GE, 3);");
problem.strAddConstraint("0 4 3 1", LpSolve.GE, 3);
problem.printLp();
pressRet();
System.out.println("Set the objective function:");
System.out.println("problem.strSetObjFn(\"2 3 -2 3\");");
problem.strSetObjFn("2 3 -2 3");
problem.printLp();
pressRet();
System.out.println("Now solve the problem with System.out.println(problem.solve());");
System.out.println(problem.solve());
pressRet();
System.out.println("The value is 0, this means we found an optimal solution.");
System.out.println("We can display the solution with problem.printObjective(), "
+ "problem.printSolution(1), and problem.printConstraints(1)");
problem.printObjective();
problem.printSolution(1);
problem.printConstraints(1);
pressRet();
System.out.println("The dual variables of the solution are printed with "
+ "problem.printDuals()");
problem.printDuals();
pressRet();
System.out.println("We can change a single element in the matix with "
+ "problem.setMat(2, 1, 0.5)");
problem.setMat(2, 1, 0.5);
problem.printLp();
pressRet();
System.out.println("If we want to maximize the objective function use "
+ "problem.setMaxim()");
problem.setMaxim();
problem.printLp();
pressRet();
System.out.println("After solving this gives us:");
problem.solve();
problem.printObjective();
problem.printSolution(1);
problem.printConstraints(1);
problem.printDuals();
pressRet();
System.out.println("Change the value of a rhs element with problem.setRh(1, 7.45)");
problem.setRh(1, 7.45);
problem.printLp();
problem.solve();
problem.printObjective();
problem.printSolution(1);
problem.printConstraints(1);
pressRet();
System.out.println("We change " + problem.getColName(4)
+ " to the integer type with problem.setInt(4, true)");
problem.setInt(4, true);
problem.printLp();
System.out.println("We set branch & bound debugging on with problem.setDebug(true)");
problem.setDebug(true);
System.out.println("and solve...");
pressRet();
problem.solve();
problem.printObjective();
problem.printSolution(1);
problem.printConstraints(1);
pressRet();
System.out.println("We can set bounds on the variables with "
+ "problem.setLowbo(2, 2) & problem.setUpbo(4, 5.3)");
problem.setLowbo(2, 2);
problem.setUpbo(4, 5.3);
problem.printLp();
pressRet();
problem.solve();
problem.printObjective();
problem.printSolution(1);
problem.printConstraints(1);
pressRet();
System.out.println("Now remove a constraint with problem.delConstraint(1)");
problem.delConstraint(1);
problem.printLp();
pressRet();
System.out.println("Add an equality constraint:\n"
+ "problem.strAddConstraint(\"1 2 1 4\", LpSolve.EQ, 8)");
problem.strAddConstraint("1 2 1 4", LpSolve.EQ, 8);
problem.printLp();
pressRet();
System.out.println("A column can be added with problem.strAddColumn(\"3 2 2\")");
problem.strAddColumn("3 2 2");
problem.printLp();
pressRet();
System.out.println("A column can be removed with problem.delColumn(3)");
problem.delColumn(3);
problem.printLp();
pressRet();
System.out.println("We can use automatic scaling with problem.setScaling(LpSolve.SCALE_MEAN)");
problem.setScaling(LpSolve.SCALE_MEAN);
problem.printLp();
pressRet();
System.out.println("The function matElm returns a single matrix element.");
System.out.println("problem.getMat(2, 3) returns " + problem.getMat(2, 3));
System.out.println("problem.getMat(1, 1) returns " + problem.getMat(1, 1));
System.out.println("Notice that getMat returns the value of the "
+ "original unscaled problem");
pressRet();
System.out.println("If there are any integer type variables, then only "
+ " the rows are scaled.");
System.out.println("problem.setScaling(LpSolve.SCALE_MEAN);");
problem.setScaling(LpSolve.SCALE_MEAN);
System.out.println("problem.setInt(3, false);");
problem.setInt(3, false);
problem.printLp();
pressRet();
System.out.println("printObjective, printSolution gives the solution to the "
+ "original problem");
problem.solve();
problem.printObjective();
problem.printSolution(1);
problem.printConstraints(1);
pressRet();
System.out.println("Scaling is turned off with problem.unscale()");
problem.unscale();
problem.printLp();
pressRet();
System.out.println("Now turn B&B debugging off and simplex tracing on with");
System.out.println("problem.setDebug(false), problem.setTrace(true) and solve.");
problem.setDebug(false);
problem.setTrace(true);
pressRet();
problem.solve();
System.out.println("Where possible, lp_solve will start at the last found basis.");
System.out.println("We can reset the problem to the initial basis with");
System.out.println("problem.resetBasis(). Now solve it again ...");
pressRet();
problem.resetBasis();
problem.solve();
System.out.println("It is possible to give variables and constraints names.");
System.out.println("problem.setRowName(1, \"speed\") & problem.setColName(2, \"money\")");
problem.setRowName(1, "speed");
problem.setColName(2, "money");
problem.printLp();
System.out.println("As you can see, all column and rows are assigned default names");
System.out.println("If a column or constraint is deleted, the names shift place also:");
pressRet();
System.out.println("problem.delColumn(1)");
problem.delColumn(1);
problem.printLp();
pressRet();
// delete the problem
problem.deleteLp();
}
private void pressRet() {
System.out.print("\n[Press return to continue or type 'q' to quit] ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String line = br.readLine();
if (line == null || "q".equals(line.trim())) {
System.out.println("Demo terminated.");
System.exit(0);
}
}
catch (IOException e) {
System.exit(0);
}
System.out.println("");
}
public static void main(String[] args) {
try {
new Demo().execute();
}
catch (LpSolveException e) {
e.printStackTrace();
}
}
}