On 05/23/2013 11:17 PM, Mister Mak wrote:
> Thanks to Thomas and Gilles for their tips. The univariate solution
> proposed works (for the record:
> UnivariateFunction f = new UnivariateFunction() {public double
> value(double x) {return -(x - 5.0) * (x - 5.0) + 2.25; }};
> BrentOptimizer optimizer = new BrentOptimizer(1e-6, 1e-12);
> UnivariatePointValuePair solution = optimizer.optimize(new
> UnivariateObjectiveFunction(f), new MaxEval(100), GoalType.MAXIMIZE, new
> SearchInterval(-10, 10));
> System.out.println("Min is: " + solution.getValue() + "\tobtained
> at: " + solution.getPoint());
> ).
>
> I am now trying to maximize a function of two variables, and can't get the
> following code running:
>
> MultivariateFunction g =
> new MultivariateFunction() {
> public double value(double[] x) {
> return -(x[0] - 5.0) * (x[1] - 5.0) + 2.25;
> }
> };
> SimplexOptimizer optimizerMult = new SimplexOptimizer(1e-6, 1e-12);
> PointValuePair solutionMult = optimizerMult.optimize(new
> ObjectiveFunction(g), GoalType.MAXIMIZE, new MultiDirectionalSimplex(100));
You need to set an InitialGuess, like this:
MultivariateFunction g = new MultivariateFunction() {
public double value(double[] x) {
return -(x[0] - 5.0) * (x[1] - 5.0) + 2.25;
}
};
SimplexOptimizer optimizerMult = new SimplexOptimizer(1e-3, 1e-6);
PointValuePair solutionMult = optimizerMult.optimize(
new MaxEval(200),
new ObjectiveFunction(g),
GoalType.MAXIMIZE,
new InitialGuess(new double[] {0, 0} ),
new MultiDirectionalSimplex(2));
System.out.println(solutionMult.getValue());
System.out.println(Arrays.toString(solutionMult.getKey()));
But this will still not work, as a possible maximum is x[0] = -Infinity
and x[1] >= 0
I guess in your case you will have to use an optimizer which supports
bounds to get the maximum for the given function, e.g. the SimplexSolver
in the linear package.
Thomas
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]