2. Literature review
The container loading problem is a typical NP-hard problem
[3], so there is no polynomial-time optimal algorithm for solving
it. Exact algorithms often encounter the ‘‘combinatorial explo-
sion’’ phenomenon as the problem size increases. Studies on
the exact algorithms show that they solve problems of limited
size only. Therefore, heuristic methods become the first choice
of theoretical studies and practical applications. George and
Robinson [4] first presented a wall-building heuristic algorithm.
Bischoff and Marriott [5] compared 14 kinds of layer-based
approaches. Based on the idea of plane, Bischoff et al. [6]
presented a heuristic algorithm for the heterogeneous loading
problem. Constructive algorithms have also been developed by
Bischoff and Ratcliff [2] and Bischoff [7]. Lim et al. [8] developed a
heuristic algorithm. Juraitis et al. [9] presented a randomized
heuristic algorithm. Huang and He [10,11] proposed two effective
heuristic algorithms based on the idea of caving degree for a class
of container loading problems.
By combining with constructive algorithms, many meta-heur-
istic algorithms have been proposed. A series of research results
have been obtained using tabu search [12], genetic algorithm [13]
andhybridalgorithms[14]. In order to improve the performance of
metaheuristics, the parallelization technique is used by Gehring and
Bortfeldt [15], Bortfeldt et al. [16] and Mack et al. [17]. Based on the
idea of free space, Moura and Oliveira [18] proposed a greedy
random adaptive search algorithm (GRASP). Parren
˜
o et al. [19]
further developed GRASP using the concept of maximal space, a
nondisjoint representation of free space in a container. Zhang
et al. [20] presented a combinational heuristic algorithm that
combined personification heuristics and simulated annealing
algorithm. Zhang et al. [21] further developed a hybrid simulated
annealing algorithm based on the block heuristic idea. Recently,
Parren
˜
o et al. [22] presented a variable neighborhood search
(VNS) algorithm that combines a constructive procedure based
on the concept of maximal-space. He and Huang [23] developed a
fit degree algorithm by combining the constructive algorithm
with local search for the container loading problem.
In addition, incomplete tree search or graph search methods
have also been applied successfully to the 3D-CLP. Morabito and
Arenales [24] presented a search method based on And/Or graph.
Eley [25] designed an algorithm based on the same block. Hifi [26]
proposed a tree search method. Pisinger [27] presented an
algorithm that first divides the whole container space into several
vertical layers, then divides layers into a number of horizontal or
vertical strips and then uses an algorithm for the knapsack
problem. Bortfeldt and Mack presented a heuristic algorithm that
was derived from a branch-and-bound approach [28]. Fanslau and
Bortfeldt
[29] proposed an effective tree search algorithm based
on the idea of composite block, which is the best algorithm in
existing literature.
In this paper, a heuristic block-loading algorithm based on
multi-layer search is proposed; experimental results show that
the proposed algorithm outperforms the existing algorithm in the
literature.
3. Heuristic block-loading algorithm based on multi-layer
search
3.1. Basic heuristic block-loading algorithm
Heuristic algorithms are preferred because of practical needs
and the resultant complexity of the loading problem. A good
heuristic algorithm should not only be able to quickly find a
solution close to the optimal solution, but also provide the
necessary flexibility for different situations and needs. In this
paper, a block-loading heuristic algorithm is proposed for solving
the container loading problem. This algorithm works as follows.
First generate a list of all feasible blocks, and initialize the residual
space in the stack to contain the container as the sole residual
space, and then start the iteration process. Each iteration takes
algorithm BasicHeuristic (isComposite, searchParams, problem)
if isComposite then
blockTable : = GenSimpleBlock (problem.container, problem.box List, problem.num)
else then
blockTable : = GenSimpleBlock (problem.container, problem.box List, problem.num)
endif
set search parameters according to search Params
s.avail : = problem.num
s.plan : = {}
s.volume = 0
s.spaceStack : = {}
s.spaceStack .push ( problem.container )
while ps.spaceStack ≠ {} do
space := ps.spaceStack.top ()
blockList := GenBlock List ( ps.space, ps.avail )
if blockList ≠ {} then
block := FindNextBlock ( ps, blockList )
ps.spaceStack .pop ()
ps.avail := ps.avail - block.require
ps.plan := ps.plan + (space, block )
ps.plan.volume := ps.plan.volume + block.volume
ps.spaceStack.push (GeResidulSpace(space , block ))
else then
TransferSpace(space, ps.spaceStack)
endif
endwhile
return ps.plan
Fig. 1. Basic block-loading heuristic algorithm.
D. Zhang et al. / Computers & Operations Research 39 (2012) 2267–22762268