Skip to main content

Appearance of objective function in the model.write()

Answered

Comments

8 comments

  • Eli Towle
    Gurobi Staff Gurobi Staff

     Regarding the \( 0 \) objective coefficients: if a variable does not appear in any of the constraints, Gurobi adds it to the objective function with a coefficient of \( 0 \). Because the objective coefficient is \( 0 \), this does not affect the objective function. One reason for this is simply to ensure that all variables included in the model appear in the model file, regardless of whether they appear in any constraints.

    Regarding the form of the quadratic objective terms: by convention, quadratic objective expressions are written in a form such that the quadratic expression is divided by \( 2 \). This is mentioned in the Single-Objective Case section of the LP format documentation. Your screenshot cuts off the end of the objective function, where you would see the closing bracket and division by \( 2 \). In textbooks and papers, it's fairly common to see quadratic objective expressions written in the form \( \frac{1}{2} x^\top Q x \).

    1
  • Iason Liagkas
    Detective
    Gurobi-versary
    Thought Leader

    Thanks Eli.

    0
  • Iason Liagkas
    Detective
    Gurobi-versary
    Thought Leader

    The variable kfa is defined as:

    #kf_a
    kfa = model.addVars(arcs, vtype=GRB.CONTINUOUS, ub=kfa_max, name='kf_a')

    I have the constraint 

    for i,j in arcs:
        model.addGenConstrLog(kfa[i,j], lkfa[i,j], name="log_kfa")

    But my model is infeasible so far. Does this mean that this constraint could cause a bug? Because it is like the model does not recognize the kfa variable(but not necessarily). When I replace a set of constraints that include kfa the problem becomes feasible.  I see that on the same file I posted above the constraints of this variable are included:Could It be that Gurobi has limited power when handling log function constraints and this makes the model infeasible?

    0
  • Eli Towle
    Gurobi Staff Gurobi Staff

    It will be easier to figure out the issue with a reproducible example. Can you please post a minimal, self-contained code example that builds an infeasible model you would expect to be feasible?

    0
  • Iason Liagkas
    Detective
    Gurobi-versary
    Thought Leader

    Thanks Eli. My model is

    Constraint 4 is named the BPR function. I have 3 alternative ways of modeling it: The first one is to drop the fourth power: 
    This is not wanted. It is just a test. The code runs in this case. The next alternative is
    This alternative is provided in a paper in my dropbox file. This does not work but it is supposed to work. The lines you see are the lines of this alternative in the code. 
    The third alternative is also included in the paper and the code works. 
    Put untitled1.py which is the file of my code in a folder with the files Table1, Table2, allpaths, Dijkstra. Replace the path that my code has in the beginning with the path of the file you have all those files and run the file up to line 290 (model.optimise()). If you uncomment and comment those alternatives in the lines I have noted above you will run the 3 alternatives. I have also included the paper with the theory 2 of them(just for your reference, it is not essential). The alternative with the logarithms crashes. The thing is I have to add more constraints that include logarithms in the future and I do not know the reason why my code crashes. The link to those files is:
    https://www.dropbox.com/scl/fo/0w8bt6jue8dn5cykewa94/h?dl=0&rlkey=2h1vvq0plpt8b6rl8pepehtos

    Feel free to ask any questions. The paper has BPR as constraint 7 pg 4/12 Its linearization is provided from equations 19+21, or 21+24, and the 2 equations in yellow above 24. Those are the two alternatives from Riemann. You do not need anything else from the paper.  

    Kind regards 
    Iason

     

     

     

     

    0
  • Iason Liagkas
    Detective
    Gurobi-versary
    Thought Leader

    If the code runs with alternatives 1,3 then this means that if there is a bug is on the lines of the 2nd alternative or in the lines the variables of the 2nd alternative are defined. But those lines are so few and I do not see a bug there. So I suspect that Gurobi cannot solve this alternative due to the complexity of the logarithmic constraints.

    0
  • Iason Liagkas
    Detective
    Gurobi-versary
    Thought Leader

    I can give you a presentation if you want to your time zone to present and explain everything. 

    0
  • Eli Towle
    Gurobi Staff Gurobi Staff

    I suspect the issue is related to \(\texttt{kfa_max}\), which you define to be the upper bound of the \(\texttt{kfa}\) variables. \(\texttt{kfa_max}\) has a value of \( 53300^4 = 8.0706559921 \cdot 10^{18} \). This is far too large of a value for multiple reasons:

    1. Gurobi stores this value as a 64-bit double-precision float. This data type is only accurate up to about 16 base-10 digits of accuracy, so the value of \( \texttt{kfa_max}\) cannot even be accurately stored. Any arithmetic operations performed with this value will likely result in serious roundoff error.
    2. Gurobi does not directly model function constraints like \(y = \log(x) \). Rather, Gurobi internally builds a piecewise-linear approximation of the underlying function. Thus, when you add a constraint like \(\texttt{lkfa}_{ij} = \log(\texttt{kfa}_{ij})\), you're asking Gurobi to build a piecewise-linear approximation of the logarithm function over the domain \((0, 8 \cdot 10^{18}]\). This will inevitably be a very poor approximation of the \(\log\) function. The value of \(\texttt{lkfa}_{ij}\) can be far from the calculated value of \(\log(\texttt{kfa}_{ij})\), resulting in unexpected infeasibilities or large constraint violations.

    I would start by modifying your formulation so the value of \(\texttt{kfa_max}\) is significantly smaller.

    0

Please sign in to leave a comment.