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