Python データ分析入門 -- 線形計画法と非線形計画法の学習ノート


1. 線形計画法の概要

ここに画像の説明を挿入

線形計画法は、オペレーションズ リサーチにおける数学的計画法の重要な分野です。GB Dantzig が 1947 年に線形計画法を解くためのシンプレックス法を提案して以来、線形計画法は理論的には成熟しましたが、実際には、コンピューターは数千の制約と決定変数を持つ線形計画法問題を処理できるため、線形計画法は基本的な手法の 1 つとして頻繁に使用されます。現代の経営に使われています。実際の問題を解く際には、問題を線形計画法数学モデルに還元する必要がありますが、重要かつ難しい点は、適切な決定変数を選択して、問題の解決に直接影響する適切なモデルを構築することです。

第二に、線形計画法の一般的な解法

ここに画像の説明を挿入

シンプレックス法は、線形計画問題を解決するために最も一般的に使用され、効率的なアルゴリズムの 1 つです。線形計画問題の制約を満たすすべての点の集合が線形計画法の実行可能領域です。シンプレックス法の基本的な考え方は、線形計画法の実行可能領域の特定の頂点から開始して、目的関数の値が減少する方向に沿って次の頂点を選択する場合、表面頂点の数は制限されているため、この線形プログラムに最適解がある限り、有限回の反復後に最適解を取得する必要があります。 。

反復法を使用して線形計画法の最適解を見つけるには、次の 3 つの問題を解決する必要があります。

最適解の基準、つまり反復終了の基準

基本変更操作、つまり、1 つの基本的な実行可能解から別の基本的な実行可能解へ反復する方法

ベース列の選択、つまりベース変更操作を実行するための適切な列の選択により、目的関数の値が大幅に低下する可能性があります。

簡単に説明すると、標準化一次方程式に基づいて単体表を作成し、行列変換処理を行った後、検査値が正であるか負であるかを判定します。すべての検査値が 0 以下であれば、このとき得られた解が最適解であり、それ以外の場合は最適解ではない。それが最適解ではない場合は、新しい基本変数を再度選択し、すべてのテスト数値が 0 以下になるまで反復する必要があります。

数学的導出については、このブログを参照してください

3. 線形計画法の実装プロセス

1. 問題と変数を特定する

線形計画法で解ける問題を得るには、まず決定変数、目的関数、制約などの線形計画法のいくつかの主要な要素を明確にする必要があります。特に条件や問題が多い場合、明確な因子を実行しないことが容易になります。分析エラー。以下は投資と最大収益に問題があることを前提としています

ここに画像の説明を挿入

ここに画像の説明を挿入

上記の問題に対して、私たちの目的関数は収益を最大化し、全体的なリスクを最小化することです。特定の投資資産の場合、総収益は各資産の投資金額、収益率、手数料率と総リスクに依存します。各資産への投資金額、投資資産の種類数、損失率によって異なります。しかし、モデルのニーズを単純化するために、総リスクの最小化をさまざまな人々のグループの最小リスク率、つまりグループが許容できる最大損失に変換することができます。

各投資の収益率、費用率、損失率は固定されているため、決定変数は主に各資産の投資額となり、目的関数も換算して制約条件に変換します。投資総額が一定値であり、各投資額がプラスであり、リスク率の合計が一定値より低いこと

2. 数学的モデルを構築する

総収益関数がQQであると仮定します。Q、各プロジェクトに投資された資金はX i X_{i}バツ私は、各アイテムの平均収益率はri r_{i} です。r私は、各プロジェクトの平均リスク損失率qi q_{i}q私は、各アイテムのレートはpi p_{i}です。p私は、モデルにおける私たちの仮定は、投資額MMを説明できるということです。M 远大于 u i u_{i} あなた私は分類の議論を避けるために、目的関数の式は次のとおりです。

max ⁡ Q = max ⁡ ∑ i = 0 4 ( ri − pi ) X i \max Q = \max \sum_{i=0}^4 (r_{i} - p_{i}) X_{i}最大Q=最大i = 04( r私はp私は) ×私は

