|
Examples /
MipModelsWriting MIP models with ECLiPSeFirst ExampleThis typical MIP model specification of a transport problem: ![]()
can be translated to ECLiPSe as follows: model(Capacities, Demands, Costs, Supply, Cost) :-
dim(Costs, [M,N]), % get dimensions
dim(Supply, [M,N]), % create variables
Supply :: 0.0..inf, % ... with bounds
( for(J,1,M), param(Demands,Supply) do % set up constraints
sum(Supply[J,*]) $= Demands[J]
),
( for(I,1,N), param(Capacities,Supply) do
sum(Supply[*,I]) $=< Capacities[I]
),
Objective = sum(concat(Costs)*concat(Supply)), % objective expression
optimize(min(Objective), Cost). % solve
ParametersParameters are constants used in the model. They are either scalars or arrays of one or more dimensions. They can just be written as literals and assigned to ECLiPSe variables: NJobs = 10,
Penalty = 3.5,
Demand = [](43,12,65,0,5),
C = [](
[]( 0,384,484,214),
[](384, 0,156,411),
[](484,156, 0,453),
[](214,411,453, 0)
)
Larger data sets would usually be read from data files, which could be in various formats (ECLiPSe syntax, CSV, JSON, ...). VariablesIn MIP problems, variables are either continuous (reals) or integral (integers or binaries), and may have bounds: ![]() reals([X,Y,Z]), % continuous, no bounds
MakeSpan $:: 0.0..inf, % continuous, non-negative
integers([P,Q]), % integers, no bounds
R $:: 0..9, integers([R]), % integer between 0 and 9
B $:: 0..1, integers([B]), % binary
![]() dim(Amount, [NProducts]), % array [1..NProducts]
Amount $:: 0.0..inf % continuous, non-negative
dim(Assigned, [N,M]), % 2D array [1..N,1..M]
Assigned $:: 0..1, % binaries
integers(Assigned)
|