package com.imsl.test.example.math; import com.imsl.math.*; /** *

* Solves a linear programming problem in \(5\) variables.

* * This example solves the following linear programming problem: * *

* $${\rm {max}} \,\, f(x) = 10x_1 + 15x_2 + 15x_3 + 13x_4 + 9x_5$$

*

* subject to the following set of constraints, *

* $$ \begin{array}{cc} 100x_1 + 50x_2 + 50x_3 + 40x_4 + 120x_5 &\le& 300\\ * 40x_1 + 50x_2 + 50x_3 + 15x_4 + 30x_5 &\le& 40 \end{array} $$ *

* and bounds: $$0.0 \le x_i \le 1.0, i=1,2,\ldots,5$$

* *

* Note that since DenseLP minimizes, the sign of the * objective function must be changed to compute this solution. The signs of the * dual solution components and the optimal value must also be changed. Because * \(x_2\) and \(x_3\) are not uniquely determined within the bounds, this * problem has a convex family of solutions. DenseLP issues an exception, * MultipleSolutionsException. A particular solution is available * and retrieved in the finally block. *

* * @see Code * @see Output * */ public class DenseLPEx3 { public static void main(String[] args) throws Exception { int[] constraintType = {1, 1}; // Ax <= b double[] lowerVariableBound = {0.0, 0.0, 0.0, 0.0, 0.0}; double[] upperVariableBound = {1.0, 1.0, 1.0, 1.0, 1.0}; double[][] A = { {100.0, 50.0, 50.0, 40.0, 120.0}, {40.0, 50.0, 50.0, 15.0, 30.0} }; double[] b = {300.0, 40.0}; // constraint type Ax <= b double[] c = {10.0, 15.0, 15.0, 13.0, 9.0}; /* Since DenseLP minimizes, change signs of the objective coefficients. */ double[] negC = new double[c.length]; for (int i = 0; i < c.length; i++) { negC[i] = -c[i]; } DenseLP zf = new DenseLP(A, b, negC); zf.setLowerBound(lowerVariableBound); zf.setConstraintType(constraintType); zf.setUpperBound(upperVariableBound); try { zf.solve(); } catch (DenseLP.MultipleSolutionsException e) { /* x_2 and x_3 are not uniquely determined, expect multiple solutions. * Catch the exception, but continue to print result found. */ System.out.println("Multiple solutions giving " + "essentially the same minimum exist."); } finally { double[] dSolution = zf.getDualSolution(); /* Change the sign of the dual solution and optimal value * since DenseLP minimizes. */ for (int i = 0; i < dSolution.length; i++) { dSolution[i] = -dSolution[i]; } double optimalValue = -zf.getOptimalValue(); new PrintMatrix("Solution").print(zf.getPrimalSolution()); new PrintMatrix("Dual Solution").print(dSolution); System.out.println("Optimal Value = " + optimalValue); } } }