以下は、プロジェクトの種類ごとの平均損失率と投資額の積、および総投資額の比率によって最小リスク率が測定される、いくつかの制約の数式です。

qi X i M <= a 、a は特定の最小リスク率 \frac{q_{i} X_{i}}{M} <= a、a は特定の最小リスク率Mq私はバツ私は<=a aは特定の最小リスク率
∑ i = 0 4 ( 1 + pi ) X i = M \sum_{i=0}^4(1+p_{i}) X_{i} = Mi = 04( 1+p私は) ×私は=M
X i > = 0 、 i = 0 、 1 、 2 、 3 、 4 X_{i} >= 0 、 i=0,1,2,3,4バツ私は>=0 =0 1 2 3 4

上記は単純化した数学モデルです。総リスクを最小化するためにモデルが単純化されていない場合、目的関数換算リスク率が特定の値未満の場合、式 min ⁡ ( max ⁡ 1 < = i < =) を解く必要があります。 4 ( qi X i ) ) \min{(\max_{1<=i<=4} (q_{i} X_{i}))}(最大1 <= i <= 4( q私はバツ私は))、この目的関数の解は明らかに非常に複雑です

4 番目に、Python は線形計画法を実装します。

Python を使用して線形プログラミングを実装するには、numpy ライブラリと scipy ライブラリを使用し、データ視覚化に matplotlib を使用する必要があります。その中で, scipy ライブラリは最適化モジュールをインポートする必要があります. 線形計画法ソリューションはこのモジュールの linprog 関数を通じて実現されます. linprog 関数にはいくつかのパラメータが必要です: 目的関数, 不等式係数行列, 等係数行列, 決定変数範囲など., linprog はデフォルトで最小値を見つけるため、負の係数行列を取得して最大値の負の数を見つけ、負の符号を追加する必要があります。コードは以下に示されています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import optimize

#构建关于收益率、费率、损失率的矩阵
r_i = np.array([0.05,0.28,0.21,0.23,0.25])
q_i = np.array([0.00,0.025,0.015,0.055,0.026])
p_i = np.array([0.00,0.01,0.02,0.045,0.065])
beq = np.array([10000])
data = np.zeros(50)

#构建等式和不等式的系数矩阵
arr1 = r_i - p_i
aeq = (p_i + 1).reshape(1,5)
arr3 = np.zeros(20).reshape(4,5)
for i in range(1,5):
    arr3[i-1][i] = q_i[i]/beq

arr4 = np.zeros(4).reshape(1,4)

print(arr1)
print('\n')
print(aeq)
print('\n')
print(arr3)
print('\n')

#针对不同风险率求其最优解
for i in range(0,50):
    arr4 += 0.01
    res = optimize.linprog(-arr1,A_ub=arr3,b_ub=arr4,A_eq=aeq,b_eq=beq)
    print(res.fun)
    data[i] = res.fun

# 最大收益关于风险率的数据可视化
plt.figure(figsize=(30, 30), dpi=100)
x1 = np.linspace(0, 0.5, 50)
plt.plot(x1, -data, 'r--', marker='*')
plt.show()


#/usr/bin/python3.8 /home/ljm/PycharmProject/pythoncode1/code5.py 
[0.05  0.27  0.19  0.185 0.185]


[[1.    1.01  1.02  1.045 1.065]]


[[0.0e+00 2.5e-06 0.0e+00 0.0e+00 0.0e+00]
 [0.0e+00 0.0e+00 1.5e-06 0.0e+00 0.0e+00]
 [0.0e+00 0.0e+00 0.0e+00 5.5e-06 0.0e+00]
 [0.0e+00 0.0e+00 0.0e+00 0.0e+00 2.6e-06]]


-2190.1960784313724
-2517.6470588235297
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736
-2673.2673267326736

#Process finished with exit code 0

ここに画像の説明を挿入

5. 非線形計画法への入門

