close

【pulp】用Python規劃求解:規劃求解一篇文章搞定

一、前言

在excel有一個非常方便的工具就是規劃求解,

在不少時候都會用到著工具求出最大(小)值供決策參考。

Python也有很說規劃求解的套件包,但我覺得其中最好懂得就是pulp,

 

他可以很快速讓你求出限制條件下的最佳解,

同時他的使用方式也非常好懂,本篇實例教學一篇就懂python規劃求解。

 

進入基本教學前,不要忘了訂閱按讚分享唷!

部落格教學網站:
https://pixnashpython.pixnet.net/blog
想要即時訂閱最新文章:
https://forms.gle/MdXmiF2HgHhNChL46
訂閱Telegram來接收最新資訊:
https://t.me/joinchat/VUUuDt67Uq5l6CIQ

 

 

二、pulp規劃求解


這邊解說一下案例,而程式碼後在對其中的方法及參數來解說。

這案例非常簡單,我們想知道各家銀行不同的利率下怎樣可以取得最大的利率來賺取利息。

而案例也包含各家銀行給予的條件,才願意給我們相對的利率。

 

使先使用pulp.LpProblem來建立你要求解的方式,最大值:pulp.LpMaximize 最小值:pulp.LpMinimize

用pulp.LpVariable來建立要求解的變數,同時可以賦予它們名稱,之後才不會亂掉

MyProbLP += (x11*0.01 + x12*0.49 + x21*0.378 + x31*0.35 + x41*0.40) 直接用 MyProbLP+=的方式加入要求解的函數

同樣使用MyProbLP +=來加入限制條件

MyProbLP.solve() 來進行求解

MyProbLP.status 來查看求解的狀態

MyProbLP.variables() 可以抽出要求解的每個變數的屬性

pulp.value(MyProbLP.objective 取得求解的結果

 

import pulp
import pandas


# =============================================================================
# 當前案例:在限制條件下求最高加權利率
# =============================================================================


# 規劃求解 最大值:pulp.LpMaximize 最小值:pulp.LpMinimize
MyProbLP = pulp.LpProblem("LPProbDemo1", sense=pulp.LpMaximize)  # 求最大值


# 比重變數
x11 = pulp.LpVariable('玉山活', lowBound=0, upBound=1, cat='Continuous') # 利率 0.01
x12 = pulp.LpVariable('玉山定', lowBound=0, upBound=1, cat='Continuous') # 0.49
x21 = pulp.LpVariable('凱基定', lowBound=0, upBound=1, cat='Continuous') # 0.378
x31 = pulp.LpVariable('遠東定', lowBound=0, upBound=1, cat='Continuous') # 0.35
x41 = pulp.LpVariable('陽信定', lowBound=0, upBound=1, cat='Continuous') # 0.40


# 設定目標函式
MyProbLP += (x11*0.01 + x12*0.49 + x21*0.378 + x31*0.35 + x41*0.40)


# 條件式
MyProbLP += (x11 == x12)  # 玉山 活定存需同額
MyProbLP += (x21 <= 0.3)  # 凱基比重不能超過0.3
MyProbLP += (x31 <= 0.1)  # 遠東比重不能超過0.1
MyProbLP += (x41 <= 0.2)  # 陽信比重不能超過0.2
MyProbLP += (x41 >= x21)  # 玉山比重需大於凱基

MyProbLP += (x11 + x12 + x21 + x31 + x41 == 1) # 總權重等於1


# 開始求解
MyProbLP.solve()


# 查看求解狀態
pulp.LpStatus # 所有狀態
MyProbLP.status # 此次求解狀態
print("Status:", pulp.LpStatus[MyProbLP.status]) # 輸出求解狀態

# 壓製成DF
bank = []
w = []
for v in MyProbLP.variables():  # youcans
    print(v.name, "=", v.varValue)  # 輸出每個變數的最優值
    bank.append(v.name)
    w.append(v.varValue)
    
df_w = pandas.DataFrame(w, bank, columns=['w'])

image

 

三、後記


在統計方面、線性規劃、規劃求解、量化等等Python算是非常的強大,

如果有什麼案例可以分享給我,我來試試看,說不定大家也遇到相同問題。

 

部落格教學網站:
https://pixnashpython.pixnet.net/blog
想要即時訂閱最新文章:
https://forms.gle/MdXmiF2HgHhNChL46
訂閱Telegram來接收最新資訊:
https://t.me/joinchat/VUUuDt67Uq5l6CIQ

arrow
arrow

    恩哥Python 發表在 痞客邦 留言(0) 人氣()