-
Notifications
You must be signed in to change notification settings - Fork 12
/
SO_PulP_CBC.py
81 lines (65 loc) · 2.22 KB
/
SO_PulP_CBC.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""
Created on Sat Aug 27 23:41:04 2016
@author: deepesh singh
"""
#import all relevant libraries
import pandas as pd
import numpy as np
import math
from math import isnan
from pulp import *
from collections import Counter
from more_itertools import unique_everseen
sales=pd.read_csv("sales_lift.csv",header=None) #input file
lift=sales.iloc[2:,1:]
lift=np.array(lift)
lift = lift.astype(np.int) # read the lifts from csv
brands=sales.iloc[0:1,:]
brands=np.array(brands)
brands=np.delete(brands,0)
brands=brands.tolist() # read the brands from csv
ff=Counter(brands)
all_brands=ff.items()
# the racks and the shelfs available
rack_shelf=[[1,1,2,3],[2,4,5,6],[3,7,8,9,10]]
#define the optimisation function
prob=LpProblem("SO",LpMaximize)
# define decision variables
dec_var=LpVariable.matrix("dec_var",(range(len(lift)),range(len(lift[0]))),0,1,LpBinary)
#Compute the sum product of decision variables and lifts
prodt_matrix=[dec_var[i][j]*lift[i][j] for i in range(len(lift))
for j in range(len(lift[0]))]
#total lift which has to be maximised sum(prodt_matrix)
#define the objective function
prob+=lpSum(prodt_matrix)
order=list(unique_everseen(brands))
order_map = {}
for pos, item in enumerate(order):
order_map[item] = pos
#brands in order as in input file
brands_lift=sorted(all_brands, key=lambda x: order_map[x[0]])
# DEFINE CONSTRAINTS
#1) each shelf can have only one product i.e. sum (each row)<=1
for i in range(len(lift)):
prob+=lpSum(dec_var[i])<=1
#2) each product can be displayed only on a limited number of shelves.i.e. Column constraints
# constraints are given as
col_con=[1,0,0,2,2,3,1,1]
dec_var=np.array(dec_var)
col_data=[]
for j in range(len(brands)):
col_data.append(list(zip(*dec_var)[j]))
prob+=lpSum(col_data[j])<=col_con[j]
#write the problem
prob.writeLP("SO.lp")
#solve the problem
prob.solve()
print("The maximum Total lift obtained is:",value(prob.objective)) # print the output
#print the decision variable output matrix
Matrix=[[0 for X in range(len(lift[0]))] for y in range(len(lift))]
for v in prob.variables():
Matrix[int(v.name.split("_")[2])][int(v.name.split("_")[3])]=v.varValue
matrix=np.int_(Matrix)
print ("The decision variable matrix is:")
print(matrix)
#pulp.pulpTestAll()