偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

運(yùn)籌優(yōu)化工程師必備:八大 Python 庫(kù)全解析

開(kāi)發(fā)
本文介紹八大 Python 運(yùn)籌優(yōu)化工具,涵蓋線性規(guī)劃、整數(shù)規(guī)劃、組合優(yōu)化等全場(chǎng)景需求,助您構(gòu)建高效決策系統(tǒng)。

在人工智能與工業(yè)4.0時(shí)代,運(yùn)籌優(yōu)化技術(shù)已成為提升決策效率的核心引擎。Python憑借其強(qiáng)大的科學(xué)計(jì)算生態(tài),孕育了眾多專(zhuān)業(yè)優(yōu)化庫(kù)。

本文介紹八大Python運(yùn)籌優(yōu)化工具,涵蓋線性規(guī)劃、整數(shù)規(guī)劃、組合優(yōu)化等全場(chǎng)景需求,助您構(gòu)建高效決策系統(tǒng)。

1. SciPy:基礎(chǔ)優(yōu)化的瑞士軍刀

功能亮點(diǎn):

  • 提供scipy.optimize模塊,支持線性規(guī)劃(LP)、非線性規(guī)劃(NLP)
  • 核心函數(shù):linprog()(線性規(guī)劃)、minimize()(非線性?xún)?yōu)化)
  • 優(yōu)勢(shì):零配置使用,完美融入科學(xué)計(jì)算工作流
import numpy as np
from scipy.optimize import linprog

# 定義問(wèn)題:最大化 3x + 5y,約束 x + 2y ≤ 100,x,y ≥ 0且為整數(shù)
def solve_integer_problem():
    # 1. 求解連續(xù)線性規(guī)劃(作為整數(shù)解的參考)
    res = linprog(
        c=[-3, -5],  # 目標(biāo)函數(shù)系數(shù)(取負(fù)實(shí)現(xiàn)最大化)
        A_ub=[[1, 2]],  # 約束系數(shù)矩陣
        b_ub=[100],     # 約束上限
        bounds=[(0, None), (0, None)],  # 變量非負(fù)約束
        method='highs'
    )
    
    if not res.success:
        return "求解失敗:無(wú)法找到可行解"
    
    # 2. 在連續(xù)解附近生成候選整數(shù)解
    x_cont, y_cont = res.x
    candidates = [(x, y) for x in range(max(0, int(x_cont)-2), int(x_cont)+3)
                        for y in range(max(0, int(y_cont)-2), int(y_cont)+3)
                        if x + 2*y <= 100]  # 過(guò)濾滿足約束的解
    
    # 3. 篩選最優(yōu)整數(shù)解
    best_x, best_y = max(candidates, key=lambda xy: 3*xy[0] + 5*xy[1])
    max_val = 3*best_x + 5*best_y
    
    return f"最優(yōu)整數(shù)解:\nx = {best_x}, y = {best_y}\n目標(biāo)函數(shù)最大值 = {max_val}"

# 執(zhí)行并打印結(jié)果
print(solve_integer_problem())

適用場(chǎng)景:算法原型驗(yàn)證、教學(xué)案例、小型工程問(wèn)題。

2. Gurobi:工業(yè)級(jí)高性能引擎

核心優(yōu)勢(shì):

  • 商業(yè)求解器巔峰:混合整數(shù)規(guī)劃(MIP) 求解速度領(lǐng)先
  • 支持分布式計(jì)算,千萬(wàn)級(jí)變量?jī)?yōu)化
  • 學(xué)術(shù)用戶免費(fèi)授權(quán)
from gurobipy import Model, GRB

# 創(chuàng)建模型
model = Model("SupplyChain")

# 添加整數(shù)變量
x = model.addVar(vtype=GRB.INTEGER, name="x")
y = model.addVar(vtype=GRB.INTEGER, name="y")
# 添加約束條件
model.addConstr(x + 2*y <= 100, "ResourceConstraint")

