-
최적설계 | 파이썬 기반 선형계획문제 알고리즘 scipy.optimize.linprogEngineering/Optimum Design 2025. 1. 31. 18:00
1. SciPy 패키지
SciPy는 파이썬 기반의 오픈소스 패키지로, 최적화를 비롯하여 적분, 보간, 미분방정식 등의 과학기술 계산 문제를 다루기 위한 다양한 알고리즘을 제공한다. 파이썬 기반의 연산 패키지인 NumPy와도 호환이 가능해 복잡하게 형식을 정의할 필요가 없어 편리하게 이용할 수 있다. 해당 라이브러리는 아래 명렁어를 명령 프롬프트에 입력하여 설치할 수 있으며, 아래 링크로 접속하면 SciPy 라이브러리에 대한 설명을 확인할 수 있다.
pip install scipy
SciPy User Guide — SciPy v1.15.1 Manual
SciPy User Guide SciPy is a collection of mathematical algorithms and convenience functions built on NumPy . It adds significant power to Python by providing the user with high-level commands and classes for manipulating and visualizing data. Subpackages a
docs.scipy.org
2. scipy.optimization.linprog 함수
SciPy에서 지원하는 최적화 알고리즘 라이브러리 scipy.optimization 중에는 선형계획문제를 풀기 위한 알고리즘이 포함되어 있다. 해당 알고리즘이 다루는 선형계획문제는 다음과 같은 형식을 가진다. 따라서 해당 라이브러리를 이용해 선형계획문제를 풀고자 한다면 해당 형식을 따라 선형계획문제를 수정할 필요가 있다.
$$ \begin{align} \mathrm{minimize}~~~~f = \textbf{c}^T \textbf{x} \end{align}$$$$ \begin{align} \textbf{A}_{ub} \textbf{x} \leq \textbf{b}_{ub} \\\\ \textbf{A}_{eq} \textbf{x} = \textbf{b}_{eq} \\\\ l \leq x_i \leq u;~~~~i = 1~~&to~~5\\\\ \end{align}$$
위 형식에 맞게 환산가격계수 행렬, 부등호제약조건 행렬, 등호제약조건 행렬을 numpy.array로 정의하고 설계변수의 범위를 리스트로 정의하여 함수에 차례대로 입력하면 알고리즘에 따라 최적화된 결과를 도출한다. 아래 링크로 접속하면 해당 함수에 해당 함수에 대한 자세한 설명을 확인할 수 있다.linprog — SciPy v1.15.1 Manual
Consider the following problem: \[\begin{split}\min_{x_0, x_1} \ -x_0 + 4x_1 & \\ \mbox{such that} \ -3x_0 + x_1 & \leq 6,\\ -x_0 - 2x_1 & \geq -4,\\ x_1 & \geq -3.\end{split}\] The problem is not presented in the form accepted by linprog. This is easily r
docs.scipy.org
3. 예제
3.1. 선형계획문제 정의
선형계획문제 다음 선형계획문제를 최적화 알고리즘을 이용해 최적화해보자.
$$ \begin{align} \mathrm{maximize}~~~~z = 2y_1 + 5y_2 \end{align}$$$$ \begin{align} 3y_1 + 2y_2 &\leq 12 \\\\ 2y_1 + 3y_2 &\geq 6 \\\\ y_1 &\geq 0 \end{align}$$
알고리즘에서 요구하는 형식에 맞게 위 선형계획문제를 바꾸어 나타내면 다음과 같다.
$$ \begin{align} \mathrm{minimize}~~~~f = -2y_1 + -5y_2 \end{align}$$$$ \begin{align} 3y_1 + 2y_2 &\leq 12 \\\\ -2y_1 - 3y_2 &\leq -6 \\\\ 0 &\leq y_1 \end{align}$$
위 선형계획문제를 행렬식으로 나타내면 다음과 같다.
$$ \begin{align} \mathrm{minimize}~~~~f = \mathbf{c}^T\mathbf{x} \end{align}$$$$ \begin{align} \mathbf{A}_{ub}\mathbf{x} \leq \mathbf{b}_{ub} \end{align}$$$$ \begin{align} \mathbf{c} = \begin{bmatrix} -2 & -5 \\ \end{bmatrix}^T,&~~~~ \mathbf{x} = \begin{bmatrix} y_1 & y_2 \\ \end{bmatrix}^T, \\\\ \mathbf{A}_{ub} = \begin{bmatrix} 3 & 2 \\ -2 & -3 \\ \end{bmatrix},&~~~~ \mathbf{b}_{ub} = \begin{bmatrix} 12 & -6 \\ \end{bmatrix}^T \end{align}$$3.2. 프로그램 작성
# 라이브러리 추가 import numpy as np from scipy.optimize import linprog # 선형계획문제 환산가격계수 행렬 정의 c = np.array([-2.0, -5.0]) # 선형계획문제 부등호제약조건 행렬 정의 A_ub = np.array([[3.0, 2.0], [-2.0, -3.0]]) b_ub = np.array([12.0, -6.0]) # 선형계획문제 등호제약조건 행렬 정의 A_eq = None b_eq = None # 설계변수 범위 리스트 정의 y0_bounds = (0, None) y1_bounds = (None, None) bounds = [y0_bounds, y1_bounds] # 선형계획문제 최적화 알고리즘 result = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds) # 선형계획문제 최적 결과 출력 print(result.message) print(result.x) print(result.fun)
[함께 읽으면 좋은 페이지]
최적설계 | 선형계획법
1. 선형계획법 목적함수와 제약함수가 설계변수에 대하여 선형함수인 최적설계문제를 선형계획문제(linear programming problem)라고 한다. 선형계획문제의 모든 목적함수 또는 가격함수(cost function)
vedacube.tistory.com
참고문헌
- SciPy. (n.d.). Optimization (scipy.optimize). https://docs.scipy.org/doc/scipy/tutorial/optimize.html#linear-programming-linprog. 2025.01.18.
- SciPy. (n.d.). scipy.optimize.linprog. https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html#scipy.optimize.linprog/ 2025.01.18.반응형'Engineering > Optimum Design' 카테고리의 다른 글
최적설계 | 심플렉스법(2) (0) 2025.01.24 최적설계 | 심플렉스법(1) (0) 2025.01.17 최적설계 | 선형계획법 (0) 2025.01.10 최적설계 | 카루시-쿤-터커 KKT 최적성 조건(2) (0) 2024.10.18 최적설계 | 카루시-쿤-터커 KKT 최적성 조건(1) (0) 2024.10.11