ここに画像の説明を挿入

非線形計画法は、目的関数または制約内の 1 つまたは複数の非線形関数を使用して最適化問題を解く方法であり、オペレーションズ リサーチの重要な分野です。1950 年代初頭に、HW Kuhn と AW Tucker が非線形計画法の基本定理を提案し、非線形計画法の理論的基礎を築きました。この手法は、産業、交通、経済管理、軍事など、特に「最適設計」の分野で広く利用されており、数学的根拠と計算方法を提供するものであり、重要な実用的価値を持っています。

6. 非線形計画法の一般的な解法

非線形計画法と線形計画法の 2 つの基本モデルの最大の違いは、線形計画法は単体法で最適解を得ることができ、最適解は頂点または辺に現れる必要があるのに対し、非線形計画法は最適解を得ることが難しいことです。 、一般に近似解であり、最適解は一般に頂点の端にあるのではなく、内部にも現れます。これが非線形計画法の難しさです。

1. ラグランジュ乗数法

数学的最適化問題において、ラグランジュ乗数法 (数学者ジョゼフ・ルイ・ラグランジュにちなんで命名) は、変数が 1 つ以上の条件に従う多変量関数の極値を見つける方法です。この方法では、n 個の変数と k 個の制約を持つ最適化問題を、n + k 個の変数を持つ連立方程式の極値問題に変換します。その変数は制約を受けません。このアプローチでは、新しい未知のスカラーであるラグランジュ乗数 (制約方程式の勾配の線形結合における各ベクトルの係数) が導入されます。

二項目的関数と等式の制約関数を例にとると、ラグランジュ乗数法ではまず制約条件と関数の方程式系を構築する必要があります。