# 設(shè)置目標(biāo)函數(shù)(最大化)
model.setObjective(3*x + 5*y, GRB.MAXIMIZE)



# 執(zhí)行優(yōu)化
model.optimize()

# 檢查優(yōu)化是否成功
if model.status == GRB.OPTIMAL:
    # 輸出變量的最優(yōu)值
    print(f"最優(yōu)解:")
    print(f"x = {x.x}")
    print(f"y = {y.x}")
    print(f"目標(biāo)函數(shù)值 = {model.objVal}")
else:
    print("未找到最優(yōu)解")

典型應(yīng)用:供應(yīng)鏈網(wǎng)絡(luò)設(shè)計(jì)、金融投資組合優(yōu)化

3. PuLP:輕量級(jí)建模利器

突出特性:

  • 語(yǔ)法貼近數(shù)學(xué)表達(dá):prob += 3*x1 + 4*x2
  • 無(wú)縫集成CBC、GLPK等開(kāi)源求解器
  • 模型可導(dǎo)出LP/MPS標(biāo)準(zhǔn)格式
import pulp

# 創(chuàng)建問(wèn)題實(shí)例,指定為最大化問(wèn)題
model = pulp.LpProblem("SupplyChain", pulp.LpMaximize)

# 定義決策變量(非負(fù)整數(shù))
x = pulp.LpVariable('x', lowBound=0, cat='Integer')  # lowBound=0表示x≥0
y = pulp.LpVariable('y', lowBound=0, cat='Integer')  # cat='Integer'指定為整數(shù)變量

# 設(shè)置目標(biāo)函數(shù)
model += 3 * x + 5 * y, "TotalProfit"  # 第二個(gè)參數(shù)是目標(biāo)函數(shù)的名稱(chēng)

# 添加約束條件
model += x + 2 * y <= 100, "ResourceConstraint"  # 約束名稱(chēng)為"ResourceConstraint"

# 求解模型
status = model.solve(pulp.PULP_CBC_CMD(msg=0))  # msg=0表示不顯示求解器日志

# 輸出求解狀態(tài)
print(f"求解狀態(tài): {pulp.LpStatus[status]}")

# 輸出最優(yōu)解
if pulp.LpStatus[status] == "Optimal":
    print(f"最優(yōu)解:")
    print(f"x = {x.varValue}")
    print(f"y = {y.varValue}")
    print(f"目標(biāo)函數(shù)值 = {pulp.value(model.objective)}")
else:
    print("未找到最優(yōu)解")

最佳場(chǎng)景:教學(xué)演示、小型排產(chǎn)優(yōu)化

4. Pyomo:企業(yè)級(jí)建模框架

架構(gòu)優(yōu)勢(shì):

  • 模型與求解器分離:支持Gurobi/CPLEX/GLPK
  • 提供抽象模型(AbstractModel)和具體模型(ConcreteModel)
  • 復(fù)雜約束系統(tǒng)表達(dá)能力極強(qiáng)
from pyomo.environ import ConcreteModel, Var, Objective, Constraint, Integers, maximize, SolverFactory

# 創(chuàng)建具體模型實(shí)例
model = ConcreteModel(name="SupplyChain")

# 定義決策變量(非負(fù)整數(shù))
model.x = Var(domain=Integers, bounds=(0, None), name="x")  # bounds=(0, None)表示x≥0
model.y = Var(domain=Integers, bounds=(0, None), name="y")  # domain=Integers指定為整數(shù)變量

# 定義目標(biāo)函數(shù)(最大化)
def objective_rule(model):
    return 3 * model.x + 5 * model.y
model.objective = Objective(rule=objective_rule, sense=maximize, name="TotalProfit")

# 定義約束條件
def constraint_rule(model):
    return model.x + 2 * model.y <= 100
model.constraint = Constraint(rule=constraint_rule, name="ResourceConstraint")

# 注意/注意、選擇求解器并求解(這里使用CBC求解器,需要提前安裝)
solver = SolverFactory('cbc')  # 使用開(kāi)源的CBC求解器
results = solver.solve(model)

