code: def trigeiro(T,N,factor):
      
      P = range(1,N+1)
      f,g,c,d,h,M = {},{},{},{},{},{}
  
      sumT = 0
      for t in range(1,T+1):
          for p in P:
              # capacity used per unit production: 1, except for
              # except for specific instances with random value in [0.5, 1.5]
              # (not tackled in our model)
  
              # setup times
              g[t,p] = 10 * random.randint(1,5)   # 10, 50: trigeiro's values
  
              # set-up costs
              f[t,p] = 100 * random.randint(1,10) # checked from Wolsey's instances
              c[t,p] = 0                          # variable costs
  
              # demands
              d[t,p] = 100+random.randint(-25,25) # checked from Wolsey's instances
              if t <= 4:
                  if random.random() < .25:       # trigeiro's parameter
                      d[t,p] = 0
              sumT += g[t,p] + d[t,p]             # sumT is the total capacity usage in the lot-for-lot solution
              h[t,p] = random.randint(1,5)        # holding costs; checked from Wolsey's instances
  
      for t in range(1,T+1):
          M[t] = int(float(sumT)/float(T)/factor)
  
      return P,f,g,c,d,h,M
docs: Data generator for the multi-item lot-sizing problem
      it uses a simular algorithm for generating the standard benchmarks in:
      "Capacitated Lot Sizing with Setup Times" by
      William W. Trigeiro, L. Joseph Thomas, John O. McClain
      MANAGEMENT SCIENCE
      Vol. 35, No. 3, March 1989, pp. 353-366
  
      Parameters:
          - T: number of periods
          - N: number of products
          - factor: value for controlling constraining factor of capacity:
              - 0.75:  lightly-constrained instances
              - 1.10:  constrained instances