0

Let's say I would like to have all the commodities in the annual food list instead of few. How to add greater than 0 (>0) constraint for all the commodities? Any help or suggestion would be really helpful.

I have made some changes in the data according to my requirement. So instead of commodities now we have different SKUs details. Here I would like to add greater than zero constraint for all the variables.

def main():
    
    # minimum requirements.
    # Constraints: 
    min_requirements =  [
        ['TDP', 11],
        ['uniqueness', 3],
        ['sales', 70],
        ['velocity', 0.8],
        ['profit', 12],
        ['incrementality', 5],
        ['household_penetration', 80],
        ['ACV', 2.7],
        ['NSV', 18],
        ['Walk rate', 75]
    ]  
    
    #min_unit_required = ['no. of unit', 1]      

    # The data below is per unit dollar, not per unit. So, the objective is to determine how many dollars to spend on each SKU. SKU, TDP, uniqueness, sales, velocity, profit, incrementality, household_penetration, ACV, NSV, Walk rate values are given as below
    
    #Decision variabes
    data = [
        ['SKU1', 36, 44.7, 1411, 2, 365, 0, 55.4, 33.3, 441, 0],
        ['SKU2', 14.1, 11.6, 418, 0.7, 54, 0, 3.2, 1.9, 68, 0],
        ['SKU3', 24.2, 11.8, 377, 14.4, 175, 0, 14.4, 8.8, 114, 0],
        ['SKU4', 7.1, 11.4, 252, 0.1, 56, 0, 13.5, 2.3, 68, 0],
        ['SKU5', 4.6, 36.0, 897, 1.7, 99, 30.9, 17.4, 7.9, 106, 0],
        ['SKU6', 8.5, 28.6, 680, 0.8, 80, 0, 10.6, 1.6, 110, 0],
        ['SKU7', 7.5, 21.2, 460, 0.6, 41, 0, 2, 4.8, 60, 0],
        ['SKU8', 7.1, 25.3, 907, 5.1, 341, 0, 37.1, 8.9, 64, 0],
        ['SKU9', 7.9, 15.0, 488, 2.5, 115, 0, 13.8, 8.5, 126, 0],
        ['SKU10', 9.1, 12.2, 484, 2.7, 125, 0, 13.9, 6.4, 160, 0],
        ['SKU11', 9.1, 12.4, 439, 1.1, 82, 0, 9.9, 3, 66, 0],
        ['SKU12', 24.8, 8.0, 130, 0.4, 31, 18.9, 2.8, 3, 17, 0],
        ['SKU13', 15.1, 12.5, 288, 0.5, 50, 0, 0, 0, 0, 0],
        ['SKU14', 11, 6.1, 310, 10.5, 18, 16.8, 4, 16, 7, 177],
        ['SKU15', 6.7, 8.4, 422, 15.1, 9, 26, 3, 23.5, 11, 60],
        ['SKU16', 30.8, 10.8, 9, 0.2, 3, 44.2, 0, 0.2, 2, 0],
        ['SKU17', 16.1, 20.6, 17, 0.6, 6, 55.8, 0.2, 0, 0, 0],
        ['SKU18', 32.6, 2.9, 238, 1.0, 52, 18.6, 2.8, 6.5, 1, 0],
        ['SKU19', 24.2, 7.4, 448, 16.4, 19, 28.1, 0.8, 10.3, 4, 0],
        ['SKU20', 14.1, 3.5, 49, 1.7, 3, 16.9, 0.6, 2.5, 0, 17],
        ['SKU21', 17.9, 15.7, 661, 1.0, 48, 0, 9.6, 8.1, 471, 0],
        ['SKU22', 16.7, 8.6, 18, 0.2, 8, 2.7, 0.4, 0.5, 0, 0],
        ['SKU23', 20.3, 20.1, 0, 0, 0, 0, 0, 0, 0, 0],
        ['SKU24', 9.8, 41.7, 0, 0, 0, 0.2, 0, 0.5, 5, 0],
        ['SKU25', 39.6, 2.9, 166, 0.1, 34, 0.2, 2.1, 2.9, 69, 0],
        ['SKU26', 36.4, 2.2, 214, 0.1, 32, 0.4, 2.5, 2.4, 87, 0],
        ['SKU27', 29.2, 3.4, 213, 0.1, 33, 0, 0, 2, 0, 0],
        ['SKU28', 22.6, 3.6, 309, 0.2, 46, 0.4, 1, 4, 120, 0],
        ['SKU29', 14.6, 8.5, 404, 0.2, 62, 0, 0.9, 0, 0, 0],
        ['SKU30', 26.8, 2.2, 333, 0.2, 139, 169.2, 6.4, 50.8, 316, 525],
        ['SKU31', 27.6, 3.1, 245, 0.1, 20, 0, 2.8, 3.9, 86, 0],
        ['SKU32', 36.6, 3.3, 140, 0.1, 15, 0, 1.7, 2.7, 54, 0],
        ['SKU33', 30.7, 3.5, 196, 0.2, 30, 0, 17.4, 2.7, 60, 0],
        ['SKU34', 24.2, 4.4, 249, 0.3, 37, 0, 18.2, 3.6, 79, 0],
        ['SKU35', 25.6, 10.4, 152, 0.2, 23, 0, 1.8, 1.8, 71, 0],
        ['SKU36', 27.4, 6.7, 212, 0.2, 31, 0, 9.9, 3.3, 50, 0],
        ['SKU37', 16, 18.8, 164, 0.1, 26, 0, 1.4, 1.8, 0, 0],
        ['SKU38', 30.3, 1.8, 184, 0.1, 30, 0.1, 0.9, 1.8, 68, 46],
        ['SKU39', 42.3, 1.7, 156, 0.1, 24, 0, 1.4, 2.4, 57, 0],
        ['SKU40', 13, 5.8, 705, 6.8, 45, 3.5, 1, 4.9, 209, 0],
        ['SKU41', 4.4, 5.8, 27, 0.5, 36, 7.3, 3.6, 2.7, 5, 544],
        ['SKU42', 6.1, 4.9, 60, 0.4, 30, 17.4, 2.5, 3.5, 28, 498],
        ['SKU43', 26, 1.0, 21, 0.5, 14, 0, 0.5, 0, 4, 952],
        ['SKU44', 30.9, 2.2, 40, 1.1, 18, 11.1, 3.6, 1.3, 10, 1998],
        ['SKU45', 7.1, 2.4, 138, 3.7, 80, 69, 4.3, 5.8, 37, 862],
        ['SKU46', 3.7, 2.6, 125, 4.0, 36, 7.2, 9, 4.5, 26, 5369],
        ['SKU47', 4.7, 2.7, 73, 2.8, 43, 188.5, 6.1, 4.3, 89, 608],
        ['SKU48', 7.3, 0.9, 51, 3.0, 23, 0.9, 1.4, 1.4, 9, 313],
        ['SKU49', 8.2, 0.4, 27, 1.1, 22, 112.4, 1.8, 3.4, 11, 449],
        ['SKU50', 3.6, 5.8, 166, 3.8, 59, 16.6, 4.7, 5.9, 21, 1184],
        ['SKU51', 34, 14.3, 336, 1.8, 118, 6.7, 29.4, 7.1, 198, 2522],
        ['SKU52', 8.1, 1.1, 106, 0, 138, 918.4, 5.7, 13.8, 33, 2755],
        ['SKU53', 5.1, 9.6, 138, 2.7, 54, 290.7, 8.4, 5.4, 83, 1912],
        ['SKU54', 16.8, 3.7, 20, 0.4, 10, 21.5, 0.5, 1, 31, 196],
        ['SKU55', 20.4, 3.0, 8, 0.3, 8, 0.8, 0.8, 0.8, 5, 81],
        ['SKU56', 21.3, 2.4, 16, 0.4, 8, 2, 2.8, 0.8, 7, 399],
        ['SKU57', 27.7, 0.4, 33, 0.3, 12, 16.3, 1.4, 2.1, 17, 272],
        ['SKU58', 10, 1.0, 54, 2, 65, 53.9, 1.6, 4.3, 32, 431],
        ['SKU59', 7.1, 7.5, 364, 4, 134, 3.5, 8.3, 7.7, 56, 0],
        ['SKU60', 10.4, 5.2, 136, 0.2, 16, 12, 1.6, 2.7, 42, 218],
        ['SKU61', 13.8, 2.3, 136, 0.6, 45, 34.9, 4.9, 2.5, 37, 370],
        ['SKU62', 8.6, 1.3, 63, 0.7, 38, 53.2, 3.4, 2.5, 36, 1253],
        ['SKU63', 7.6, 1.6, 71, 0.6, 43, 57.9, 3.5, 2.4, 67, 862],
        ['SKU64', 15.7, 8.5, 87, 1.7, 173, 86.8, 1.2, 4.3, 55, 57],
        ['SKU65', 9, 12.8, 99, 2.5, 154, 85.7, 3.9, 4.3, 65, 257],
        ['SKU66', 9.4, 13.5, 104, 2.5, 136, 4.5, 6.3, 1.4, 24, 136],
        ['SKU67', 7.9, 20.0, 1367, 4.2, 345, 2.9, 28.7, 18.4, 162, 0],
        ['SKU68', 8.9, 17.4, 1055, 3.7, 459, 5.1, 26.9, 38.2, 93, 0],
        ['SKU69', 5.9, 26.9, 1691, 11.4, 792, 0, 38.4, 24.6, 217, 0],
        ['SKU70', 22.4, 0, 0, 0, 0, 0, 4, 5.1, 50, 0],
        ['SKU71', 17.4, 0, 0, 0, 0, 0, 0, 2.3, 42, 0],
        ['SKU72', 8.6, 8.7, 237, 3, 72, 0, 2, 11.9, 40, 0],
        ['SKU73', 16.2, 8.0, 77, 1.3, 39, 0, 0.9, 3.4, 14, 0],
        ['SKU74', 51.7, 34.9, 0, 0, 0, 0, 0, 0, 0, 0],
        ['SKU75', 13.7, 14.7, 0, 0.5, 74, 0, 0, 0, 5, 0],
        ['SKU76', 13.6, 9.0, 0, 10.3, 244, 0, 1.9, 7.5, 146, 0],
        ['SKU77', 20.5, 6.4, 11, 0.4, 7, 0.2, 0.2, 0.4, 3, 0]
    ]
 
    # Instantiate a Glop solver and naming it.
    solver = pywraplp.Solver.CreateSolver('GLOP')
    
    # Declare an array to hold our variables.
    SKU = [solver.NumVar(0.0, solver.infinity(), item[0]) for item in data]
    #print(SKU)
    
    print('Number of variables =', solver.NumVariables())

    # Create the constraints.
    constraints = []
    for i, m in enumerate(min_requirements):
        constraints.append(solver.Constraint(m[1], solver.infinity()))
        for j, item in enumerate(data):
            constraints[i].SetCoefficient(SKU[j], item[i + 1])
    #print(constraints)
    #solver.Constraint(min_unit_required[1], solver.infinity())
    
    #solver.Constraint()

    print('Number of constraints =', solver.NumConstraints())

    
    # Objective function: Minimize the sum of (price-normalized) SKUs.
    objective = solver.Objective()
    for sku in SKU:
        objective.SetCoefficient(sku, 1)
              
    objective.SetMinimization()

    status = solver.Solve()


    # Check that the problem has an optimal solution.
    if status != solver.OPTIMAL:
        print('The problem does not have an optimal solution!')
        if status == solver.FEASIBLE:
            print('A potentially suboptimal solution was found.')
        else:
            print('The solver could not solve the problem.')
            exit(1)

    
    result = [0] * len(min_requirements)
    
    print('\nMinimum $ spend:')
    for i, sku in enumerate(SKU):
        if sku.solution_value() > 0.0:
            print('{}: ${}'.format(data[i][0],sku.solution_value()))
            for j, _ in enumerate(min_requirements):
                result[j] += data[i][j + 1] * sku.solution_value()
    
    print('\nOptimal annual price: ${:.2f}'.format(objective.Value()))
    

    print('\nAttribute details:')
    for i, m in enumerate(min_requirements):
        print('{}: {:.2f} (min {})'.format(m[0], result[i],
                                           m[1]))

    print('\nAdvanced usage:')
    print('Problem solved in %f milliseconds' % solver.wall_time())
    print('Problem solved in %d iterations' % solver.iterations())
    
if __name__ == '__main__':
    main()

Arusekk
  • 827
  • 4
  • 22

0 Answers0