Pythonは、制約のある数理最適化問題(非線形計画法、粒子群、遺伝的、差分進化)を解決します。

ケース1:出力値は浮動小数点数にすることができます

例1

の本の答え

この例は制約された客観的な問題です

方法1非線形計画法scipy.optimize.minimize非線形計画法の
原理については説明しません。

たとえば、1、
関数の最小値を見つけます。関数パラメーターは複数にすることができますが、関数値はスカラーのみにすることができます。

パラメータ

  • 楽しい:呼び出し可能なターゲット関数
  • x0:ndarry初期値
  • args:タプル、オプションの追加パラメーター。目的関数とその導関数に渡されます。
  • メソッド:strまたはcallable、オプション問題を解決するためのアルゴリズムの名前。次のいずれかを選択します:Nelder-Mead、Powell、CG、BFGS、Newton-CG、L-BFGS-B、TNC、COBYLA、SLSQP、dogleg 、trust-ncg defaultこれは、BFGS、L-BFGS-B、およびSLSQPのいずれかです。質問に制約と制限が含まれているかどうかに応じて自動的に選択されます。
  • jac:boolまたは呼び出し可能、オプション目的関数の勾配行列。CG、BFGS、Newton-CG、L-BFGS-B、TNC、SLSQP、dogleg、trust-ncgにのみ適用されます。jacがブール値でTrueの場合、funは勾配であると見なされ、目的関数で返されます。Falseの場合、勾配は自動的に計算されます。jacは、目的関数の勾配を返す関数にすることもでき、パラメーターはfunと同じである必要があります。
  • hess、hessp:呼び出し可能、オプション目的関数の2次導関数行列、または2次導関数行列にランダムベクトルpを掛けたもの。Newton-CG、dogleg、trust-ncgにのみ適用されます。hessとhesspのいずれか1つだけを指定する必要があります。hessが提供されている場合、hesspは無視されます。どちらも指定されていない場合、2階微分行列は自動​​的に計算されます
  • 境界:シーケンス、optionalboundsはパラメーター制限であり、L-BFGS-B、TNC、およびSLSQPにのみ適用されます。各パラメーターは、パラメーターの上限と下限を表す1つ(最小、最大)に対応します。境界が1つしかない場合、反対側は[なし]に設定されます。制約がxxxxx x xxxxの単一要素の上限と下限に対するものである場合は、boundsパラメーターを使用して設定できます。
  • 制約:dictまたはdictのシーケンス、オプションの
    制約定義、COBYLAおよびSLSQPにのみ適用可能。各制約はディクショナリとして定義され、キーと値のペアには次の
    ものが含まれます。fun:callable。制約関数が定義されています。
    タイプ:str。制約タイプ:eq 'は等式制約(funは0に等しい)を表し、ineqは不等式制約(funは0以上)を表します。COBYLAは、不等式制約のみをサポートします。
    jac:呼び出し可能、オプション。funの勾配行列は、SLSQP
    引数にのみ適用できます:シーケンス、オプション。funとjacに渡される追加のパラメーター。
  • tol:float、オプション反復終了の許容誤差。
  • options:dict、optionalソルバーのオプション辞書。すべてのアルゴリズムは、次の一般的なオプションを受け入れます。maxiter:int。反復の最大数。disp:bool。Trueの場合、収束情報を出力します。
  • コールバック:呼び出し可能、オプション
    各反復後に呼び出される関数。パラメーターはxkで、現在のパラメーターベクトルを表します。

戻り値
res:最適化の結果。

最適化の結果はOptimizeResultオブジェクトであり、次のような重要な属性があります。

funは最適値です
xは最適解です
successは、ソルバーが正常に終了したかどうかを示します。
メッセージは、ソルバーが終了した理由を説明します

from scipy.optimize import minimize
import numpy as np
#目标函数即min(FG1+FG2+FG3)
def fun(x):

    return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])


def con():
    # 约束条件 分为eq 和ineq
    #eq表示 函数结果等于0 ; ineq 表示 表达式大于等于0


    cons = ({
    
    'type': 'eq', 'fun': lambda x: x[0]+x[1]+x[2]-700})

            #{'type': 'ineq', 'fun': lambda x: -x[2] + x2max}#如果有不等式约束
   #cons= ([con1, con2, con3, con4, con5, con6, con7, con8]) #如果有多个约束,则最后返回结果是这个
    

    return cons

#上下限约束
b1=(100,200)#
b2=(120,250)#
b3=(150,300)#
bnds = (b1,b2,b3)#边界约束
if __name__ == "__main__":
    cons=con()#约束


    # 设置x初始猜测值
    x0 = np.array((150, 250, 20))
    res = minimize(fun, x0, method='SLSQP', constraints=cons,bounds=bnds)
    print('代价',res.fun)
    print(res.success)
    print('解',res.x)

方法2粒子群pyswarm.pso
粒子群PSO最適化アルゴリズムの研究ノートとそのPython実装(Python言語sko.PSOツールキットの使用方法の説明付き)

pyswarmは、制約をサポートする粒子群最適化パッケージです。

sko.PSOのpsoは、上限と下限の制約のみをサポートし、等式および不等式の制約はサポートしません。

