Re: FindMaximum/NMaximize vs. Excel Solver

• To: mathgroup at smc.vnet.net
• Subject: [mg106886] Re: FindMaximum/NMaximize vs. Excel Solver
• From: John <jhurley13 at gmail.com>
• Date: Tue, 26 Jan 2010 06:34:12 -0500 (EST)
• References: <hj98d9\$g8f\$1@smc.vnet.net>

```I received an answer from Daniel Lichtblau at Wolfram, and posed this

Stepping back, what would be the right syntax for NMaximize for this
problem:
w is the list of wagers to optimize, a list of 20 elements;
each wager must be between 0 and 100;
the sum of the wagers is 100
It seems gross to list out individual variables when Mathematica is so
powerful at list processing.
Thanks,
John

--------

His response was as follows, and was just what I was looking for,
since I wanted the "Mathematica" way of doing it:

It can be set up as below. Notice I do not explicitly list variables.

probabilities = {0.2,0.2,0.2,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1,0.1};
len = Length[probabilities];
odds = {7,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,2,2,2,2};
vars = Array[w,len];
tot = 100;
c1 = Map[#>=0&, vars];

ep = (vars(1+odds)-tot);
sp = ep.probabilities;
var = (ep-sp)^2;

obj = sp / Sqrt[Dot[probabilities,var]];

Timing[NMaximize[{obj,Flatten[{c1,Total[vars]==tot}]}, vars]]

That works, but takes around four times longer than FindMaximum. The
speed of NMaximize is not troubling to me, but FindMaximum might be
slow for this. That is, I'm not sure whether the timing is expected or
indicates a speed bump.

Daniel

--------

In a later message, we were looking at timings:

Daniel,
reminds me how much I still need to learn about Mathematica. If
nothing else, I have to take a long look at "a = b" vs. "a:=b".
I was still curious about why it took so long, and found that
simplifying obj helped speed things up by 20% or so:
obj = sp/Sqrt[Dot[probabilities, var]] // Simplify;
Timing[NMaximize[{obj, Flatten[{Total[vars] == tot, c1}]}, vars,
AccuracyGoal -> 6, PrecisionGoal -> 9]]
Just for fun, I tried the different methods available from NMaximize,
and found:
SimulatedAnnealing 19.2039
RandomSearch 1329.74
DifferentialEvolution 18.9437
Default 23.7308
FindMaximum 5.43854
If it is OK with you, I'd like to post your response back to the group
since it helped me so much; I can attribute it to you or to an
anonymous helper. Thanks again.
John
[...]

That's fine with me. Possibly someone will get competitive and maybe
figure out a tweak that makes FindMaximum or NMaximize handle this
faster. For FindMaximum, I doubt it will be method-related because I
believe that function has but one choice (interior point) when given
constraints (unless everything is linear or, at worst, objective is

One possible improvement would be to maximize the square, since (I
think) everything is nonnegative. Could use obj2, given as below.

obj2 = Simplify[Rationalize[obj]^2,
Assumptions -> Map[0 <= # <= 100 &, vars]]

Daniel

One other thing. If you get rid of variables that correspond to zero
probability, the timings become tremendously faster. I do not think
this type of smarts could be automated (in NMaximize or Findmaximum),
unfortunately.

Daniel

----------

I was still curious about why it took so long, and found that
simplifying obj helped speed things up by 20% or so:

obj = sp/Sqrt[Dot[probabilities, var]] // Simplify;
Timing[NMaximize[{obj, Flatten[{Total[vars] == tot, c1}]}, vars,
AccuracyGoal -> 6, PrecisionGoal -> 9]]

Just for fun, I tried the different methods available from NMaximize,
and found:

SimulatedAnnealing	19.2039
RandomSearch		1329.74
DifferentialEvolution	18.9437