線形計画法における Python の応用

Pythonの学習

从入门学习到机器学习、从简单绘制折线图到随机绘制各种图,附往期目录:

Python を使い始めるための基礎知識
Python は単純な折れ線グラフを描画します
Python は Excel でデータを読み取り、複数のサブグラフと複数のグラフ グループを 1 つのキャンバスに描画します Python は
エラーバー付きのヒストグラムを描画します Python は
複数のサブグラフを描画し、それらを個別に表示します
Python は Excel データを読み込みますPython を使用して複数の Y 軸イメージを描画し
、Word 文書のフォント、段落間隔、書式設定をバッチ調整します。
Python はエラーバー付きのヒストグラムを描画します。


从本篇博文开始,开启学习一些优化算法和求解方法


線形計画法の定義

提示:这里可以添加本文要记录的大概内容:

線形計画法 (LP) は、工業生産組織管理の意思決定問題に由来します。数学的には、変数が線形制約を満たす場合に、多変数線形関数の最適値を決定するために使用されます。モデルは通常、次の 3 つの要素で構成されます。決定変数、目的関数、および制約。


线性规划的一般模型:
最大 (最小) z = ∑ j = 1 ncixi ; 最大(最小) z = \sum_{j=1}^{n} c_{i}x_{i};最大(最小) z _=j = 1c私はバツ私は;

