Initializing help system before first use

Mathematical Programming basics

model "Chess 1"
 uses "mmxprs"                    ! Use Xpress Optimizer for solving

 declarations
  xs, xl: mpvar                   ! Decision variables
 end-declarations

 Time:= 3*xs + 2*xl <= 160        ! Constraint: limit on working hours
 Wood:= xs + 3*xl <= 200          ! Constraint: raw mat. availability

 xs is_integer; xl is_integer     ! Integrality constraints

 maximize(5*xs + 20*xl)           ! Objective: maximize total profit

 writeln("Solution: ", getobjval) ! Print objective function value

 writeln("small: ", getsol(xs))   ! Print solution for xs
 writeln("large: ", getsol(xl))   ! and xl

 write("Time: ", getact(Time))    ! Constraint activity
 writeln(" ", getslack(Time))     ! and slack

end-model

Decision variables

declarations
  x, b, d: mpvar
  ifmake: array(1..10, 1..20) of mpvar
  y, z: array(1..10) of mpvar
end-declarations

mpvar means mathematical programming variable or decision variable, sometimes also just called variable. Decision variables are unknowns: they have no value until the model is run, and the optimizer finds values for the decision variables.
Variables can take values between 0 and infinity by default, other bounds may be specified:

x <= 10
y(1) = 25.5
y(2) is_free
z(2,3) >= -50
z(2,3) <= 50

Integer programming types are defined as unary constraints on previously declared decision variables

b is_binary                      ! Single binary variable
forall(p in PRODS,l in LINES)
  ifmake(p,l) is_binary          ! An array of binaries
d is_integer                     ! An integer variable
d <= 25                          ! Upper bound on the variable
x is_partint 10                  ! Partial integer (integers up to 10, continuous beyond)
y(3) is_semcont 5                ! Semi-continuous (0 or greater or equal 5)

Constraints

Constraint are declared just like decision variables, in LP/MIP problems they have type linctr – linear constraint.

declarations
  MaxCap: linctr
  Inven: array(1..10) of linctr
end-declarations

The ``value'' of a constraint entity is a linear expression of decision variables, a constraint type (≤, ≥, =), and a constant term. It is set using an assignment statement:

MaxCap := 10*x + 20*y + 30*z <= 100
Ctr(3) := 4*x(1) - 3*x(2) >= 10
Inven(2) := stock(2) = stock(1) + buy(2) - sell(2)

Objective function

An objective function is just a constraint with no constraint type.

declarations
  MinCost: linctr
end-declarations

MinCost := 10*x(1) + 20*x(2) + 30*x(3) + 40*x(4)

Optimization

minimize(MinCost)

maximize(MaxProfit)

Viewing the matrix

After defining the problem the matrix can be output to a file, to examine off line.

Specify LP format for constraint oriented file:
exportprob(EP_MIN, "explout", MinCost)
Useful Optimizer control settings:
setparam('XPRS_VERBOSE', true)
setparam('XPRS_LOADNAMES', true)

Viewing the solution

Always check the solution status of the problem before accessing any solution values.

if (getprobstat=XPRS_OPT) then
  writeln('optimal!')
else
  writeln('not optimal!')
  exit(1)
end-if

Alternatively, testing all problem states:

case getprobstat of
  XPRS_OPT: writeln('optimal')
  XPRS_INF: writeln('infeasible')
  XPRS_UNB: writeln('unbounded')
  XPRS_UNF: writeln('unfinished')
else
  writeln('unexpected problem status!')
end-case

Accessing the solution values within the model:

writeln('Maximum revenue: $', getobjval)
writeln('x(1) = ', getsol(x(1)), '  x(2) = ', x(2).sol)

Solution values of constraints: activity value + slack value = RHS

 
MaxCap := 10*x + 20*y <= 30
Activity value:
getsol(10*x + 20*y)
getact(MaxCap)
Slack value:
getsol(30 - (10*x + 20*y))
getslack(MaxCap)

Xpress Workbench: assuming that the model runs successfully, the logging pane at the bottom of the workspace reports that the run is complete. If a model has been run through the debugger, you can browse solution values of decision variables and constraints in the Debugger tab on the right side of the workspace.