GAMS 설치도 했고, 라이센스도 했고, 간단한 예제도 해 봤으니기본적인 문법을 좀 알아보자.
목차
- 풀어볼 문제 정의
- GAMS 문법 쪼끔 + 코드 작성
- 해석 및 팁
- 문제 정의
최적화할 문제 예시(데충 생각하고 너무 엄격하게 해석하진 말자.)
------------------------------------------------------------------------------
맥주공장에서 하이트랑 라거 를 둘 다 만드는데, 하이트의 이윤은 1, 라거의 이윤은 2 이다.
맥주 만드는데 드는 재료는 재료1, 재료2 가 들어가고,
하이트든 라거든 들어가는 노동력은 동일하며, 총 노동력은 500이하이다.
재료 1의 재고는 1000 이고, 하이트에는 10, 라거에는 3 이 들어간다.
재료 2의 재고는 2000 이고, 하이트에는 20, 라거에는 12 이 들어간다.
최대 이윤을 남기기 위해 맥주를 생산하려면 어떻게 해야하나?
------------------------------------------------------------------------------
라는 문제를 수식으로 바꿔 보면,
하이트: W, 라거:L, 재료1: malt capa, 재료2: hop capa, 노동력: labor capa,
Max,
1W + 2L ( 남는 이윤 )
Subject to (S.T)
10W +3L <= 1000 (malt capa)
20W + 12L <= 2000 (hop capa)
W + L <= 500 (labor capa)
로 생각할 수 있는데, 좀만 더 생각해 보면, 아래의 조건도 만들 수 있다.
W, L>=0 , W,L is integer.
------------------------------------------------------------------------------
2. GAMS code 작성
이번 단계는 GAMS code 로 짜보자. GAMS code 의 기본 구성은 아래와 같다.
선언과 정의로 변수를 사용하면 되고, 문단(문장)이 끝나는 지점에 ' ; ' 세미콜론으로 문단이 여기까지 이다 를 표현 해 주면 된다.
우리가 눈으로 볼때야 줄 바꿈이 있어서 문단이라 표현했지만, 컴퓨터 입장에서는 탭이나 스페이스 는 연속된 표현으로 보기 때문에 문장이라고 생각해도 된다..
이와 같은 구성을 코드로 표현해 보면, (새로운 파일/프로젝트 만들기는 이전 내용 참고.)
variables
W "number of bootles of white"
L "number of bootles of Larger"
total_amount;
integer variables
W, L;
free variables
total_amount;
equations
max_obj "total amount"
malt_capa "malt capacity"
hop_capa "hop capacity"
labor_capa "labor capacity";
* donot forget this seli-colon
max_obj.. total_amount =e= 1*W + 2*L;
malt_capa.. 10*W + 3*L =l=1000;
hop_capa.. 20*W + 12*L =l=2000;
labor_capa.. W + L =l=500;
model
BEAR_OPT /all/;
solve
BEAR_OPT using mip maximize total_amount;
display
total_amount.l, W.l, L.l ;
-------------------------------------------------------------------------------------
우리가 문제정의하여 풀고 싶은 model 은 total_amount 라는 Max, 1W + 2L ( 이윤의 합 ) 부분이다.
이렇게 풀고 싶은 변수를 free variable 이라는 변수타입으로 선언을 해주었다.
max_obj 라는 식의 정의를 total_amount = 1*W + 2*L 로 하겠다는 의미로
max_obj.. Total_amount =e= 1*W + 2*L
라고 코드로 바꾼 부분이다.
코드상의 나머지 equation 부분들도 마찬가지임.
-------------------------------------------------------------------------------------
"이윤이 많이 남도록 맥주 생산량을 잘 설정 하고 싶은게 목적이고, 이런 저런 조건들(subject to) 에 맞게 해야 하는 것이 제약사항들인데
이런한 것들을 일종의 BEAR_OPT 라는 model 이라고 하겠다"
라는 표현이 model 부분이다.
-------------------------------------------------------------------------------------
BEAR_OPT 라는 모델을 mip maximize 방법을 사용하여 total_amount 를 구해 주시고
Total_amount 의 값과 화이트 병의 개수, 라거병의 개수를 보여주세요!
라는 의미가 solve, display 이다.
-------------------------------------------------------------------------------------
3. 결과 해석
F9, RUN 을 누르면 실행이 되고 에러 없이 잘 돌아가면 process log 창에 뭔가 있어보이는 결과들이 나타난다.
실제로 우리가 관심있는 값들은 파일이름.lst 파일이 자동 생성되면서 저장된다.
Point 1.
Display 해달라고 했던 total_amount.l, W.l, L.l 값들이 구해져 있다.
' .l ' 의 의미
variable 과 equation 항목에는 범위를 설정할 수 있다.
.lo : 하한치
.l : level (final value)
.up : 상한치
.m : marginal value ( 잘 모르겠음. 공학에서는 비율로 정의 되는 값의 의미였던것 같은데…. 찾아봐야겠다.)
코드에서 변수 선언시, W, L 은 positive integer, total_amount 는 free variable 로 정의 했었는데,
그 결과W, L 의 lovwer bound 는 0, total_amount 는 -infinite 로 해석 된 것도 확인 할 수 있다.
Point 2.
이전 블로그의 예제 코드들을 보면 using lp maximize 로 했던 반면,
이번 코드에서는 using mip maximize 로 풀었다.
lp : linear programmingnlp: non-linear programming
mip: mixed-integer programming
minlp: mixed interger nonlinear programming
요정도 범위외에 더 있지만 어려워서 거기까진 안들어 갈 듯 하다.
데충 키워드로 개념 정리만 해 두면
Continuous(연속적이냐?) --> 끊어지지 않고 쭉이어져 있는가!?
미분가능 하느냐 ? --> 연속적인 애가 부드럽게 이어져 있는가?!?
선형성 --> f(x+y) = f(x) + f(y) , f(a*x) = a*f(x) 가 성립 할때. //constant weighted sum.
Linear prigramming : real variable, linear objective function and constraints
Integer programming: some or all variables must take integer values, linear onjective function and constraints.
결국 하고싶은 말은, 위의 코드중 mip 를 lp 로 바꾸면 안돌아 간다.
왜냐….. decision variable 이 integer 이기 때문이다.
정리 해 놓으니 별거없는데 어려웠음...
(ref. (44살에 떠난) 미국 금융공학 유학 )
'IT_gams' 카테고리의 다른 글
GAMS_grammar_exercise (0) | 2020.05.27 |
---|---|
GAMS grammer_basic2 (0) | 2020.05.27 |
Gams_tutorial_linear program_LP_model_ex1 (0) | 2020.05.22 |
GAMS tutorial - example_0 (0) | 2020.05.18 |
GAMS Install / License (1) | 2020.05.18 |