Tag Info

9

GAMS and AMPL are general purpose modelling languages and can he used to describe any type of nonlinear function, including some niche stuff like floor, ceil, max, etc (AMPL). I don't have experience with OPL so I can't comment on that. The purpose of these languages is twofold: They provide a solver interface for your math. Solvers typically require input ...

7

AMPL assumes that a parameter takes only numerical values, unless you add the keyword symbolic to say that string values are also permitted. So your first statement should be param filename symbolic := "instance.txt"; Then you can use the string expression ("output" & filename) to specify a file that receives the output from a ...

6

I don't think there is anything special in AMPL for doing this, but it can be done. Option 1 is to add a term to the objective that penalizes the sum of all variables. (I'm assuming that all variables are nonnegative.) This will encourage the solver to force your "free" variables to zero. The catch is that you have to multiply this term by a ...

6

Before implementing anything, you need to understand the equations. A good approach is to think in terms of resources. When handling capacity constraints, you are dealing with a load resource which is limited to the vehicle's capacity. When dealing with constraints linked to time, you need an extra resource for this. Each of these resources can be delt with ...

6

To overwrite a file that you have previously been writing in an AMPL session, first close the file: close (OutputFile); Then use > to overwrite the file: print k > (OutputFile); This deletes the file and then opens a new, empty file with the same name. Note that once the file is open, > and >> both append to it. A complete description of ...

5

This should overwrite : k > (OutputFile); While this appends : k >> (OutputFile);

5

I am aware of models that model such constraints using a network-flow-type approach. The basic idea is to create a source node that send "flow" of an imaginary product for which all nodes have a demand of 1. There are no costs for the flows. In your case the problem is trickier because you would need two source nodes, and maybe two types of imaginary ...

4

model; set energy:= el co th; set tech := cog tri; subject to cons1 {i in demand, j in facility}: y[i,j,'th'] <= sum{i in size} x[j,l,'tri']; subject to cons2 {i in demand, j in facility, k in energy}: y[i,j,k] <= sum{j in facility, l in size, m in tech} x[j,l,m]; The only thing that you need to change is in your first constraint 'CO' to 'TH'. A ...

4

The .. operator cannot be used in the data section (i.e. it won't be expanded, see the AMPL FAQ). What you can do is to declare the limits in the model, e.g. param n; set things := 1..n; and define them in the data file param n := 5;

4

Yes it is reasonable. For problems where closing the optimality gap is difficult, you may want to save e.g. the 10 best solutions found before termination. This is called a solution pool and it is a solver specific option that you must pass to the solver from AMPL (check the solvers' manuals for "solution pool"). Most linear solvers support this (including ...

4

Try sum{(i,j) in ARCS} blablabla[i,j]

3

Using the assignment operator := inside the loop is redefining h for each combination of k and j, which is an error. I assume that your actual data set will not have the same 2D data matrix for all (k, j) combinations (which is what your example here would do if it worked). You might want to look at Chapter 12 of the AMPL book, which discusses various ways ...

3

Let $\rho$ be some small value. \begin{align}M \times f(x) &\geq x - 1 + \rho\\M \times (1 - f(x)) &\geq 1 - x - \rho\end{align} Here is the small working code in Python pulp import pulp as pl prob = pl.LpProblem("Problem", pl.LpMinimize) x = 1 f = pl.LpVariable("f_{0}", 0, 1, pl.LpBinary) prob += f M = 100 prob += M * f >= x - 1 + 0.001 prob +=...

3

Outside an exam scenario, the correct answer is "switch to a solver that supports alldiff", but I'm assuming you are required to solve this in Gurobi. One way to approach this within the confines of a linear integer problem is to make your decision variable a binary, with an extra dimension added. Hence, instead of "value of X at [i,j]" your decision ...

3

In AMPL's website, there is a code for solving sudoku which is very similar to your problem. In their code they also used alldiff. The only thing that you need to add to the following model is some constraint to consider the diagonal summation as well. By the way, "a Sudoku puzzle is defined as a logic-based, number-placement puzzle. The objective is to fill ...

3

The AMPL Solver Library (or ASL) is an open-source interface between solvers and modelling languages. As long as a solver can (i) read an .nl file and (ii) produce a .sol file, it will work out of the box with AMPL and any other modelling platform, such as Pyomo, that supports ASL. Unfortunately, many solvers do not come with an ASL interface out of the box....

3

Here is the AMPL interpretation of @RobPratt's answer which works perfectly using the gurobi in my local pc: model; param n := 22; set NODES = 1..n; param degree {NODES} := 5; set NODE_PAIRS = {i in NODES, j in NODES: i < j}; var X {NODE_PAIRS} binary; var Y {(i,j) in NODE_PAIRS, k in NODES diff {i,j}} binary; subject to DegreeCon {k in NODES}: ...

3

Here is the SAS code that I used to obtain the results in the linked thread. Maybe it will help you correct your AMPL errors. In particular, note that you should declare each variable only once. proc optmodel; num n = 22; set NODES = 1..n; num degree {NODES} = 5; set NODE_PAIRS = {i in NODES, j in NODES: i < j}; var X {NODE_PAIRS} binary;...

3

An alternative approach to binary variables or semicontinuous variables is the following cubic polynomial inequality: $$x(x-L_B)(U_B-x)\ge 0$$ Because $x \ge 0$, this constraint enforces $$(x = 0) \lor (x - L_B \ge 0 \land U_B - x \ge 0),$$ as desired. The case $(x - L_B \le 0 \land U_B - x \le 0)$ is prevented by $L_B < U_B$. After further consideration,...

3

Your ratio current/best possible is not itself a gap; it is part of what you would use to compute the relative gap. The relative gap defined by CPLEX is the absolute difference between the objective solution of the best known solution (the incumbent, "best integer" in the formula you quote) and the best known bound ("best bound" in the ...

3

One possible solution (not necessarily quick or efficient) is a lazy constraint approach: Solve your problem, ignoring the connection requirement Examine the solution and find the subgraph $H$ that is connected to $v$. If $H=G$, you are finished. Otherwise, add a constraint that at least one of the edges between $H$ and not-$H$ is connected, and repeat. ...

2

This looks most like the math (and avoids checking for every $(i,j,t)$ a logical condition that depends only on $i$ and $j$): {i in PP, j in PP diff {i}, t in TT}

1

I am going to answer my own question. After I made the post, I realized the variable pi actually don't show up in the model though declared. It looks like this is the reason why the first way doesn't take effective in the 'solve' process while the second explicit way works.

1

You may have a look at this presentation about network flows implementations in AMPL. In the presentation, the authors talked about new AMPL implementations of "arc" and "node" especially on page 8 they mentioned keywords like from and to that I think will help you design your constraints in AMPL. There is also AMPL book chapter about network linear programs ...

1

Try the following syntax: subject to cons {i in PP,t in TT, j in PP : j diff i}: Or subject to cons {i in PP,t in TT, j in PP : j<>i}:

Only top voted, non community-wiki answers of a minimum length are eligible