1. AMPL

개요

AMPL (A Mathematical Programming Language)은 수리 계획 문제를 모델링하고 해결하기 위한 고급 모델링 언어로 설계되었다. 수리적 최적화 문제를 구조화하고 정의하는 데 사용되며, 다양한 최적화 엔진과 쉽게 연동될 수 있다.

특징

모델 구조

AMPL은 세 가지 주요 구성 요소로 문제를 정의한다. 1. 변수: 목적 함수와 제약 조건에서 사용되는 변수들. 2. 목적 함수: 최소화 또는 최대화할 함수. 3. 제약 조건: 문제의 제한 사항을 정의.

예를 들어, 다음과 같은 선형 계획 문제를 생각해보자.

\text{maximize} \quad z = 3x_1 + 2x_2
\text{subject to} \quad 2x_1 + x_2 \leq 100
x_1 + 3x_2 \leq 90
x_1, x_2 \geq 0

이 문제는 AMPL에서 다음과 같이 표현된다.

param a1 := 2;
param a2 := 1;
param b1 := 1;
param b2 := 3;
param c1 := 100;
param c2 := 90;

var x1 >= 0;
var x2 >= 0;

maximize obj: 3 * x1 + 2 * x2;

subject to constraint1: a1 * x1 + a2 * x2 <= c1;
subject to constraint2: b1 * x1 + b2 * x2 <= c2;

위 코드는 각 매개변수와 제약 조건을 수학적으로 정의한 형태이다. AMPL은 이러한 형식으로 문제를 구조화하여 Solver에 전달한다.

장점

단점

2. GAMS

개요

GAMS (General Algebraic Modeling System)는 수학적 최적화 문제를 정의하고 해결하는 시스템으로, AMPL과 유사하게 수리 계획 및 최적화 문제를 모델링한다.

특징

모델 구조

GAMS의 기본 구조는 다음과 같다. 1. 셋(set): 모델에 사용되는 변수들의 집합. 2. 파라미터(parameter): 상수 값을 나타내며, 모델에서 변하지 않는 값을 정의. 3. 변수(variable): 최적화 대상이 되는 값. 4. 방정식(equation): 목적 함수와 제약 조건을 나타냄.

예를 들어, 다음 선형 계획 문제는 GAMS에서 다음과 같이 모델링할 수 있다.

Sets
    i /1*2/;

Parameters
    a(i) /1 2, 2 1/
    b(i) /1 100, 2 90/
    c(i) /1 3, 2 2/;

Variables
    x(i), z;

Equations
    obj, constraint1, constraint2;

obj .. z =e= sum(i, c(i) * x(i));
constraint1 .. sum(i, a(i) * x(i)) =l= b('1');
constraint2 .. sum(i, b(i) * x(i)) =l= b('2');

Model lp /all/;
Solve lp using lp maximizing z;

위의 GAMS 코드는 모델 구성 요소들을 정의한 후, 최적화 모델을 선언하고 문제를 푸는 방식이다.

장점

단점

3. CPLEX

개요

CPLEX는 IBM에서 개발한 상용 최적화 Solver로, 특히 선형 계획(Linear Programming), 혼합 정수 계획(Mixed Integer Programming), 제약 만족 문제(Constraint Satisfaction Problem) 등 다양한 수학적 최적화 문제를 해결하는 데 널리 사용된다. AMPL이나 GAMS 같은 모델링 언어와 연동하여 사용할 수 있다.

특징

모델 구조

CPLEX 자체적으로 모델을 정의하는 것이 아닌, AMPL 또는 GAMS와 같은 모델링 언어를 통해 입력받거나, API를 통해 직접 모델을 입력받아 최적화 문제를 해결한다. 예를 들어 Python을 통해 간단한 선형 계획 문제를 해결하는 코드를 보자.

from cplex import Cplex

problem = Cplex()
problem.variables.add(names=["x1", "x2"])
problem.objective.set_sense(problem.objective.sense.maximize)
problem.objective.set_linear([("x1", 3), ("x2", 2)])

constraints = [[[0, 1], [2, 1]],  # 2x1 + x2 <= 100
               [[0, 1], [1, 3]]]  # x1 + 3x2 <= 90
rhs = [100, 90]
senses = "LL"
problem.linear_constraints.add(lin_expr=constraints, senses=senses, rhs=rhs)

problem.solve()
print("Solution: ", problem.solution.get_values())

이 코드는 Python API를 사용하여 간단한 선형 계획 문제를 CPLEX로 해결하는 예이다. AMPL이나 GAMS와 다르게 CPLEX는 API를 통해 프로그래밍 언어에서 직접 문제를 정의하고 풀 수 있는 장점을 제공한다.

장점

단점

4. Gurobi

개요

Gurobi는 CPLEX와 유사한 상용 최적화 Solver로, 선형 계획(Linear Programming), 혼합 정수 계획(Mixed Integer Programming), 비선형 계획(Nonlinear Programming) 등 다양한 최적화 문제를 매우 빠르게 해결하는 Solver 중 하나이다. 여러 모델링 언어와 연동 가능하며, CPLEX처럼 API를 통해 문제를 정의할 수 있다.

특징

모델 구조

Gurobi 또한 AMPL이나 GAMS 같은 모델링 언어와 연동 가능하지만, Python과 같은 프로그래밍 언어를 통해 직접 문제를 정의할 수 있다. 다음은 Gurobi Python API를 사용하여 선형 계획 문제를 해결하는 간단한 예이다.

from gurobipy import Model, GRB

# 모델 생성
m = Model("lp")

# 변수 추가
x1 = m.addVar(lb=0, name="x1")
x2 = m.addVar(lb=0, name="x2")

# 목적 함수 설정
m.setObjective(3*x1 + 2*x2, GRB.MAXIMIZE)

# 제약 조건 추가
m.addConstr(2*x1 + x2 <= 100, "c0")
m.addConstr(x1 + 3*x2 <= 90, "c1")

# 최적화 실행
m.optimize()

# 해 출력
for v in m.getVars():
    print(f"{v.varName}: {v.x}")

이 코드는 Gurobi를 사용하여 선형 계획 문제를 해결하는 Python 코드이다. Gurobi는 API를 통해 문제를 정의하고 해결할 수 있는 유연성을 제공하며, 성능이 뛰어나다.

장점

단점