File: SpongeRollProblem2.py

package info (click to toggle)
python-pulp 1.6.0%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 14,508 kB
  • sloc: python: 6,003; sh: 36; makefile: 25
file content (78 lines) | stat: -rw-r--r-- 2,530 bytes parent folder | download | duplicates (4)
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
"""
The Simplified Sponge Roll Problem with Surplus and Trim for the PuLP Modeller

Authors: Antony Phillips, Dr Stuart Mitchell   2007
"""

# Import PuLP modeler functions
from pulp import *

# A list of all the roll lengths is created
LenOpts = ["5","7","9"]

rollData = {#Length Demand SalePrice
              "5":   [150,   0.25],
              "7":   [200,   0.33],
              "9":   [300,   0.40]}

# A list of all the patterns is created
PatternNames = ["A","B","C"]

# Creates a list of the number of rolls in each pattern for each different roll length
patterns = [#A B C
            [0,2,2],# 5
            [1,1,0],# 7
            [1,0,1] # 9
            ]

# A dictionary of the number of cms of trim in each pattern is created
trim = {"A": 4,
        "B": 2,
        "C": 1}

# The cost of each 20cm long sponge roll used
cost = 1

# The sale value of each cm of trim
trimValue = 0.04

# The rollData is made into separate dictionaries
(rollDemand,surplusPrice) = splitDict(rollData)

# The pattern data is made into a dictionary
patterns = makeDict([LenOpts,PatternNames],patterns,0)

# The problem variables of the number of each pattern to make are created
pattVars = LpVariable.dicts("Patt",PatternNames,0,None,LpInteger)

# The problem variables of the number of surplus rolls for each length are created
surplusVars = LpVariable.dicts("Surp",LenOpts,0,None,LpInteger)

# The variable 'prob' is created
prob = LpProblem("Cutting Stock Problem",LpMinimize)

# The objective function is entered: the total number of large rolls used * the fixed cost of each minus the surplus
# sales and the trim sales
prob += lpSum([pattVars[i]*cost for i in PatternNames]) - lpSum([surplusVars[i]*surplusPrice[i] for i in LenOpts]) \
- lpSum([pattVars[i]*trim[i]*trimValue for i in PatternNames]),"Net Production Cost"

# The demand minimum constraint is entered
for i in LenOpts:
    prob += lpSum([pattVars[j]*patterns[i][j] for j in PatternNames]) - surplusVars[i]\
    >= rollDemand[i],"Ensuring enough %s cm rolls"%i
    
# The problem data is written to an .lp file
prob.writeLP("SpongeRollProblem.lp")

# The problem is solved using PuLP's choice of Solver
prob.solve()

# The status of the solution is printed to the screen
print("Status:", LpStatus[prob.status])

# Each of the variables is printed with it's resolved optimum value
for v in prob.variables():
    print(v.name, "=", v.varValue)

# The optimised objective function value is printed to the screen    
print("Production Costs = ", value(prob.objective))