# 輸出求解狀態(tài)
print(f"求解狀態(tài): {results.solver.status}")
print(f"求解終止條件: {results.solver.termination_condition}")

# 輸出最優(yōu)解
if results.solver.termination_condition == 'optimal':
    print("\n最優(yōu)解:")
    print(f"x = {model.x.value}")
    print(f"y = {model.y.value}")
    print(f"目標(biāo)函數(shù)值 = {model.objective.value}")
else:
    print("未找到最優(yōu)解")

工業(yè)應(yīng)用:化工過(guò)程優(yōu)化、電力系統(tǒng)調(diào)度

5. OR-Tools:谷歌開(kāi)源組合優(yōu)化神器

突破性能力:

  • 專(zhuān)精NP-Hard問(wèn)題:車(chē)輛路徑(VRP)、調(diào)度問(wèn)題
  • 內(nèi)置啟發(fā)式算法:Large Neighborhood Search(LNS)
from ortools.linear_solver import pywraplp

# 創(chuàng)建求解器(使用GLOP線性規(guī)劃求解器,OR-Tools內(nèi)置)
solver = pywraplp.Solver.CreateSolver("SCIP")  # SCIP是OR-Tools中用于整數(shù)規(guī)劃的求解器

# 定義整數(shù)變量(非負(fù))
x = solver.IntVar(0, solver.infinity(), "x")  # IntVar表示整數(shù)變量,第一個(gè)參數(shù)是下界
y = solver.IntVar(0, solver.infinity(), "y")

print(f"變量數(shù)量: {solver.NumVariables()}")

# 添加約束條件 x + 2y ≤ 100
constraint = solver.Constraint(-solver.infinity(), 100)  # 約束范圍(-∞, 100]
constraint.SetCoefficient(x, 1)  # x的系數(shù)為1
constraint.SetCoefficient(y, 2)  # y的系數(shù)為2

print(f"約束數(shù)量: {solver.NumConstraints()}")

# 定義目標(biāo)函數(shù):最大化3x + 5y
objective = solver.Objective()
objective.SetCoefficient(x, 3)
objective.SetCoefficient(y, 5)
objective.SetMaximization()  # 設(shè)置為最大化問(wèn)題

# 求解問(wèn)題
status = solver.Solve()

# 輸出結(jié)果
if status == pywraplp.Solver.OPTIMAL:
    print("找到最優(yōu)解:")
    print(f"x = {x.solution_value()}")
    print(f"y = {y.solution_value()}")
    print(f"目標(biāo)函數(shù)最大值 = {objective.Value()}")
else:
    print("未找到最優(yōu)解")

# 輸出求解器信息
print(f"\n求解器使用時(shí)間: {solver.WallTime()} 毫秒")

6. GEKKO:動(dòng)態(tài)系統(tǒng)優(yōu)化專(zhuān)家

獨(dú)特價(jià)值:

  • 支持微分代數(shù)方程(DAE) 優(yōu)化
  • 內(nèi)置APOPT、IPOPT等非線性求解器
  • 控制系統(tǒng)設(shè)計(jì)利器
from gekko import GEKKO

# 創(chuàng)建模型
m = GEKKO(remote=False)  # remote=False表示使用本地求解器

# 定義整數(shù)變量(非負(fù))
x = m.Var(integer=True, lb=0, name='x')  # integer=True指定為整數(shù)變量,lb=0設(shè)置下界為0
y = m.Var(integer=True, lb=0, name='y')

# 設(shè)置目標(biāo)函數(shù)(最大化3x + 5y)
# Gekko默認(rèn)是最小化,所以通過(guò)取負(fù)數(shù)實(shí)現(xiàn)最大化
m.Maximize(3*x + 5*y)

# 添加約束條件
m.Equation(x + 2*y <= 100)

# 求解模型
m.solve(disp=False)  # disp=False不顯示詳細(xì)求解過(guò)程

