AMPL offers superior support by our development and technical support teams.
Contact us for general queries, partnerships, and more.
We can help you find the license and offering that works best for your situation.
AMPL offers superior support by our development and technical support teams.
Contact us for general queries, partnerships, and more.
We can help you find the license and offering that works best for your situation.
# Robert Rodosek and Mark Wallace
# A Generic Model and Hybrid Algorithm for Hoist Scheduling Problems
# in Michael J. Maher and Jean-Francois Puget eds.
# Principles and Practice of Constraint Programming - CP98,
# Springer, Lecture Notes in Computer Science, volume 1520, 1998.
# Adapted from
# www.g12.csse.unimelb.edu.au/minizinc/downloads/examples-latest/singHoist2.mzn
param numTanks integer > 0;
param numJobs integer > 0;
param empty {0..numTanks, 0..numTanks};
param full {0..numTanks};
param minTime {1..numTanks};
param maxTime {1..numTanks};
param perMax = sum {i in 1..numTanks} maxTime[i];
var Entry {0..numTanks} integer >= 0, <= numJobs * perMax;
var Removal {0..numTanks} integer >= 0, <= numJobs * perMax;
var Period integer >= 0, <= perMax;
minimize Objective: Period;
subj to Balance {t in 0..numTanks}:
Removal[t] + full[t] = Entry[(t+1) mod (numTanks+1)];
subj to EntRem {t in 1..numTanks}:
Entry[t] + minTime[t] <= Removal[t] and
Entry[t] + maxTime[t] >= Removal[t];
subj to Disjoint {t1 in 0..numTanks-1, t2 in t1+1..numTanks, k in 1..numJobs-1}:
Entry[(t1+1) mod (numTanks+1)] + empty[(t1+1) mod (numTanks+1),t2] <= Removal[t2] - k * Period or
Entry[(t2+1) mod (numTanks+1)] + empty[(t2+1) mod (numTanks+1),t1] <= Removal[t1] + k * Period;
subj to RemovalInit:
Removal[0] = 0;
subj to RemovalLImit:
Removal[numTanks] + full[numTanks] <= numJobs * Period;