본문 바로가기

IT_gams

GAMS grammar_basic

GAMS 설치도 했고, 라이센스도 했고, 간단한 예제도 봤으니기본적인 문법을 알아보자.

목차

  1. 풀어볼 문제 정의
  2. GAMS 문법 쪼끔 + 코드 작성
  3. 해석

 

  1. 문제 정의

최적화할 문제 예시(데충 생각하고 너무 엄격하게 해석하진 말자.)

------------------------------------------------------------------------------

맥주공장에서 하이트랑 라거 만드는데, 하이트의 이윤은 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. 결과 해석

GAMS 실행 결과 창

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