s 。と。{ ∑ j = 1 naijxj ≤ ( ≥ , = ) bi , i = 1 , 2 , 3 , 4 , ⋅ ⋅ ⋅ , m xj > 0 , j = 1 , 2 , 3 , 4 , ⋅ ⋅ ⋅ , n st \ begin{cases} \sum\limits_{j=1}^na_{ij}x_{j}≤(≥,=)b_{i}, & i=1,2,3,4,...,m \ \\\\ \ x_{j}>0,& j=1,2,3,4,...,n \\ \end{cases}s j = 1あるイジバツj( = ) b私は  バツj>0=1 2 3 4 、⋅⋅⋅、メートルj=1 2 3 4 、⋅⋅⋅、
モデルに基づいて、線形計画法の目的関数は最大化問題または最小化問題になる可能性があり、制約には「≥」、「≤」、および「=」の場合もあります。

1. 線形計画法の解決策

線形計画問題に最適解がある場合、その値は実現可能領域のある頂点で求められる必要があり、一意の解が存在する場合、最適解は実現可能領域のある頂点となる。最適解が無限に存在する場合、そのうちの少なくとも 1 つは実現可能領域の頂点になります。

2. 線形計画法に対する Python ソリューション

SciPy の scipy.optimize モジュールは、線形計画法を解くための関数 linprog を提供します。この関数は、シンプレックス法や内点法などの線形計画法を解くための一般的なアルゴリズムに焦点を当てています。問題の規模や問題に応じて問題を解決します。ユーザーが指定した選択アルゴリズム。

1. ライブラリをインポートする

from scipy.optimize import linprog

2. SciPy における線形計画法の標準形式

最小z = c T x ; 最小 \ z = c^{T} x;最小 =cTx ;_

s 。と。{ A ⋅ x ≤ b A eq ⋅ x = beq L b ≤ U b st \begin{cases} \ A·x≤b \\ Aeq·x=beq \\ \ L_{b}≤U_{b} \\ \end{ケース}s  バツbA e q バツ=ベク_ _ LbUb
このうち、c は上記の標準型のターゲット ベクトルに対応し、
A と b は不等式制約に対応し、Aeq と beq は等号制約に対応し、
bounds は下限ベクトルと下限ベクトルから構成される n 要素のタプルです。決定ベクトルの上限ベクトル。デフォルトの下限は 0、上限は ∞ です。
戻り値 res.x は得られた最適解、res.fun は目的関数の最適値です。
対応する関数呼び出しモード:

#linprog的基本调用格式为:
from scipy.optimize import linprog
res=linprog(c, A, b, Aeq, beq)  #默认每个决策变量下界为0,上界为 
res=linprog(c, A=None, b=None, Aeq=None, beq=None, bounds=None, method='simplex') 
print(res.fun)   #显示目标函数最小值
print(res.x)     #显示最优解

3. トレーニングケース 1

最小 z = − x 1 + 4 x 2 ; 最小 \ z = -x_{1}+4x_{2};最小 =×1+4x _2;
s 。と。{ − 3 x 1 + x 2 ≤ 6 x 1 + 2 x 2 ≤ 4 x 2 ≥ − 3 番目 \begin{cases} \ -3x_{1}+x_{2} ≤6 \\ x_{1}+2x_ {2} ≤4 \\ \ x_{2}≥-3 \\ \end{件}s  3x _1+バツ26バツ1+2倍_24 バツ2 3

コードは次のとおりです(例)。

from scipy.optimize import linprog
c = [-1, 4]; 
A = [[-3, 1], [1, 2]]
b = [6, 4]; 
#bounds是决策向量的下界向量和上界向量所组成的 n个元素的元组bounds的默认取值下界都是0,上界都是∞ 
bound=((None,None),(-3,None))

res=linprog(c,A,b,None,None,bound)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)
#运行结果: 目标函数的最小值: -22.0
# 最优解为: [10. -3.]

4. 研修事例2

最大 z = x 1 − 2 x 2 − 3 x 3 ; max\ z = x_{1}-2x_{2}-3x_{3};× =バツ12倍_23x _3;
s 。と。{ − 2 x 1 + x 2 + x 3 ≤ 9 − 3 x 1 + x 2 + 2 x 3 ≥ 4 4 x 1 − 2 x 2 x 3 = − 6 x 1 ≥ − 10 , x 2 ≥ 0 st \ begin{件} \ -2x_{1}+x_{2} +x_{3} ≤9 \\ -3x_{1}+x_{2} +2x_{3} ≥4\\ 4x_{1}-2x_{ 2} x_{3}=-6\\ \ x_{1}≥-10、x_{2}≥0\\ \end{件}s  2 ×1+バツ2+バツ393x _1+バツ2+2倍_344x _12倍_2バツ3=6 バツ110 バツ20

4.1 解決プロセス

(1) まず、 SciPy の標準形式
min z = − x 1 + 2 x 2 + 3 x 3 ; min\ z = -x_{1}+2x_{2}+3x_{3}; に変換します。最小 =×1+2倍_2+3x _3;
s 。と。{ − 2 x 1 + x 2 + x 3 ≤ 9 3 x 1 − x 2 − 2 x 3 ≤ − 4 4 x 1 − 2 x 2 x 3 = − 6 x 1 ≥ − 10 , x 2 ≥ 0 st \ begin{件} \ -2x_{1}+x_{2} +x_{3} ≤9 \\ 3x_{1}-x_{2} -2x_{3} ≤-4\\ 4x_{1}-2x_{ 2} x_{3}=-6\\ \ x_{1}≥-10、x_{2}≥0\\ \end{件}s  2 ×1+バツ2+バツ393x _1バツ22倍_344x _12倍_2バツ3=6 バツ110 バツ20

from scipy.optimize import linprog
c=[-1, 2, 3]; 

A = [[-2, 1, 1], [3, -1, -2]]
b=[[9], [-4]]

Aeq=[[4, -2, -1]]
beq=[-6]
LB=[-10, 0, None]

UB=[None]*len(c)  #生成3个None的列表
bound = tuple(zip(LB, UB))   #生成决策向量界限的元组
res=linprog(c,A,b,Aeq,beq,bound)
print("目标函数的最小值:",res.fun)
print("最优解为:",res.x)

# 求解结果:目标函数的最小值: 0.399999999999999
# 最优解为: [-1.6  0.  -0.4]

おすすめ

転載: blog.csdn.net/m0_58857684/article/details/130649850