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/