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
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();
|
|
}
|
|
}
|
|
}
|