参数详解
pso(func、lb、ub、ieqcons = []、f_ieqcons = None、args =()、kwargs = {}、
swarmsize = 100、omega = 0.5、phip = 0.5、phig = 0.5、maxiter = 100、
minstep = 1e-8、minfunc = 1e-8、debug = False)

  • func:最小化する関数
  • lb:配列設計変数の下限
  • ub:配列設計変数の上限
  • ieqcons:list最適化に成功した問題で、ieqcons j > = 0.0(デフォルト値:[])のような長さnの関数リスト
  • f_ieqcons:関数は1次元配列を返します。ここで、最適化に成功した問題では、各要素が0.0以上である必要があります。f_ieqconsが指定されている場合、ieqconsは無視されます(デフォルト:なし)
  • args:タプルから目的関数と制約関数に渡される追加のパラメーター(デフォルト:空のタプル)
  • kwargs:dictによって目的関数と制約関数に渡される追加のキーワードパラメーター(デフォルト:空の辞書)
  • swarmsize:intクラスター内のパーティクルの数(デフォルト:100)
  • オメガ:スカラー粒子速度スケーリング係数(デフォルト:0.5)
  • phip:パーティクルの最もよく知られている位置から遠く離れた場所を検索するためのスカラーズーム係数(デフォルト:0.5)
  • phig:ハチのコロニーの最もよく知られている位置からスカラーが検索するズーム率(デフォルト:0.5)
  • maxiter:int最大反復回数
  • minstep:searcが終了する前のグループの最適位置の最小ステップサイズ(デフォルト:1e-8)
  • minfunc:検索が終了する前のスカラーグループの最適なターゲット値の最小の変化(デフォルト:1e-8)
  • debug:boolean Trueの場合、進行状況ステートメントは反復ごとに表示されます(デフォルト値:False)

戻り値

  • g:アレイグループの最もよく知られている位置(最適設計)
  • f:スカラーポイントの目標値
from pyswarm import pso

def object_func(x):
    return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])

#不等式约束

def cons1(x):
    return [x[0]+x[1]+x[2]-700]

lb = [100, 120, 150]#
ub = [200, 250, 300]

xopt, fopt = pso(object_func,lb,ub,ieqcons=[cons1], maxiter=100,swarmsize=1000)
print(xopt)
print(fopt)

粒子群によって得られる値は必ずしも最適解ではありません

例2

from pyswarm import pso

def object_func(x):
    x1 = x[0]
    x2 = x[1]
    return x1**4 - 2*x2*x1**2 + x2**2 + x1**2 - 2*x1 + 5 # 求解最小值

def cons(x):
    x1 = x[0]
    x2 = x[1]
    con1 =  -(x1 + 0.25)**2 + 0.75*x2 # con1>=0
    con2 = -x1+0.2 # con2>=0
    return [-(x1 + 0.25)**2 + 0.75*x2,-x1+0.2]

lb = [-3, -1] # -3<x1<2, -1<x2<6
ub = [2, 6]

xopt, fopt = pso(object_func, lb, ub, f_ieqcons=cons)
print(xopt)
print(fopt)

方法3遺伝的アルゴリズム

遺伝的アルゴリズムの原理とPythonでの実装

sko.GA import GAのツールを使用して
、パラメーター
func、n_dim、size_pop = 50、max_iter = 200、prob_mut = 0.001、
lb = -1、ub = 1、constraint_eq = tuple()、constraint_ueq = tuple()、精度= 1e -7

func:function。最適な
n_dim:intを実行したいfunc func
lbの変数の数:array_like func
ubのすべての変数の下限:array_like funcのすべての変数の上限
constraint_eq:list .equalconstraintconstraint_ueq
:list。不均等な制約
精度:array_like。func
size_pop:intのすべての
変数の精度母集団のサイズmax_iter:int。iterの
最大値prob_mut:float .between0と突然変異の確率
属性
----------------------
Lind:array_like
func(セグメントのすべての変数の遺伝子の数)
generation_best_X:array_like。サイズはmax_iterです。
すべての世代のベスト
Xgeneration_best_ranking:array_like。max_iterの場合のサイズ。
すべての世代の最高のランキング


def object_func(x):
    return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])

#等式约束

def cons1(x):
    return [x[0]+x[1]+x[2]-700]
cons=cons1

#导入包
from sko.GA import GA
ga = GA(func=object_func, n_dim=3, size_pop=200, max_iter=800, lb=[100, 120, 150], ub=[200, 250, 300],constraint_eq=[cons])
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

同様に、最適な解決策を見つけることは困難です

方法4差分進化アルゴリズム

'''
min f(x1, x2, x3) = x1^2 + x2^2 + x3^2
s.t.
    x1*x2 >= 1
    x1*x2 <= 5
    x2 + x3 = 1
    0 <= x1, x2, x3 <= 5
'''


def obj_func(p):
    x1, x2, x3 = p
    return x1 ** 2 + x2 ** 2 + x3 ** 2


constraint_eq = [
    lambda x: 1 - x[1] - x[2]
]

constraint_ueq = [
    lambda x: 1 - x[0] * x[1],
    lambda x: x[0] * x[1] - 5
]
from sko.DE import DE

de = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0], ub=[5, 5, 5],
        constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)

best_x, best_y = de.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

ケース2:出力値を整数として指定する

方法1:整数計画法の遺伝的アルゴリズム**
多次元最適化では、どの変数を整数に制限するか、精度を1に設定するだけです。
たとえば、カスタム関数object_funcの最初の変数を整数に制限してから、最初の精度の数値を1に設定したいとします。例は次のとおりです。


def object_func(x):
    return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])

#等式约束

def cons1(x):
    return [x[0]+x[1]+x[2]-700]
cons=cons1

#导入包
from sko.GA import GA
ga = GA(func=object_func, n_dim=3, size_pop=200, max_iter=800, lb=[100, 120, 150], ub=[200, 250, 300],constraint_eq=[cons], precision=[1, 1e-7, 1e-7])
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

ここに画像の説明を挿入します
著者:電気-YudengWu。書くのは簡単ではありません。出発する前に気に入ってください。ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/kobeyu652453/article/details/113954067