- Inventory forecasting
- Prioritized ordering report
- Old forecasting input file format
- Old forecasting output file format
- Choosing the service levels
- Managing your inventory settings
- The old Excel forecast report
- Using tags to improve accuracy
- Oddities in classic forecasts
- Oddities in quantile forecasts
- Stock-out's bias on quantile forecasts
- Daily, weekly and monthly aggregations

Home » Resources » Here

There are economic incentives in deciding to keep a certain amount of stock for each SKU; those incentives are modeled as

Similarly, the

Finally, because of transportation constraints, all pairs of locations may not be eligible for transportation. When inventory can be balanced between a pair of compatible SKUs, or in other words two SKUs stocking the same product, we refer to this pair as a

The overall goal is to maximize the economic rewards associated with new stock positions obtained by transporting the products to different locations, while minimizing the associated transportation costs.

We are seeking the transportation solution $T_{ijk}$ that maximizes: $$\sum_{i,k} R_{ik}\left(\sum_j (T_{ijk} - T_{jik}) \right) + \sum_{i,j,k} T_{ijk} U_{ijk} + \sum_{g \in G} V_g\ H\left(\sum_{(i,j,k) \in g} T_{ijk}\right) $$ while respecting the following constraints: $$ \forall i, \forall j, \forall k, T_{ijk} \geq 0 \\ \forall i, \forall k, \sum_j T_{ijk} \leq Q_{ik} $$ Here, the reward $R$ typically represents the

In the general case, finding the optimal level of transportation is a complex numerical problem; but approximate solutions can nevertheless be found with a dedicated solver.

`solve.dispatch()`

function leverages the named arguments:
T.Q = solve.dispatch( sku: S.Product, S.Location reward: S.Reward stockAvailable: S.Available stockEligible: S.Eligible // optional edge: T.Product, T.Source, T.Destination unitCost: T.UnitCost // optional groupId: T.Group // optional groupCost: T.GroupCost) // optionalTable

`S`

is intended to be a representation of all the SKUs, that is, all the `T`

is intended to be the transport graph, representing all `T.Q`

- represent the actual optimized transported quantities.The arguments are as follows:

`sku`

(text, text) : the product and the location of the SKU, implicitly associated with the`edge`

argument which lists all the possible transfers.`reward`

(distribution): the reward distribution associated with the final stock position for the item at the given location.`stockAvailable`

(number): represents the starting point for computing the reward for every SKU, before any inventory transfer takes place.`stockEligible`

(number): represents the maximum amount of stock that can be taken from the SKU. When omitted, the entire`stockAvailable`

is considered as eligible. In practice, inventory that is*in transit*will be counted as part of the`stockAvailable`

, however this inventory cannot be counted as eligible for immediate (re)transfer.`edge`

(text, text, text): the list of all the acceptable transfer edges. If an edge is not present in this table, then no quantities can be transported along this edge.`unitCost`

(number): a linear transportation cost*per unit*when transporting quantities along the edge. When this cost is omitted, it is assumed to be zero.`groupId`

(text) and`groupCost`

(number): a non-linear transportation cost that comes into effect if any edge that belongs to the group is non-zero. Otherwise, the transportation cost remains at zero. When this cost is omitted, it is assumed to be zero.

The dispatch solver puts to use the algebra of distributions available in Envision in order to represent the economic rewards. These distributions are typically generated beforehand by leveraging the stock reward function.

Based on the transportation results computed by the dispatch solver, it becomes straightforward to compute the resulting stock variations for each SKU with:

S.Added = sum(T.Q) by [T.Product, S.Destination] at [S.Product, S.Location] S.Taken = sum(T.Q) by [T.Product, S.Source] at [S.Product, S.Location] S.Variation = S.Added - S.Taken