반응형
파이썬 선형계획법
파이썬을 이용하여 선형계획법 문제를 해결한다.
예시문제 1
- 문제상황
- A,B,C 세개의 제품이 있고 가장 수익을 많이 내는 방법을 찾는다.
- 판매가격은 A제품이 10, B제품이 8, C제품이 9 이다.
- 생산비용은 A제품이 2, B제품이 3, C제품이 1 이며 생산비용의 총합은 1000을 넘어서는 안된다.
- 생산시간은 A제품이 5, B제품이 6, C제품이 6 이며 생산시간의 총합은 2400을 넘어서는 안된다.
- 모든 제품은 700이상 생산해서는 안된다.
- B제품은 160이상 생산해야 한다.
- 목적함수
- max (10X_1+8X_2+9X_3)
- 제한조건
- 2X_1+3X_2+X_3 <= 1000
- 5X_1+6X_2+6X_3 <= 2400
- X_1+X_2+X_3 <= 700
- X_2 >= 160
- X_2 >= 0
- X_2 >= 0
- 코드
from pulp import *
# sense: LpMaximize or LpMinimize(default)
LP = LpProblem(
name = "LP",
sense = LpMaximize
)
# DEFINE decision variable
# cat: category, "Continuous"(default), "Integer", "Binary"
X1 = LpVariable(
name='A', lowBound=None, upBound=None, cat='Integer'
)
X2 = LpVariable(
name='B', lowBound=None, upBound=None, cat='Integer'
)
X3 = LpVariable(
name='C', lowBound=None, upBound=None, cat='Integer'
)
# OBJECTIVE function
LP.objective = 10*X1 + 8*X2 + 9*X3
print('======= objective =======')
print(LP.objective)
# CONSTRAINTS
constraints = [
2.0 * X1 + 3.0 * X2 + 1.0 * X3 <= 1000,
5.0 * X1 + 6.0 * X2 + 6.0 * X3 <= 2400,
1.0 * X1 + 1.0 * X2 + 1.0 * X3 <= 700,
X2 >= 160,
X1 >= 0,
X3 >= 0
]
print('======= Constraints =======')
for i in constraints:
print(i)
for i, c in enumerate(constraints):
constraint_name = f"const_{i}"
LP.constraints[constraint_name] = c
# SOLVE model
res = LP.solve()
# 결과
print('======= results =======')
for v in LP.variables():
print(f"{v}: {v.varValue}")
print('목표값 :', value(LP.objective))
예시문제 2
- 문제상황
- 제품 A와 제품 B 각각 100개 이상 생산해야 한다.
- 제품 A는 생산하는데 1시간이 걸리고 제품 B는 2시간이 걸린다. 총 시간은 500시간 이내가 걸려야 한다.
- 특정 부품이 제품 A를 생산하는데 4개 필요로 하고 제품 B는 생산하는데 5개 필요로 한다. 총 부품은 9800개다.
- 제품 A의 이익은 하나당 3만원이고 제품 B의 이익은 하나당 5만원이다.
- 목적함수
- max (3A+5B)
- 제한조건
- A >= 1000
- B >= 1000
- A+2*B <= 500
- 4*A + 5*B <= 9800
- 코드
import cvxpy as cp
# 변수의 정의
a = cp.Variable(integer=True) # A의 생산량
b = cp.Variable(integer=True) # B의 생산량
# 목적함수
obj = cp.Maximize(3 * a + 5 * b)
# 제한조건
constraints = [
a >= 100, # A를 100개 이상 생산해야 한다.
b >= 100, # B를 100개 이상 생산해야 한다.
a + 2 * b <= 500, # 500시간 내에 생산해야 한다.
4 * a + 5 * b <= 9800, # 부품이 9800개 밖에 없다.
]
# 학습
prob = cp.Problem(obj, constraints)
prob.solve()
# 결과
print("상태:", prob.status)
print(f"a:{a.value}")
print(f"b:{b.value}")
예시문제 3
- 문제상황
- 제품 A와 제품 B는 용접, 연마공정을 거쳐 생산한다
- 제품 A를 생산하기 위해 용접 4시간, 연마 3시간
- 제품 B를 생산하기 위해 용접 2시간, 연마 5시간이 소요된다
- 설비의 작업가능 시간은 용접 120시간 연마 100시간이다.
- 제품 A의 판매이익은 12만원, 제품 B의 판매이익은 15만원이다.
- 목적함수
- max (12*A+15*B)
- 제한조건
- 4*A+2*B <= 120
- 3*A + 5*B <= 100
- A >= 0
- B >= 0
- 코드
import cvxpy as cp
# 변수의 정의
a = cp.Variable(integer=True) # A의 생산량
b = cp.Variable(integer=True) # B의 생산량
# 목적함수
obj = cp.Maximize(12 * a + 15 * b)
# 제한조건
constraints = [
4 * a + 2 * b <= 120, # 용접시간은 120시간 이하
3 * a + 5 * b <= 100, # 연마시간은 100시간 이하
a >= 0,
b >= 0
]
# 학습
prob = cp.Problem(obj, constraints)
prob.solve()
# 결과
print("상태:", prob.status)
print(f"a:{a.value}")
print(f"b:{b.value}")
반응형