# 輸出結(jié)果
print("最優(yōu)解:")
print(f"x = {x.value[0]}")
print(f"y = {y.value[0]}")
print(f"目標(biāo)函數(shù)最大值 = {m.options.OBJFCNVAL * -1}")  # 乘以-1還原最大值

工程應(yīng)用:化工過(guò)程控制、機(jī)器人軌跡優(yōu)化

7. Scikit-opt:元啟發(fā)式算法寶庫(kù)

核心特色:

  • 集成7類(lèi)啟發(fā)式算法:遺傳算法、模擬退火等
  • GPU加速支持,萬(wàn)維優(yōu)化問(wèn)題高效求解
from sko.GA import GA
import numpy as np
import matplotlib.pyplot as plt
# 目標(biāo)函數(shù):最大化3x + 5y(轉(zhuǎn)為最小化問(wèn)題,返回負(fù)值)
def objective_func(x):
    return -(3 * x[0] + 5 * x[1])

# 約束條件:x + 2y ≤ 100(滿足約束時(shí)返回值≥0)
def constraint_func(x):
    return 100 - (x[0] + 2 * x[1])

# 創(chuàng)建遺傳算法實(shí)例
ga = GA(
    func=objective_func,          # 目標(biāo)函數(shù)
    n_dim=2,                      # 變量維度(x和y)
    size_pop=500,                 # 種群大小
    max_iter=2000,                 # 迭代次數(shù)
    lb=[0, 0],                    # 變量下界(x≥0, y≥0)
    ub=[100, 50],                 # 變量上界(根據(jù)約束估算)
    prob_mut=0.005,                #變異系數(shù),默認(rèn)0.001
    constraint_eq=[constraint_func],  # 約束條件

)

# 執(zhí)行優(yōu)化
best_x, best_y = ga.run()

# 輸出結(jié)果
print("遺傳算法優(yōu)化結(jié)果:")
print(f"最優(yōu)解:x = {int(best_x[0])}, y = {int(best_x[1])}")
print(f"目標(biāo)函數(shù)最大值:{int(-best_y)}")  # 還原為正值

# 繪制迭代曲線

plt.rcParams['font.sans-serif'] = ['SimHei']  # 設(shè)置中文
plt.plot(ga.generation_best_Y)
plt.title("遺傳算法迭代過(guò)程")
plt.xlabel("迭代次數(shù)")
plt.ylabel("最優(yōu)目標(biāo)函數(shù)值(負(fù)值)")
plt.show()

創(chuàng)新場(chǎng)景:神經(jīng)網(wǎng)絡(luò)超參優(yōu)化、非凸函數(shù)全局尋優(yōu)

8. CVXPY:凸優(yōu)化領(lǐng)域的Pythonic方案

技術(shù)亮點(diǎn):

  • 符合Disciplined Convex Programming(DCP)規(guī)則
  • 自動(dòng)推導(dǎo)凸優(yōu)化問(wèn)題標(biāo)準(zhǔn)形式
import cvxpy as cp
from cvxpy.error import SolverError  # 導(dǎo)入特定異常類(lèi)

# 定義整數(shù)變量(正確指定變量類(lèi)型)
x = cp.Variable(integer=True, name="x")
y = cp.Variable(integer=True, name="y")

# 定義目標(biāo)函數(shù):最大化3x + 5y
objective = cp.Maximize(3 * x + 5 * y)

# 定義約束條件:
constraints = [
    x + 2 * y <= 100,  # 資源約束
    x >= 0,             # 非負(fù)約束
    y >= 0              # 非負(fù)約束
]

# 創(chuàng)建優(yōu)化問(wèn)題
problem = cp.Problem(objective, constraints)

# 定義求解器嘗試順序
solvers = [
    ("CBC", cp.CBC),
    ("GLPK_MI", cp.GLPK_MI),
    ("ECOS_BB", cp.ECOS_BB),
    ("SCIP", cp.SCIP)
]

result = None
solver_used = None

# 嘗試多個(gè)求解器
for solver_name, solver in solvers:
    try:
        result = problem.solve(solver=solver, verbose=False)
        solver_used = solver_name
        # 檢查是否獲得最優(yōu)解
        if problem.status == cp.OPTIMAL:
            break
    except SolverError:
        print(f"求解器 {solver_name} 不可用,嘗試下一個(gè)...")
    except Exception as e:
        print(f"求解器 {solver_name} 出錯(cuò): {str(e)}")

# 輸出求解結(jié)果
print(f"\n使用的求解器: {solver_used or '無(wú)可用求解器'}")
print(f"求解狀態(tài): {problem.status}")

if problem.status == cp.OPTIMAL:
    # 確保獲取整數(shù)值(直接取整)
    x_val = int(round(x.value))
    y_val = int(round(y.value))
    
    print("\n最優(yōu)解:")
    print(f"x = {x_val}")
    print(f"y = {y_val}")
    print(f"目標(biāo)函數(shù)最大值 = {round(objective.value)}")  # 使用objective.value更準(zhǔn)確
elif problem.status == cp.INFEASIBLE:
    print("問(wèn)題不可行,無(wú)解")
elif problem.status == cp.UNBOUNDED:
    print("問(wèn)題無(wú)界,解無(wú)限大")
else:
    print("未找到最優(yōu)解,請(qǐng)檢查求解器安裝和問(wèn)題設(shè)置")
    print(f"最后嘗試的結(jié)果: x={x.value}, y={y.value}")

優(yōu)勢(shì)領(lǐng)域:投資組合優(yōu)化、信號(hào)處理

工具選型矩陣

庫(kù)名

優(yōu)化類(lèi)型

典型問(wèn)題規(guī)模

學(xué)習(xí)曲線

SciPy

LP/NLP

<103變量

平緩

Gurobi

MIP/QP/NLP

>10?變量

中等

PuLP

LP/IP

<10?變量

平緩

Pyomo

LP/MIP/NLP

103-10?變量

陡峭

OR-Tools

組合優(yōu)化

路徑/調(diào)度問(wèn)題

中等

GEKKO

動(dòng)態(tài)優(yōu)化

DAE系統(tǒng)

專(zhuān)業(yè)

Scikit-opt

啟發(fā)式優(yōu)化

復(fù)雜非凸問(wèn)題

中等

CVXPY

凸優(yōu)化

<10?變量

中等

選型說(shuō)明:

  • 數(shù)學(xué)規(guī)劃問(wèn)題:首選 Gurobi/Pyomo
  • 路徑排產(chǎn)優(yōu)化:OR-Tools
  • 動(dòng)態(tài)控制系統(tǒng):GEKKO
  • 算法研究驗(yàn)證:Scikit-opt/SciPy

責(zé)任編輯:趙寧寧 來(lái)源: Python數(shù)智工坊
相關(guān)推薦

2025-03-20 09:48:25

2025-09-08 02:32:00

2021-10-22 08:00:00

架構(gòu)開(kāi)發(fā)技術(shù)

2010-08-05 13:33:06

Flex布局規(guī)則

2023-11-10 15:37:08

Linux網(wǎng)站

2014-11-04 16:50:35

2015-08-17 09:27:51

全棧工程師Devops工具周期表

2023-11-29 13:50:00

數(shù)據(jù)分析師

2022-04-25 13:11:14

Python編程技巧

2009-05-22 18:32:03

虛擬化IT服務(wù)器

2017-11-10 19:00:37

華為

2022-01-05 09:26:56

IT災(zāi)難IT故障

2020-08-05 16:52:14

黑帽安全會(huì)議Blackhat US網(wǎng)絡(luò)安全

2009-06-22 14:07:46

JSF優(yōu)勢(shì)

2011-08-17 13:55:25

VoIPPBX

2010-08-10 09:01:02

FlexSDK4新特性

2025-01-13 09:00:00

Python文件讀寫(xiě)代碼

2015-10-08 09:08:50

Python實(shí)現(xiàn)

2018-04-26 05:48:56

2020-09-29 13:10:28

DevOps自動(dòng)化技能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)