python/python
python 에서 LpProblem와 LpVariable를 활용하여 네트워크 문제 해결하기
jin0choi1216
2021. 7. 13. 20:13
LpProblem¶
: 우리가 해결하고자 하는 문자의 종류와 이름을 정한다.
https://coin-or.github.io/pulp/technical/pulp.html
- LpProblem(문제이름, 문제의 종류) => 최댓값을 구해야하는가?, 최솟값을 구해야하는가?
- LpProblem(name='NoName', LpMinimize or LpMaximize)
In [34]:
# example
prob = LpProblem("problumName",LpMinimize)
prob
Out[34]:
problumName: MINIMIZE None VARIABLES
LpVariable¶
: 변수의 범위, 이름, 유형을 정한다.
https://www.coin-or.org/PuLP/pulp.html
- lowBound : 하한선, upBound : 상한선 (None 은 무한대를 의미)
- cat : Integer, Binary or Continuous(default)
In [17]:
# LpVariable 함수를 이용해서 사용할 x1,x2 변수의 이름, 상하한, 데이터 유형 지정
x1 = LpVariable ( "varialbe1" , lowBound = 0, upBound = None ,cat = 'Integer' )
x2 = LpVariable ( "varialbe2" , lowBound = -5 , upBound = 5 ,cat = 'Continuous' )
목적함수, 제약함수¶
- '==' , '>' 와 같이 부등호나 비교의 형태인 경우는 제약조건
- = 와 같이 등호가 들어가는 경우에는 목적함수
In [35]:
prob += 0.013*x1 + 0.008*x2, "목적함수"
In [36]:
prob
Out[36]:
problumName: MINIMIZE 0.013*varialbe1 + 0.008*varialbe2 + 0.0 VARIABLES 0 <= varialbe1 Integer -5 <= varialbe2 <= 5 Continuous
In [37]:
# 제약조건을 적어 줍시다
prob += x1 + x2 == 100, "제약조건1"
prob += 0.100*x1 + 0.200*x2 >= 8.0, "제약조건2"
prob += 0.080*x1 + 0.100*x2 >= 6.0, "제약조건3"
prob += 0.001*x1 + 0.005*x2 <= 2.0, "제약조건4"
prob += 0.002*x1 + 0.005*x2 <= 0.4, "제약조건5"
In [38]:
prob
Out[38]:
problumName: MINIMIZE 0.013*varialbe1 + 0.008*varialbe2 + 0.0 SUBJECT TO 제약조건1: varialbe1 + varialbe2 = 100 제약조건2: 0.1 varialbe1 + 0.2 varialbe2 >= 8 제약조건3: 0.08 varialbe1 + 0.1 varialbe2 >= 6 제약조건4: 0.001 varialbe1 + 0.005 varialbe2 <= 2 제약조건5: 0.002 varialbe1 + 0.005 varialbe2 <= 0.4 VARIABLES 0 <= varialbe1 Integer -5 <= varialbe2 <= 5 Continuous
In [39]:
# lp파일을 저장하는 코드
prob.writeLP("WhiskasModel.lp")
# 최적해를 계산합니다.
prob.solve()
# 최적해 구하기
for v in prob.variables():
print(v.name, "=", v.varValue)
# 최적 생산량으로 생산할 때 드는 비용
print("Total Cost of Ingredients per can = ", value(prob.objective))
varialbe1 = 95.0 varialbe2 = 5.0 Total Cost of Ingredients per can = 1.275