L ( x , y ) = f ( x , y ) + λ g ( x , y ) L(x,y) = f(x,y) + \lambda g(x,y)L ( x ,y =f ( x ,y +λ g ( x ,y

ここに画像の説明を挿入

次に、L ( x , y ) L(x,y)についてL ( x ,y )変数xxに関してxyyyλ \lambdaλ の偏微分を計算し、得られた偏微分をすべて0 0にする0の場合、偏導関数が 0 になることを求める操作は、2 つの関数の勾配が比例することと等価です。つまり、2 つの関数の方向導関数は同一直線上にあります。このとき、2 つの関数には追加の成分はありません。目的関数を最適化するための方向導関数 最適解は影響を与えるため、この時点で最適解が得られます

∂ L ∂ x = 0 \frac{\partial L}{\partial x} =0×∂L _=0
∂ L ∂ y = 0 \frac{\partial L}{\partial y} =0∂y _∂L _=0
∂ L ∂ λ = 0 \frac{\partial L}{\partial \lambda} =0λ∂L _=0

ここに画像の説明を挿入

次に、方程式を解いてよどみ点のxxを求めます。xyyy ,λ \lambda次に、 λの値を目的関数に代入して、最適な解を取得します。一般的な理解では、人が決まった道に沿って山を登り、最高点に登ろうとするとき、自分の進行方向が山の勾配の方向と一致している場合にのみ、最高点に到達したと判断できます。この時点では、山の上方への変位はなくなりますが、そうでなければまだ登ることができます。

ここに画像の説明を挿入

2. 勾配降下法

ここに画像の説明を挿入

勾配降下法は、機械学習において最も馴染みのある最適化手法と言え、さまざまな損失関数の最適化に広く使用されています。その反復形式は次のとおりです: xk + 1 = xk − ak ∇ f ( xk ) x^ { k+1} = x^{k} - a_{k}\nabla f(x^{k})バツk + 1=バツkあるf ( xk )は、非常に単純な負の勾配更新方法です。

勾配降下法の最適化の考え方は、現在位置の負の勾配方向を探索方向として使用することです。この方向は現在位置の最も速い降下方向であるため、「最急降下法」とも呼ばれます。 。検索が最適値に近づくと、検索速度が大幅に遅くなり、複数回の反復が発生し、コンピューティング リソースが消費されます。反復が多すぎて速度が遅すぎるという問題を解決するには、次の最適化方法を試すことができます。確率的勾配降下法とバッチ勾配降下法。

バッチ勾配降下法 (BGD)
ここに画像の説明を挿入

確率的勾配降下法 (SGD)

ここに画像の説明を挿入

バッチ勾配降下法では、パラメーターが更新されるたびにすべてのサンプル データが使用されます。サンプル サイズが大きい場合、この更新方法は優れた収束効果がありますが、多くの場合非常に遅くなります。対応する確率的勾配降下法では、更新ごとに 1 つのサンプル データのみを使用するため、更新速度が大幅に向上しますが、同時に、収束の方向は直接的ではなく、勾配探索の方向は前後にねじれることがよくあります。

7. 非線形計画法の実装プロセス

ここに画像の説明を挿入

1. 問題と変数を特定する

前述の非線形計画問題には 2 つの大きな問題があり、この問題は発展的なレベルを示しています。建設現場に必要な量のセメントを、建設現場に最も近いストックヤードから一度に輸送することが必ずしも最良の意思決定スキームであるとは限らないため、セメントの量は十分であるまた、ストックヤードが近くの建設現場への輸送を増やすのか、最寄りの建設現場への輸送を増やすのかも検討する必要があり、できるだけ多くの建設現場へ輸送するという最も費用対効果の高い状況が決定変数となるは一度に吐出するセメントの量であり、目標関数は吐出量と距離の積の最小値を求めることであり、拘束条件はセメントの総吐出量が建設現場の一日の需要を満たすことである. 合計量がストックヤードの 1 日あたりの保管量を超えないこと

ここに画像の説明を挿入

2 番目の問題はさらに複雑です。ストックヤードで輸送されるセメントの総トン数と未知の場所での距離の積の最大値を解く必要があります。決定変数は、セメントの 1 回の納品とその座標です。目的関数は、輸送量と距離積の最小値を計算することであり、制約は、輸送されるセメントの総量が建設現場の毎日のニーズを満たしており、輸送されるセメントの総量が基準を超えないことです。ストックヤードの日常保管

2. モデルの構築

ここに画像の説明を挿入

X ij X_{ij}を仮定して、主に 2 番目の問題をモデル化して解決します。バツイジ一度に供給されるセメントの量を示します、xj x_{j}バツjストックヤードの横座標を示しますyj y_{j}yjストックヤードの縦軸、目的関数ffを表しますf式は

min ⁡ f = min ⁡ ∑ j = 1 2 ∑ i = 1 6 X ij ( xj − ai ) 2 + ( yj − bi ) 2 \min{f} = \min{ \sum_{j=1}^2{ \sum_{i=1}^6}{X_{ij}\sqrt{(x_{j} - a_{i})^{2} + (y_{j} - b_{i})^{2}} }}f=j = 12i = 16バツイジ( ×jある私は)2+( yjb私は)2

表面上の制約は 2 つだけですが、プログラムに変換すると 8 つの制約、合計 16 の決定変数に分割する必要があります。

∑ i = 1 6 X ij < = ej , j = 1 , 2 \sum_{i=1}^6{X_{ij}} <= e_{j},j = 1,2i = 16バツイジ<=ejj=1 2
∑ j = 1 2 X ij = di , i = 1 , 2 , 3 , 4 , 5 , 6 \sum_{j=1}^2{X_{ij}} = d_{i},i= 1,2 、3、4、5、6j = 12バツイジ=d私は=1 2 3 4 5 6

8、Python は非線形プログラミングを実装します

Python で非線形計画を実装する方法は数多くありますが、それぞれの方法には独自の制限があります。ここでは、scipy ライブラリの optimize モジュールを使用して操作します。このモジュールには、非線形計画を実行するときに初期予測値を与える必要があります。予測値は最終的な最適解にも影響しますが、これはこのモジュールの欠点でもあります。最適化にモンテカルロ法を使用することもできます。モンテカルロ法の主な核心は大数の定理です。試行回数が十分に大きい場合、得られたサンプルデータの分布をサンプルデータ全体の分布とみなし、さまざまな予測値をカウントして入力し、最終的に最適解の分布をカウントして最適解に近づけることができます。

import numpy as np
from scipy.optimize import minimize

func = 0
args1 = [[1.25,1.25],[8.75,0.75],[0.5,4.75],[5.75,5],[3,6.5],[7.25,7.75]]

# 目标函数和参数
def objective(args):
        global func
        loc_1 = args
        i = 0
        j = 0
        func = lambda x: sum(x[2*i+j] * (((x[12+2*j]-loc_1[i][0]) ** 2 + (x[13+j*2]-loc_1[i][1])) ** 1/2)for i,j in zip (range(6),range(2)))

        return func

args2 = [20, 20, 3, 5, 4, 7, 6, 11]


def con(args):
    # 约束条件 分为eq 和ineq
    # eq表示表达式结果等于0 ; ineq 表示表达式大于等于0
    b1, b2, d1, d2, d3, d4, d5, d6 = args
    cons = ({
    
    'type': 'ineq', 'fun': lambda x: -x[0] - x[2] - x[4] - x[6] - x[8] - x[10] + b1}, \
            {
    
    'type': 'ineq', 'fun': lambda x: -x[1] - x[3] - x[5] - x[7] - x[9] - x[11] + b2}, \
            {
    
    'type': 'eq', 'fun': lambda x: -x[0] - x[1] + d1}, \
            {
    
    'type': 'eq', 'fun': lambda x: -x[2] - x[3] + d2}, \
            {
    
    'type': 'eq', 'fun': lambda x: -x[4] - x[5] + d3}, \
            {
    
    'type': 'eq', 'fun': lambda x: -x[6] - x[7] + d4}, \
            {
    
    'type': 'eq', 'fun': lambda x: -x[8] - x[9] + d5}, \
            {
    
    'type': 'eq', 'fun': lambda x: -x[10] - x[11] + d6})
    return cons

cons = con(args2)

 
#设置初始预测值
x0 = np.array([1, 2, 1, 4, 1, 3, 1, 6, 1, 5, 1, 10, 3, 3, 5, 5])

# 计算
solution = minimize(objective(args1), x0, method='SLSQP',  constraints=cons)
x = solution.x

print(solution)
print('\n')
print('最优解 = ' + str(solution.fun))
print('料场1横坐标 = ' + str(x[12]))
print('料场1纵坐标 = ' + str(x[13]))
print('料场2横坐标 = ' + str(x[14]))
print('料场2纵坐标 = ' + str(x[15]))

#/usr/bin/python3.8 /home/ljm/PycharmProject/pythoncode1/code6.py 
 message: Inequality constraints incompatible
 success: False
  status: 4
     fun: -8330466284030726.0
       x: [-4.565e+04  4.565e+04 ...  3.222e+05 -2.365e+04]
     nit: 4
     jac: [ 3.355e+08  0.000e+00 ... -5.161e+10  0.000e+00]
    nfev: 68
    njev: 4


最优解 = -8330466284030726.0
料场1横坐标 = -24603.887006224133
料场1纵坐标 = -7864.964381965315
料场2横坐标 = 322189.52738244593
料场2纵坐标 = -23652.50564799086

#Process finished with exit code 0

要約する

以上が今日のメモの内容です. この記事では, 線形計画法と非線形計画法の全体的な実装アイデアと解決方法を簡単に紹介します. 線形計画法と非線形計画法は数学的モデリングと機械学習で広く使用されており, 特にいくつかの最適化スキームに適しています線形計画法と非線形計画法の解決策にも独自の限界があります。つまり、異なるモデルの利点をうまく利用することによってのみ、物事の背後にある数学的論理をより徹底的に分析することができます。

おすすめ

転載: blog.csdn.net/m0_55202222/article/details/128841379