## ----message=FALSE------------------------------------------------------- library(gbp) ## ------------------------------------------------------------------------ #- bpp_solver: input: order list in data.table `it` and bin list in data.table `bn` #- it # it item # - oid order id # - sku items id # - l it length which scale will be placed along x-coordinate # - d it depth which scale will be placed along y-coordinate # - h it height which scale will be placed along z-coordinate # - w it weight which scale will be placed along w-coordinate # l d h are subject to rotate, while w is on a separate single dimension it <- data.table::data.table( oid = c(1428571L, 1428571L, 1428571L, 1428572L, 1428572L, 1428572L, 1428572L, 1428572L), sku = c("A0A0A0", "A0A0A1", "A0A0A1", "A0A0A0", "A0A0A1", "A0A0A1", "A0A0A2", "A0A0A3"), l = c(2.140000, 7.240000, 7.240000, 2.140000, 7.240000, 7.240000, 6.000000, 4.000000), d = c(3.580000, 7.240000, 7.240000, 3.580000, 7.240000, 7.240000, 6.000000, 4.000000), h = c(4.760000, 2.580000, 2.580000, 4.760000, 2.580000, 2.580000, 6.000000, 4.000000), w = c(243.0000, 110.0000, 110.0000, 243.0000, 110.0000, 110.0000, 235.0000, 258.0000) ) knitr::kable(it) #- bn # bn bins # - id bn id # - l: bn length limit along x-coordinate # - d: bn depth limit along y-coordinate # - h: bn height limit along z-coordinate # - w: bn weight limit along w - a separate single dimension # - l, d, h will be sorted to have l >= d >= h within solver # bin must be ordered by preference such that the first bin is most preferred one. bn <- data.table::data.table( id = c("K0001", "K0002", "K0003", "K0004", "K0005"), l = c(06.0000, 10.0000, 09.0000, 10.0000, 22.0000), d = c(06.0000, 08.0000, 08.0000, 10.0000, 14.0000), h = c(06.0000, 06.0000, 07.0000, 10.0000, 09.0000), w = c(600.000, 600.000, 800.000, 800.000, 800.000) ) knitr::kable(bn) ## ------------------------------------------------------------------------ #- bpp_solver: output: packing solution #- sn # sn bpp_solution packing solution # - it item # - oid: order id # - sku: stock keeping unit as it id # - tid: ticket id - an unique id within oid # - otid: order id x ticket id - an unique indentifier indicate it with same tid can be packed into one bin # - bid: bn id # - x, y, z it position in bid bin # - l, d, h it scale along x, y, z # - w it weight # - bn bins # - id bn id # - l bn length limit along x-coordinate # - d bn depth limit along y-coordinate # - h bn height limit along z-coordinate # - w bn weight limit along w - a separate single dimension sn <- gbp::bpp_solver(it = it, bn = bn) sn$it sn$bn ## ------------------------------------------------------------------------ #- bpp_viewer: a packing solution viewer # requires rgl, run in r-console will create interactive 3d views in rgl window # bpp_viewer(sn) ## ------------------------------------------------------------------------ #- gbp4d #- ldhw: item l, d, h, w in matrix ldhw <- t(as.matrix(it[oid == 1428572L, .(l, d, h, w)])) ldhw #- m: bin l, d, h in matrix m <- t(as.matrix(bn[ , .(l, d, h, w)])) # multple bin m #- p: item fit sequence w.r.t bin p <- gbp4d_solver_dpp_prep_create_p(ldhw, m[, 4L]) # single bin p #- sn sn4d <- gbp4d_solver_dpp(p, ldhw, m[, 4L]) sn4d$it # matrix of items x, y, z, w (weight bn is holding when fit it into bn), l, d, h, w (weight of it itself) (x, y, z, w set into -1 when item not fit into bin) sn4d$k # indicator of which items are fitted into bin sn4d$bn # matrix of bins l, d, h, w (weight limit) sn4d$o # volume of items fitted into bin sn4d$ok # indicator of whether all items are fitted into bin ## ------------------------------------------------------------------------ gbp4d_checkr(sn4d) #- check: no overlap in 3d volume and no over weight limit ## ------------------------------------------------------------------------ # gbp4d_viewer(sn4d) ## ------------------------------------------------------------------------ #- gbp4q sn4q <- gbp4d_solver_dpp_filt(ldhw, m) # multiple bins, no fit sequence p # p is determined w.r.t each bin using algorithm in gbp4d_solver_dpp_prep_create_p sn4q$it # matrix of items x, y, z, w (weight bn is holding when fit it into bn), l, d, h, w (weight of it itself) (x, y, z, w set into -1 when item not fit into bin) sn4q$k # indicator of which items are fitted into bin sn4q$bn # matrix of bins l, d, h, w (weight limit) sn4q$f # indicator of which bin is selected sn4q$o # volume of items fitted into bin sn4q$ok # indicator of whether all items are fitted into bin ## ------------------------------------------------------------------------ gbp4q_checkr(sn4q) #- check: no overlap in 3d volume and no over weight limit ## ------------------------------------------------------------------------ # gbp4q_viewer(sn4q) ## ------------------------------------------------------------------------ #- gbp3d sn3d <- gbp3d_solver_dpp(p, ldhw[1L:3L, ], m[, 4L]) sn3d$it # matrix of items x, y, z, l, d, h (x, y, z set into -1 when item not fit into bin) sn3d$k # indicator of which items are fitted into bin sn3d$bn # matrix of bins l, d, h sn3d$o # volume of items fitted into bin sn3d$ok # indicator of whether all items are fitted into bin ## ------------------------------------------------------------------------ gbp3d_checkr(sn3d) #- check: no overlap in 3d volume ## ------------------------------------------------------------------------ # gbp3d_viewer(sn3d) ## ------------------------------------------------------------------------ #- gbp3q sn3q <- gbp3d_solver_dpp_filt(ldhw[1L:3L, ], m) # multiple bins, no fit sequence p # p is determined w.r.t each bin using algorithm in gbp3d_solver_dpp_prep_create_p sn3q$it # matrix of items x, y, z, l, d, h (x, y, z set into -1 when item not fit into bin) sn3q$k # indicator of which items are fitted into bin sn3q$bn # matrix of bins l, d, h sn3q$f # indicator of which bin is selected sn3q$o # volume of items fitted into bin sn3q$ok # indicator of whether all items are fitted into bin ## ------------------------------------------------------------------------ gbp3q_checkr(sn3q) #- check: no overlap in 3d volume ## ------------------------------------------------------------------------ # gbp3q_viewer(sn3q) ## ------------------------------------------------------------------------ #- gbp2d sn2d <- gbp2d_solver_dpp(p, ldhw[1L:2L, ], m[, 4L]) sn2d$it # matrix of items x, y, l, d (x, y set into -1 when item not fit into bin) sn2d$k # indicator of which items are fitted into bin sn2d$bn # matrix of bins l, d sn2d$o # volume of items fitted into bin sn2d$ok # indicator of whether all items are fitted into bin ## ------------------------------------------------------------------------ gbp2d_checkr(sn2d) #- check: no overlap in 2d area ## ------------------------------------------------------------------------ # gbp2d_viewer(sn2d) #- view on XZ surface and set Y into 1 to give stereo perception ## ------------------------------------------------------------------------ #- gbp2q sn2q <- gbp2d_solver_dpp_filt(ldhw[1L:2L, ], m) # multiple bins, no fit sequence p # p is determined w.r.t each bin using algorithm in gbp2d_solver_dpp_prep_create_p sn2q$it # matrix of items x, y, l, d (x, y set into -1 when item not fit into bin) sn2q$k # indicator of which items are fitted into bin sn2q$bn # matrix of bins l, d sn2q$f # indicator of which bin is selected sn2q$o # volume of items fitted into bin sn2q$ok # indicator of whether all items are fitted into bin ## ------------------------------------------------------------------------ gbp2q_checkr(sn2q) #- check: no overlap in 2d area ## ------------------------------------------------------------------------ # gbp2q_viewer(sn2q) ## ------------------------------------------------------------------------ #- gbp1d v <- apply(ldhw[1L:3L, ], 2L, prod) sn1d <- gbp1d_solver_dpp(p = v, w = ldhw[4L, ], c = 714.28) sn1d$p # vector of items profit sn1d$w # vector of items weight sn1d$c # weight limit constraint sn1d$k # indicator of which items are selected sn1d$o # weight of items selected sn1d$ok # indicator of whether all items are selected