Re: [eclipse-clp-users] Q: Linear Programming with Disjunction constraints

From: Kim Lai <kim73327_at_gmail.com>
Date: Fri, 25 Apr 2008 08:54:35 +0800
hi, I found a strange behavior about the big-M constraints in eplex.Two code
snippet with the same logic result in different opt solution.
For code 1:
=> [A1, A2, A3] = [0, 0.2, 0] , Cost = 2.5
For code 2:
=> [A1, A2, A3] = [ 0, 0.1, 2.6], Cost = 3.9
--------- code 1-----------------
:- lib(eplex).


solve(Vars, Cost) :-

    model(Vars, Obj),

    eplex_solver_setup(min(Obj)),

    eplex_solve(Cost).


model(Vars, Obj) :-

    Vars = [A1, A2, A3 ],

    Vars $:: 0..inf,

    M = 10000000,

    B = [B1, B2],
    B :: 0..1,
    integers(B),

    Obj $>= A1 + 1.2,

    Obj $>= A2 + 2.3,

    Obj $>= A3 + 1.3,


    A2 - A1 $=< -2.2 + (1-B1)*M,
    A2 - A1 + B1*M $>= 0.1,



    A3 - A2 $=< -0.2 + B2*M,

    A3 - A2 + (1-B2)*M $>= 2.5.
------------code 2----------------------------------------
:- lib(eplex).


solve(Vars, Cost) :-

    model(Vars, Obj),

    eplex_solver_setup(min(Obj)),

    eplex_solve(Cost).


model(Vars, Obj) :-

    Vars = [A1, A2, A3 ],

    Vars $:: 0..inf,

    M = 10000000,

    B = [B1, B2],
    B :: 0..1,
    integers(B),

    Obj $>= A1 + 1.2,

    Obj $>= A2 + 2.3,

    Obj $>= A3 + 1.3,


    A2 - A1 $=< -2.2 + (1-B1)*M,
    A2 - A1 + B1*M $>= 0.1,



    A3 - A2 $=< -0.2 + (1-B2)*M,

    A3 - A2 + B2*M $>= 2.5.
--------------------------------------------------------------------

Is there any thing that I misunderstand or need to set up ?

ps.
thanks for point out my wrong usage of "porting". It should be "embedded
with C++" ?


On Fri, Apr 25, 2008 at 7:26 AM, Kish Shen <kisshen_at_cisco.com> wrote:

> Kim Lai wrote:
>
>> hi, your reply is a great help for me. thanks.
>> I use lib(eplex) to reformulate my problem as follow. and it really got a
>> solution.
>> But after I port the following code to C++. I'm getting trouble with ""How
>> to extract the variables result"".
>> A result like this "A2{0.0 .. 1.7976931348623157e+308 @
>> 1.1999999992549422}"
>> I'd like to extract A2=1.199 = 1.2
>> But it's not even a string...
>> in C++: I usually use "EC_word(Vars[i]).is_double(&d) == EC_succeed"
>> to get a double or long int .....And this didn't work..
>> ------------eclipse code------------------------
>>
>
> Your specific problem is that when a problem is solved by eplex, the
> problem variables are not instantiated. This allows you to modify the
> problem and resolve it. eplex_var_get/3 allows you to extract the solution
> value from the variable, e.g. for the variable A2 above,
>
> ....
> eplex_var_get(A2, solution, A2Sol),
>
>
> will instantiate A2Sol to the solution value of A2
>
> So you should exract the solution values, and pass these to C++.
>
> A more general point: I am not quite sure what you mean exactly by `porting
> to C++' - you seem to want to pass solution values from a ECLiPSe program to
> C++. This is probably the best way to use ECLiPSe as a constraint solver
> when you are using ECLiPSe with other languages -- but I would not call this
> `porting', but interfacing.
>
> Cheers,
>
> Kish
>



-- 
....Best Regards
by Kim Lai, 賴廣甫
Welcome to visit http://kimklai.blogspot.com
Received on Thu Apr 24 2008 - 17:54:37 CEST

This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET