Re: Optimization with conditional restrictions
- To: mathgroup at smc.vnet.net
 - Subject: [mg44609] Re: Optimization with conditional restrictions
 - From: drbob at bigfoot.com (Bobby R. Treat)
 - Date: Tue, 18 Nov 2003 06:41:38 -0500 (EST)
 - References: <bovoca$mj6$1@smc.vnet.net>
 - Sender: owner-wri-mathgroup at wolfram.com
 
Here's another approach:
bigM = 336; 
NMinimize[Flatten[
   {55*x12 + 53*x22 + 53*x32 + 3000*x11 + 3000*x21 + 3000*x31,
    25*x12 + 25*x22 + 25*x32 == 16000,
    Distribute[{x12, x22, x32} <= 336, List],
    Distribute[{x12, x22, x32, x11, x21, x31} >= 0, List], 
    Distribute[{x11, x21, x31} <= 1, List],
    bigM*x11 >= x12, bigM*x21 >= x22, bigM*x31 >= x32, 
    Element[{x11, x21, x31}, Integers]}],
  {x11, x12, x21, x22, x31, x32}]
{40528., {x11 -> 1, x12 -> 304., 
   x21 -> 1, x22 -> 336., x31 -> 0, 
   x32 -> 0.}}
If the result had not satisfied the procedural definitions of x11,
x12, x31, you'd try again with a larger 'bigM' -- 10^10, for instance.
Here's another convenient way to write the problem:
bigM = 336; 
between[a_, b_][c_] := a <= c <= b
NMinimize[Flatten[
   {55*x12 + 53*x22 + 53*x32 + 3000*x11 + 3000*x21 + 3000*x31,
    25*x12 + 25*x22 + 25*x32 == 16000, 
    between[0, 336] /@ {x12, x22, x32},
    between[0, 1] /@ {x11, x21, x31},
    bigM*x11 >= x12, bigM*x21 >= x22, 
    bigM*x31 >= x32, 
    Element[{x11, x21, x31}, Integers]}], 
  {x11, x12, x21, x22, x31, x32}]
and here's another:
bigM = 336;
between[a_, b_][c_] := a <= c <= b
NMinimize[Flatten[
   {55*x12 + 53*x22 + 53*x32 + 3000*x11 + 3000*x21 + 3000*x31,
    25*x12 + 25*x22 + 25*x32 == 16000,
    between[0, 336] /@ {x12, x22, x32},
    between[0, 1] /@ {x11, x21, x31},
    Thread[bigM*{x11, x21, x31} >= {x12, x22, x32}],
    Element[{x11, x21, x31}, Integers]}],
  {x11, x12, x21, x22, x31, x32}]
Bobby
guillerm at usal.es wrote in message news:<bovoca$mj6$1 at smc.vnet.net>...
> Dear group,
> I wish minimize a function, ej: 
> 55*x12 + 53*x22 + 53*x32 + 3000*x11 + 3000*x21 + 3000*x31
> including conditional restrictions, ej: 
> x11 == If[x12 > 0, 1, 0] && x21 == If[x22 > 0, 1, 0] && 
> x31 == If[x32 > 0, 1, 0]}, 
> And other standars restrictions
> 
> Here is an example:
> 
> NMinimize[{55*x12 + 53*x22 + 53*x32 + 3000*x11 + 3000*x21 + 3000*x31, 
> 25*x12 + 25*x22 + 25*x32 == 16000 && 0 <= x12 <= 336 && 
> 0 <= x22 <= 336 && 0 <= x32 <= 336 && 
> x11 ?¸ Integers && x21 ?¸ Integers && x31 ?¸ Integers && 
> x11 == If[x12 > 0, 1, 0] && x21 == If[x22 > 0, 1, 0] && 
> x31 == If[x32 > 0, 1, 0]}, {x11, x12, x21, x22, x31, x32}]
> 
> Out[]:= {42920.000, {x11 -> 1, x12 -> 2.078*^-7, x21 -> 1, x22 -> 323.29, x31 -
> > 1, x32 -> 316.7}}
> 
> The out is wrong, if x12-> 0, should be x11-> 0. I have tested changing the 
> restricions, writting: x11 == If[x12 > 0.01, 1, 0] && x21 == If[x22 > 0.01, 1, 
> 0] && x31 == If[x32 > 0.01, 1, 0]
> 
> Any help
> 
> Guillermo Sanchez  
> 
> 
> 
> ---------------------------------------------
> This message was sent using Endymion MailMan.
> http://www.endymion.com/products/mailman/