Product Mix Problem#

이강우 & 김정자. (2012). EXCEL 2010 경영과학. 한경사, 32. []

D기업은 두 종류의 원료와 한 종류의 기계를 사용하여 제품 A와 제품 B를 생산하여 판매하고 있다. 각 제품을 1단위 생산할 때 필요한 원료의 사용량과 기계사용시간은 다음 Table 1과 같다.

Table 1 제품조합문제의 자료

자원

제품 A

제품 B

월 가용량

원료 1

10

5

300

원료 2

4

4

160

기계사용시간(시간)

2

6

180

단위당 이익(만원/개)

3

2

한편 D기업이 보유하고 있는 원료 1과 원료 2의 월 가용량은 각각 300kg, 160kg이고 기계사용시간의 월 가용시간은 180시간이며 생산된 제품 A와 제품 B를 판매하면 각각 단위당 3만원과 2만원의 이익이 발생한다고 한다. D기업에 주어진 한정된 자원을 사용하여 D기업의 월 이익을 최대로 하는 제품 A와 제품 B의 월 생산량을 구하기 위한 선형계획모형을 작성하라.

\[\begin{split}\begin{align*} & \text{maximize } & Z=3&X_{1}+2X_{2} & \text{(Objective function)} &\quad(1.1)\\[1ex] & \text{subject to } & \, 10&X_{1}+5X_{2} \le 300 & \text{(Constraint 1)} &\quad(1.2)\\[1ex] & & \, 4&X_{1}+4X_{2} \le 160 & \text{(Constraint 2)} &\quad(1.3)\\[1ex] & & \, 2&X_{1}+6X_{2} \le 180 & \text{(Constraint 3)} &\quad(1.4)\\[1ex] & \text{and} & \, &X_{1},X_{2} \ge 0 & \text{(Non-negative)} &\quad(1.5)\\[1ex] \end{align*}\end{split}\]

Modeling with PuLP#

from pulp import *

# Define problem
prob = LpProblem(name='Product Mix Problem', sense=LpMaximize)

# Create decision variables and non-negative constraint
x1 = LpVariable(name='X1', lowBound=0, upBound=None, cat='Continuous')
x2 = LpVariable(name='X2', lowBound=0, upBound=None, cat='Continuous')

# Set objective function
prob += 3*x1 + 2*x2

# Set constraints
prob += 10*x1 + 5*x2 <= 300
prob += 4*x1 + 4*x2 <= 160
prob += 2*x1 + 6*x2 <= 180

# Solving problem
prob.solve()
print('Status', LpStatus[prob.status])
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 1
----> 1 from pulp import *
      3 # Define problem
      4 prob = LpProblem(name='Product Mix Problem', sense=LpMaximize)

ModuleNotFoundError: No module named 'pulp'
print('Z = {}'.format(value(prob.objective)))
for v in prob.variables():
    print('{} = {}'.format(v.name, v.varValue))
Z = 100.0
X1 = 20.0
X2 = 20.0

Modeling with GUROBI#

from gurobipy import *

# Create a new model
m = Model(name='Product Mix Problem')

# Create variables
x1 = m.addVar(lb=0, ub=1e+100, vtype=GRB.CONTINUOUS, name='X1')
x2 = m.addVar(lb=0, ub=1e+100, vtype=GRB.CONTINUOUS, name='X2')

# Set objective
m.setObjective(3*x1 + 2*x2, sense=GRB.MAXIMIZE)

# Add constraint
m.addConstr(10*x1 + 5*x2 <= 300)
m.addConstr(4*x1 + 4*x2 <= 160)
m.addConstr(2*x1 + 6*x2 <= 180)

# Optimize model
m.optimize()
Optimize a model with 3 rows, 2 columns and 6 nonzeros
Coefficient statistics:
  Matrix range     [2e+00, 1e+01]
  Objective range  [2e+00, 3e+00]
  Bounds range     [0e+00, 0e+00]
  RHS range        [2e+02, 3e+02]
Presolve time: 0.00s
Presolved: 3 rows, 2 columns, 6 nonzeros

Iteration    Objective       Primal Inf.    Dual Inf.      Time
       0    5.0000000e+30   4.875000e+30   5.000000e+00      0s
       2    1.0000000e+02   0.000000e+00   0.000000e+00      0s

Solved in 2 iterations and 0.01 seconds
Optimal objective  1.000000000e+02
print('Z = {}'.format(m.objVal))
for v in m.getVars():
    print('{} = {}'.format(v.varName, v.x))
Z = 100.0
X1 = 20.0
X2 = 20.0