-
최적설계 | 파이썬 기반 선형계획문제 알고리즘 scipy.optimize.linprogEngineering/Optimum Design 2025. 1. 31. 18:00반응형
1. SciPy
SciPy는 파이썬 기반의 오픈소스 패키지로, 최적화를 비롯한 과학기술 계산 문제를 다루는 알고리즘을 제공한다. 파이썬 기반의 연산 패키지인 NumPy와도 호환이 가능해 복잡하게 형식을 정의할 필요가 없어 편리하게 이용할 수 있다. 해당 패키지는 아래 명렁어를 명령 프롬프트에 입력하여 설치할 수 있으며, 아래 링크로 접속하면 SciPy 패키지에 대한 설명을 확인할 수 있다.
pip install scipySciPy 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에는 선형계획문제를 풀기 위한 알고리즘이 포함되어 있다. 해당 알고리즘이 다루는 선형계획문제는 다음과 같은 형식을 가진다. 따라서 해당 패키지를 이용해 선형계획문제를 풀고자 한다면 아래 형식을 따라 문제를 수정할 필요가 있다. 아래 형식에 맞게 환산가격계수 행렬, 부등호제약조건 행렬, 등호제약조건 행렬 numpy.array로 정의하고 설계변수의 범위를 리스트로 정의하여 함수에 차례대로 입력하면 알고리즘에 따라 최적화된 결과를 도출한다.
$$ \begin{align} \mathrm{minimize}~~~~&f = \textbf{c}^T \textbf{x} \\\\ \mathrm{subject~to}~~~~ &\mathbf{A}_{eq} \mathbf{x} = \mathbf{b}_{eq} \\\\ &\mathbf{A}_{ub} \mathbf{x} \leq \mathbf{b}_{ub} \\\\ &l \leq x_i \leq u;~~~~i = 1~~to~~n \end{align}$$
아래 링크로 접속하면 해당 함수에 대한 자세한 설명을 확인할 수 있다.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. 파이썬 라이브러리 설치
SciPy 라이브러리를 원활하게 사용하기 위해서는 몇 가지 라이브러리를 추가로 설치해야 한다. 인터넷에 연결된 상태에서 명령 프롬프트에 아래 명령어들을 하나씩 입력하는 것으로 설치할 수 있다.
pip install numpy4. 예제

선형계획문제 다음 선형계획문제를 최적화 알고리즘을 이용해 최적화해보자.
$$ \begin{align} \mathrm{maximize}~~~~&z = 2y_1 + 5y_2 \\\\ \mathrm{subject~to}~~~~&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 \\\\ \mathrm{subject~to}~~~~&3y_1 + 2y_2 \leq 12 \\\\ &-2y_1 - 3y_2 \leq -6 \\\\ &y_1 \geq 0 \end{align}$$
위 선형계획문제를 행렬식으로 나타내면 다음과 같다.
$$ \begin{align} \mathrm{minimize}~~~~&f = \mathbf{c}^T\mathbf{x} \\\\ \mathrm{subject~to}~~~~&\mathbf{A}_{ub} \mathbf{x} \leq \mathbf{b}_{ub} \end{align}$$$$ \begin{align} &\mathbf{c} = \begin{bmatrix} -2 & -5 \\ \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}$$# 라이브러리 추가 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
파이썬이란?
1. 프로그래밍 언어 컴퓨터가 작업을 수행하기 위해서는 논리적인 순서에 맞게 명령문이 나열된 작업지시서를 사람으로부터 전달 받아야 한다. 하지만 컴퓨터는 0과 1로 구성된 기계어(machine
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.03.21 최적설계 | 비제약조건 문제 수치해법(1): 최속강하법 (0) 2025.03.14 최적설계 | 심플렉스법(2) (0) 2025.01.24 최적설계 | 심플렉스법(1) (0) 2025.01.17 최적설계 | 선형계획법 (1) 2025.01.10