데이터분석/통계

파이썬 선형계획법 해찾기

씩씩한 IT블로그 2022. 9. 10. 19:49
반응형

파이썬 선형계획법

파이썬을 이용하여 선형계획법 문제를 해결한다.

 

예시문제 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}")
반응형