成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

python目標函數(shù)講解 常見目標函數(shù)

python遺傳算法目標函數(shù)怎么編

一、遺傳算法介紹

創(chuàng)新互聯(lián)專注于察哈爾右翼前網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供察哈爾右翼前營銷型網(wǎng)站建設,察哈爾右翼前網(wǎng)站制作、察哈爾右翼前網(wǎng)頁設計、察哈爾右翼前網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務,打造察哈爾右翼前網(wǎng)絡公司原創(chuàng)品牌,更為您提供察哈爾右翼前網(wǎng)站排名全網(wǎng)營銷落地服務。

遺傳算法是通過模擬大自然中生物進化的歷程,來解決問題的。大自然中一個種群經(jīng)歷過若干代的自然選擇后,剩下的種群必定是適應環(huán)境的。把一個問題所有的解看做一個種群,經(jīng)歷過若干次的自然選擇以后,剩下的解中是有問題的最優(yōu)解的。當然,只能說有最優(yōu)解的概率很大。這里,我們用遺傳算法求一個函數(shù)的最大值。

f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 = x = 10

1、將自變量x進行編碼

取基因片段的長度為10, 則10位二進制位可以表示的范圍是0到1023?;蚺c自變量轉變的公式是x = b2d(individual) * 10 / 1023。構造初始的種群pop。每個個體的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

2、計算目標函數(shù)值

根據(jù)自變量與基因的轉化關系式,求出每個個體的基因對應的自變量,然后將自變量代入函數(shù)f(x),求出每個個體的目標函數(shù)值。

3、適應度函數(shù)

適應度函數(shù)是用來評估個體適應環(huán)境的能力,是進行自然選擇的依據(jù)。本題的適應度函數(shù)直接將目標函數(shù)值中的負值變成0. 因為我們求的是最大值,所以要使目標函數(shù)值是負數(shù)的個體不適應環(huán)境,使其繁殖后代的能力為0.適應度函數(shù)的作用將在自然選擇中體現(xiàn)。

4、自然選擇

自然選擇的思想不再贅述,操作使用輪盤賭算法。其具體步驟:

假設種群中共5個個體,適應度函數(shù)計算出來的個體適應性列表是fitvalue = [1 ,3, 0, 2, 4] ,totalvalue = 10 , 如果將fitvalue畫到圓盤上,值的大小表示在圓盤上的面積。在轉動輪盤的過程中,單個模塊的面積越大則被選中的概率越大。選擇的方法是將fitvalue轉化為[1 , 4 ,4 , 6 ,10], fitvalue / totalvalue = [0.1 , 0.4 , 0.4 , 0.6 , 1.0] . 然后產(chǎn)生5個0-1之間的隨機數(shù),將隨機數(shù)從小到大排序,假如是[0.05 , 0.2 , 0.7 , 0.8 ,0.9],則將0號個體、1號個體、4號個體、4號個體、4號個體拷貝到新種群中。自然選擇的結果使種群更符合條件了。

5、繁殖

假設個體a、b的基因是

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]

b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

這兩個個體發(fā)生基因交換的概率pc = 0.6.如果要發(fā)生基因交換,則產(chǎn)生一個隨機數(shù)point表示基因交換的位置,假設point = 4,則:

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]

b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

交換后為:

a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]

b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]

6、突變

遍歷每一個個體,基因的每一位發(fā)生突變(0變?yōu)?,1變?yōu)?)的概率為0.001.突變可以增加解空間

二、代碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

def b2d(b): #將二進制轉化為十進制 x∈[0,10] t = 0 for j in range(len(b)): t += b[j] * (math.pow(2, j)) t = t * 10 / 1023 return tpopsize = 50 #種群的大小#用遺傳算法求函數(shù)最大值:#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]chromlength = 10 #基因片段的長度pc = 0.6 #兩個個體交叉的概率pm = 0.001; #基因突變的概率results = [[]]bestindividual = []bestfit = 0fitvalue = []tempop = [[]]pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(popsize)]for i in range(100): #繁殖100代 objvalue = calobjvalue(pop) #計算目標函數(shù)值 fitvalue = calfitvalue(objvalue); #計算個體的適應值 [bestindividual, bestfit] = best(pop, fitvalue) #選出最好的個體和最好的函數(shù)值 results.append([bestfit,b2d(bestindividual)]) #每次繁殖,將最好的結果記錄下來 selection(pop, fitvalue) #自然選擇,淘汰掉一部分適應性低的個體 crossover(pop, pc) #交叉繁殖 mutation(pop, pc) #基因突變 results.sort() print(results[-1]) #打印函數(shù)最大值和對應的

來自CODE的代碼片

GA.py

1

2

3

4

5

6

7

8

9

def best(pop, fitvalue): #找出適應函數(shù)值中最大值,和對應的個體 px = len(pop) bestindividual = [] bestfit = fitvalue[0] for i in range(1,px): if(fitvalue[i] bestfit): bestfit = fitvalue[i] bestindividual = pop[i] return [bestindividual, bestfit]

來自CODE的代碼片

best.py

1

2

3

4

5

6

7

8

9

10

11

def calfitvalue(objvalue):#轉化為適應值,目標函數(shù)值越大越好,負值淘汰。 fitvalue = [] temp = 0.0 Cmin = 0; for i in range(len(objvalue)): if(objvalue[i] + Cmin 0): temp = Cmin + objvalue[i] else: temp = 0.0 fitvalue.append(temp) return fitvalue

來自CODE的代碼片

calfitvalue.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import mathdef decodechrom(pop): #將種群的二進制基因轉化為十進制(0,1023) temp = []; for i in range(len(pop)): t = 0; for j in range(10): t += pop[i][j] * (math.pow(2, j)) temp.append(t) return tempdef calobjvalue(pop): #計算目標函數(shù)值 temp1 = []; objvalue = []; temp1 = decodechrom(pop) for i in range(len(temp1)): x = temp1[i] * 10 / 1023 #(0,1023)轉化為 (0,10) objvalue.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) return objvalue #目標函數(shù)值objvalue[m] 與個體基因 pop[m] 對應

來自CODE的代碼片

calobjvalue.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import randomdef crossover(pop, pc): #個體間交叉,實現(xiàn)基因交換 poplen = len(pop) for i in range(poplen - 1): if(random.random() pc): cpoint = random.randint(0,len(pop[0])) temp1 = [] temp2 = [] temp1.extend(pop[i][0 : cpoint]) temp1.extend(pop[i+1][cpoint : len(pop[i])]) temp2.extend(pop[i+1][0 : cpoint]) temp2.extend(pop[i][cpoint : len(pop[i])]) pop[i] = temp1 pop[i+1] = temp2

來自CODE的代碼片

crossover.py

1

2

3

4

5

6

7

8

9

10

11

12

13

import randomdef mutation(pop, pm): #基因突變 px = len(pop) py = len(pop[0]) for i in range(px): if(random.random() pm): mpoint = random.randint(0,py-1) if(pop[i][mpoint] == 1): pop[i][mpoint] = 0 else: pop[i][mpoint] = 1

來自CODE的代碼片

mutation.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

import randomdef sum(fitvalue): total = 0 for i in range(len(fitvalue)): total += fitvalue[i] return totaldef cumsum(fitvalue): for i in range(len(fitvalue)): t = 0; j = 0; while(j = i): t += fitvalue[j] j = j + 1 fitvalue[i] = t;def selection(pop, fitvalue): #自然選擇(輪盤賭算法) newfitvalue = [] totalfit = sum(fitvalue) for i in range(len(fitvalue)): newfitvalue.append(fitvalue[i] / totalfit) cumsum(newfitvalue) ms = []; poplen = len(pop) for i in range(poplen): ms.append(random.random()) #random float list ms ms.sort() fitin = 0 newin = 0 newpop = pop while newin poplen: if(ms[newin] newfitvalue[fitin]): newpop[newin] = pop[fitin] newin = newin + 1 else: fitin = fitin + 1 pop = newpop

萬字教你如何用 Python 實現(xiàn)線性規(guī)劃

想象一下,您有一個線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學和計算工具,可讓您找到該系統(tǒng)的特定解,該解對應于某些其他線性函數(shù)的最大值或最小值。

混合整數(shù)線性規(guī)劃是 線性規(guī)劃 的擴展。它處理至少一個變量采用離散整數(shù)而不是連續(xù)值的問題。盡管乍一看混合整數(shù)問題與連續(xù)變量問題相似,但它們在靈活性和精度方面具有顯著優(yōu)勢。

整數(shù)變量對于正確表示自然用整數(shù)表示的數(shù)量很重要,例如生產(chǎn)的飛機數(shù)量或服務的客戶數(shù)量。

一種特別重要的整數(shù)變量是 二進制變量 。它只能取 零 或 一 的值,在做出是或否的決定時很有用,例如是否應該建造工廠或者是否應該打開或關閉機器。您還可以使用它們來模擬邏輯約束。

線性規(guī)劃是一種基本的優(yōu)化技術,已在科學和數(shù)學密集型領域使用了數(shù)十年。它精確、相對快速,適用于一系列實際應用。

混合整數(shù)線性規(guī)劃允許您克服線性規(guī)劃的許多限制。您可以使用分段線性函數(shù)近似非線性函數(shù)、使用半連續(xù)變量、模型邏輯約束等。它是一種計算密集型工具,但計算機硬件和軟件的進步使其每天都更加適用。

通常,當人們試圖制定和解決優(yōu)化問題時,第一個問題是他們是否可以應用線性規(guī)劃或混合整數(shù)線性規(guī)劃。

以下文章說明了線性規(guī)劃和混合整數(shù)線性規(guī)劃的一些用例:

隨著計算機能力的增強、算法的改進以及更多用戶友好的軟件解決方案的出現(xiàn),線性規(guī)劃,尤其是混合整數(shù)線性規(guī)劃的重要性隨著時間的推移而增加。

解決線性規(guī)劃問題的基本方法稱為,它有多種變體。另一種流行的方法是。

混合整數(shù)線性規(guī)劃問題可以通過更復雜且計算量更大的方法來解決,例如,它在幕后使用線性規(guī)劃。這種方法的一些變體是,它涉及使用 切割平面 ,以及。

有幾種適用于線性規(guī)劃和混合整數(shù)線性規(guī)劃的合適且眾所周知的 Python 工具。其中一些是開源的,而另一些是專有的。您是否需要免費或付費工具取決于問題的規(guī)模和復雜性,以及對速度和靈活性的需求。

值得一提的是,幾乎所有廣泛使用的線性規(guī)劃和混合整數(shù)線性規(guī)劃庫都是以 Fortran 或 C 或 C++ 原生和編寫的。這是因為線性規(guī)劃需要對(通常很大)矩陣進行計算密集型工作。此類庫稱為求解器。Python 工具只是求解器的包裝器。

Python 適合圍繞本機庫構建包裝器,因為它可以很好地與 C/C++ 配合使用。對于本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有關此酷功能的更多信息,請查看以下資源:

基本上,當您定義和求解模型時,您使用 Python 函數(shù)或方法調(diào)用低級庫,該庫執(zhí)行實際優(yōu)化工作并將解決方案返回給您的 Python 對象。

幾個免費的 Python 庫專門用于與線性或混合整數(shù)線性規(guī)劃求解器交互:

在本教程中,您將使用SciPy和PuLP來定義和解決線性規(guī)劃問題。

在本節(jié)中,您將看到線性規(guī)劃問題的兩個示例:

您將在下一節(jié)中使用 Python 來解決這兩個問題。

考慮以下線性規(guī)劃問題:

你需要找到X和?使得紅色,藍色和黃色的不平等,以及不平等X 0和? 0,是滿意的。同時,您的解決方案必須對應于z的最大可能值。

您需要找到的自變量(在本例中為 x 和 y )稱為 決策變量 。要最大化或最小化的決策變量的函數(shù)(在本例中為 z) 稱為 目標函數(shù) 、 成本函數(shù) 或僅稱為 目標 。您需要滿足的 不等式 稱為 不等式約束 。您還可以在稱為 等式約束 的約束中使用方程。

這是您如何可視化問題的方法:

紅線代表的功能2 X + Y = 20,和它上面的紅色區(qū)域示出了紅色不等式不滿足。同樣,藍線是函數(shù) 4 x + 5 y = 10,藍色區(qū)域被禁止,因為它違反了藍色不等式。黃線是 x + 2 y = 2,其下方的黃色區(qū)域是黃色不等式無效的地方。

如果您忽略紅色、藍色和黃色區(qū)域,則僅保留灰色區(qū)域?;疑珔^(qū)域的每個點都滿足所有約束,是問題的潛在解決方案。該區(qū)域稱為 可行域 ,其點為 可行解 。在這種情況下,有無數(shù)可行的解決方案。

您想最大化z。對應于最大z的可行解是 最優(yōu)解 。如果您嘗試最小化目標函數(shù),那么最佳解決方案將對應于其可行的最小值。

請注意,z是線性的。你可以把它想象成一個三維空間中的平面。這就是為什么最優(yōu)解必須在可行區(qū)域的 頂點 或角上的原因。在這種情況下,最佳解決方案是紅線和藍線相交的點,稍后您將看到。

有時,可行區(qū)域的整個邊緣,甚至整個區(qū)域,都可以對應相同的z值。在這種情況下,您有許多最佳解決方案。

您現(xiàn)在已準備好使用綠色顯示的附加等式約束來擴展問題:

方程式 x + 5 y = 15,以綠色書寫,是新的。這是一個等式約束。您可以通過向上一張圖像添加相應的綠線來將其可視化:

現(xiàn)在的解決方案必須滿足綠色等式,因此可行區(qū)域不再是整個灰色區(qū)域。它是綠線從與藍線的交點到與紅線的交點穿過灰色區(qū)域的部分。后一點是解決方案。

如果插入x的所有值都必須是整數(shù)的要求,那么就會得到一個混合整數(shù)線性規(guī)劃問題,可行解的集合又會發(fā)生變化:

您不再有綠線,只有沿線的x值為整數(shù)的點??尚薪馐腔疑尘吧系木G點,此時最優(yōu)解離紅線最近。

這三個例子說明了 可行的線性規(guī)劃問題 ,因為它們具有有界可行區(qū)域和有限解。

如果沒有解,線性規(guī)劃問題是 不可行的 。當沒有解決方案可以同時滿足所有約束時,通常會發(fā)生這種情況。

例如,考慮如果添加約束x + y 1會發(fā)生什么。那么至少有一個決策變量(x或y)必須是負數(shù)。這與給定的約束x 0 和y 0相沖突。這樣的系統(tǒng)沒有可行的解決方案,因此稱為不可行的。

另一個示例是添加與綠線平行的第二個等式約束。這兩行沒有共同點,因此不會有滿足這兩個約束的解決方案。

一個線性規(guī)劃問題是 無界的 ,如果它的可行區(qū)域是無界,將溶液不是有限。這意味著您的變量中至少有一個不受約束,可以達到正無窮大或負無窮大,從而使目標也無限大。

例如,假設您采用上面的初始問題并刪除紅色和黃色約束。從問題中刪除約束稱為 放松 問題。在這種情況下,x和y不會在正側有界。您可以將它們增加到正無窮大,從而產(chǎn)生無限大的z值。

在前面的部分中,您研究了一個與任何實際應用程序無關的抽象線性規(guī)劃問題。在本小節(jié)中,您將找到與制造業(yè)資源分配相關的更具體和實用的優(yōu)化問題。

假設一家工廠生產(chǎn)四種不同的產(chǎn)品,第一種產(chǎn)品的日產(chǎn)量為x ?,第二種產(chǎn)品的產(chǎn)量為x 2,依此類推。目標是確定每種產(chǎn)品的利潤最大化日產(chǎn)量,同時牢記以下條件:

數(shù)學模型可以這樣定義:

目標函數(shù)(利潤)在條件 1 中定義。人力約束遵循條件 2。對原材料 A 和 B 的約束可以從條件 3 和條件 4 中通過對每種產(chǎn)品的原材料需求求和得出。

最后,產(chǎn)品數(shù)量不能為負,因此所有決策變量必須大于或等于零。

與前面的示例不同,您無法方便地將其可視化,因為它有四個決策變量。但是,無論問題的維度如何,原理都是相同的。

在本教程中,您將使用兩個Python 包來解決上述線性規(guī)劃問題:

SciPy 設置起來很簡單。安裝后,您將擁有開始所需的一切。它的子包 scipy.optimize 可用于線性和非線性優(yōu)化。

PuLP 允許您選擇求解器并以更自然的方式表述問題。PuLP 使用的默認求解器是COIN-OR Branch and Cut Solver (CBC)。它連接到用于線性松弛的COIN-OR 線性規(guī)劃求解器 (CLP)和用于切割生成的COIN-OR 切割生成器庫 (CGL)。

另一個偉大的開源求解器是GNU 線性規(guī)劃工具包 (GLPK)。一些著名且非常強大的商業(yè)和專有解決方案是Gurobi、CPLEX和XPRESS。

除了在定義問題時提供靈活性和運行各種求解器的能力外,PuLP 使用起來不如 Pyomo 或 CVXOPT 等替代方案復雜,后者需要更多的時間和精力來掌握。

要學習本教程,您需要安裝 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。

您可以使用pip以下方法安裝兩者:

您可能需要運行pulptest或sudo pulptest啟用 PuLP 的默認求解器,尤其是在您使用 Linux 或 Mac 時:

或者,您可以下載、安裝和使用 GLPK。它是免費和開源的,適用于 Windows、MacOS 和 Linux。在本教程的后面部分,您將看到如何將 GLPK(除了 CBC)與 PuLP 一起使用。

在 Windows 上,您可以下載檔案并運行安裝文件。

在 MacOS 上,您可以使用 Homebrew:

在 Debian 和 Ubuntu 上,使用apt來安裝glpk和glpk-utils:

在Fedora,使用dnf具有glpk-utils:

您可能還會發(fā)現(xiàn)conda對安裝 GLPK 很有用:

安裝完成后,可以查看GLPK的版本:

有關詳細信息,請參閱 GLPK 關于使用Windows 可執(zhí)行文件和Linux 軟件包進行安裝的教程。

在本節(jié)中,您將學習如何使用 SciPy優(yōu)化和求根庫進行線性規(guī)劃。

要使用 SciPy 定義和解決優(yōu)化問題,您需要導入scipy.optimize.linprog():

現(xiàn)在您已經(jīng)linprog()導入,您可以開始優(yōu)化。

讓我們首先解決上面的線性規(guī)劃問題:

linprog()僅解決最小化(而非最大化)問題,并且不允許具有大于或等于符號 ( ) 的不等式約束。要解決這些問題,您需要在開始優(yōu)化之前修改您的問題:

引入這些更改后,您將獲得一個新系統(tǒng):

該系統(tǒng)與原始系統(tǒng)等效,并且將具有相同的解決方案。應用這些更改的唯一原因是克服 SciPy 與問題表述相關的局限性。

下一步是定義輸入值:

您將上述系統(tǒng)中的值放入適當?shù)牧斜?、元組或NumPy 數(shù)組中:

注意:請注意行和列的順序!

約束左側和右側的行順序必須相同。每一行代表一個約束。

來自目標函數(shù)和約束左側的系數(shù)的順序必須匹配。每列對應一個決策變量。

下一步是以與系數(shù)相同的順序定義每個變量的界限。在這種情況下,它們都在零和正無窮大之間:

此語句是多余的,因為linprog()默認情況下采用這些邊界(零到正無窮大)。

注:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。

最后,是時候優(yōu)化和解決您感興趣的問題了。你可以這樣做linprog():

參數(shù)c是指來自目標函數(shù)的系數(shù)。A_ub和b_ub分別與不等式約束左邊和右邊的系數(shù)有關。同樣,A_eq并b_eq參考等式約束。您可以使用bounds提供決策變量的下限和上限。

您可以使用該參數(shù)method來定義要使用的線性規(guī)劃方法。有以下三種選擇:

linprog() 返回具有以下屬性的數(shù)據(jù)結構:

您可以分別訪問這些值:

這就是您獲得優(yōu)化結果的方式。您還可以以圖形方式顯示它們:

如前所述,線性規(guī)劃問題的最優(yōu)解位于可行區(qū)域的頂點。在這種情況下,可行區(qū)域只是藍線和紅線之間的綠線部分。最優(yōu)解是代表綠線和紅線交點的綠色方塊。

如果要排除相等(綠色)約束,只需刪除參數(shù)A_eq并b_eq從linprog()調(diào)用中刪除:

解決方案與前一種情況不同。你可以在圖表上看到:

在這個例子中,最優(yōu)解是紅色和藍色約束相交的可行(灰色)區(qū)域的紫色頂點。其他頂點,如黃色頂點,具有更高的目標函數(shù)值。

您可以使用 SciPy 來解決前面部分所述的資源分配問題:

和前面的例子一樣,你需要從上面的問題中提取必要的向量和矩陣,將它們作為參數(shù)傳遞給.linprog(),然后得到結果:

結果告訴您最大利潤是1900并且對應于x ? = 5 和x ? = 45。在給定條件下生產(chǎn)第二和第四個產(chǎn)品是沒有利潤的。您可以在這里得出幾個有趣的結論:

opt.statusis0和opt.successis True,說明優(yōu)化問題成功求解,最優(yōu)可行解。

SciPy 的線性規(guī)劃功能主要用于較小的問題。對于更大和更復雜的問題,您可能會發(fā)現(xiàn)其他庫更適合,原因如下:

幸運的是,Python 生態(tài)系統(tǒng)為線性編程提供了幾種替代解決方案,這些解決方案對于更大的問題非常有用。其中之一是 PuLP,您將在下一節(jié)中看到它的實際應用。

PuLP 具有比 SciPy 更方便的線性編程 API。您不必在數(shù)學上修改您的問題或使用向量和矩陣。一切都更干凈,更不容易出錯。

像往常一樣,您首先導入您需要的內(nèi)容:

現(xiàn)在您已經(jīng)導入了 PuLP,您可以解決您的問題。

您現(xiàn)在將使用 PuLP 解決此系統(tǒng):

第一步是初始化一個實例LpProblem來表示你的模型:

您可以使用該sense參數(shù)來選擇是執(zhí)行最小化(LpMinimize或1,這是默認值)還是最大化(LpMaximize或-1)。這個選擇會影響你的問題的結果。

一旦有了模型,就可以將決策變量定義為LpVariable類的實例:

您需要提供下限,lowBound=0因為默認值為負無窮大。該參數(shù)upBound定義了上限,但您可以在此處省略它,因為它默認為正無窮大。

可選參數(shù)cat定義決策變量的類別。如果您使用的是連續(xù)變量,則可以使用默認值"Continuous"。

您可以使用變量x和y創(chuàng)建表示線性表達式和約束的其他 PuLP 對象:

當您將決策變量與標量相乘或構建多個決策變量的線性組合時,您會得到一個pulp.LpAffineExpression代表線性表達式的實例。

注意:您可以增加或減少變量或表達式,你可以乘他們常數(shù),因為紙漿類實現(xiàn)一些Python的特殊方法,即模擬數(shù)字類型一樣__add__(),__sub__()和__mul__()。這些方法用于像定制運營商的行為+,-和*。

類似地,您可以將線性表達式、變量和標量與運算符 ==、=以獲取表示模型線性約束的紙漿.LpConstraint實例。

注:也有可能與豐富的比較方法來構建的約束.__eq__(),.__le__()以及.__ge__()定義了運營商的行為==,=。

考慮到這一點,下一步是創(chuàng)建約束和目標函數(shù)并將它們分配給您的模型。您不需要創(chuàng)建列表或矩陣。只需編寫 Python 表達式并使用+=運算符將它們附加到模型中:

在上面的代碼中,您定義了包含約束及其名稱的元組。LpProblem允許您通過將約束指定為元組來向模型添加約束。第一個元素是一個LpConstraint實例。第二個元素是該約束的可讀名稱。

設置目標函數(shù)非常相似:

或者,您可以使用更短的符號:

現(xiàn)在您已經(jīng)添加了目標函數(shù)并定義了模型。

注意:您可以使用運算符將 約束或目標附加到模型中,+=因為它的類LpProblem實現(xiàn)了特殊方法.__iadd__(),該方法用于指定 的行為+=。

對于較大的問題,lpSum()與列表或其他序列一起使用通常比重復+運算符更方便。例如,您可以使用以下語句將目標函數(shù)添加到模型中:

它產(chǎn)生與前一條語句相同的結果。

您現(xiàn)在可以看到此模型的完整定義:

模型的字符串表示包含所有相關數(shù)據(jù):變量、約束、目標及其名稱。

注意:字符串表示是通過定義特殊方法構建的.__repr__()。有關 的更多詳細信息.__repr__(),請查看Pythonic OOP 字符串轉換:__repr__vs__str__ .

最后,您已準備好解決問題。你可以通過調(diào)用.solve()你的模型對象來做到這一點。如果要使用默認求解器 (CBC),則不需要傳遞任何參數(shù):

.solve()調(diào)用底層求解器,修改model對象,并返回解決方案的整數(shù)狀態(tài),1如果找到了最優(yōu)解。有關其余狀態(tài)代碼,請參閱LpStatus[]。

你可以得到優(yōu)化結果作為 的屬性model。該函數(shù)value()和相應的方法.value()返回屬性的實際值:

model.objective持有目標函數(shù)model.constraints的值,包含松弛變量的值,以及對象x和y具有決策變量的最優(yōu)值。model.variables()返回一個包含決策變量的列表:

如您所見,此列表包含使用 的構造函數(shù)創(chuàng)建的確切對象LpVariable。

結果與您使用 SciPy 獲得的結果大致相同。

注意:注意這個方法.solve()——它會改變對象的狀態(tài),x并且y!

您可以通過調(diào)用查看使用了哪個求解器.solver:

輸出通知您求解器是 CBC。您沒有指定求解器,因此 PuLP 調(diào)用了默認求解器。

如果要運行不同的求解器,則可以將其指定為 的參數(shù).solve()。例如,如果您想使用 GLPK 并且已經(jīng)安裝了它,那么您可以solver=GLPK(msg=False)在最后一行使用。請記住,您還需要導入它:

現(xiàn)在你已經(jīng)導入了 GLPK,你可以在里面使用它.solve():

該msg參數(shù)用于顯示來自求解器的信息。msg=False禁用顯示此信息。如果要包含信息,則只需省略msg或設置msg=True。

您的模型已定義并求解,因此您可以按照與前一種情況相同的方式檢查結果:

使用 GLPK 得到的結果與使用 SciPy 和 CBC 得到的結果幾乎相同。

一起來看看這次用的是哪個求解器:

正如您在上面用突出顯示的語句定義的那樣model.solve(solver=GLPK(msg=False)),求解器是 GLPK。

您還可以使用 PuLP 來解決混合整數(shù)線性規(guī)劃問題。要定義整數(shù)或二進制變量,只需傳遞cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不變:

在本例中,您有一個整數(shù)變量并獲得與之前不同的結果:

Nowx是一個整數(shù),如模型中所指定。(從技術上講,它保存一個小數(shù)點后為零的浮點值。)這一事實改變了整個解決方案。讓我們在圖表上展示這一點:

如您所見,最佳解決方案是灰色背景上最右邊的綠點。這是兩者的最大價值的可行的解決方案x和y,給它的最大目標函數(shù)值。

GLPK 也能夠解決此類問題。

現(xiàn)在你可以使用 PuLP 來解決上面的資源分配問題:

定義和解決問題的方法與前面的示例相同:

在這種情況下,您使用字典 x來存儲所有決策變量。這種方法很方便,因為字典可以將決策變量的名稱或索引存儲為鍵,將相應的LpVariable對象存儲為值。列表或元組的LpVariable實例可以是有用的。

上面的代碼產(chǎn)生以下結果:

如您所見,該解決方案與使用 SciPy 獲得的解決方案一致。最有利可圖的解決方案是每天生產(chǎn)5.0第一件產(chǎn)品和45.0第三件產(chǎn)品。

讓我們把這個問題變得更復雜和有趣。假設由于機器問題,工廠無法同時生產(chǎn)第一種和第三種產(chǎn)品。在這種情況下,最有利可圖的解決方案是什么?

現(xiàn)在您有另一個邏輯約束:如果x ? 為正數(shù),則x ? 必須為零,反之亦然。這是二元決策變量非常有用的地方。您將使用兩個二元決策變量y ? 和y ?,它們將表示是否生成了第一個或第三個產(chǎn)品:

除了突出顯示的行之外,代碼與前面的示例非常相似。以下是差異:

這是解決方案:

事實證明,最佳方法是排除第一種產(chǎn)品而只生產(chǎn)第三種產(chǎn)品。

就像有許多資源可以幫助您學習線性規(guī)劃和混合整數(shù)線性規(guī)劃一樣,還有許多具有 Python 包裝器的求解器可用。這是部分列表:

其中一些庫,如 Gurobi,包括他們自己的 Python 包裝器。其他人使用外部包裝器。例如,您看到可以使用 PuLP 訪問 CBC 和 GLPK。

您現(xiàn)在知道什么是線性規(guī)劃以及如何使用 Python 解決線性規(guī)劃問題。您還了解到 Python 線性編程庫只是本機求解器的包裝器。當求解器完成其工作時,包裝器返回解決方案狀態(tài)、決策變量值、松弛變量、目標函數(shù)等。

Python中冷門但非常好用的內(nèi)置函數(shù)

Python中有許多內(nèi)置函數(shù),不像print、len那么廣為人知,但它們的功能卻異常強大,用好了可以大大提高代碼效率,同時提升代碼的簡潔度,增強可閱讀性

Counter

collections在python官方文檔中的解釋是High-performance container datatypes,直接的中文翻譯解釋高性能容量數(shù)據(jù)類型。這個模塊實現(xiàn)了特定目標的容器,以提供Python標準內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇。在python3.10.1中它總共包含以下幾種數(shù)據(jù)類型:

容器名簡介

namedtuple() 創(chuàng)建命名元組子類的工廠函數(shù)

deque 類似列表(list)的容器,實現(xiàn)了在兩端快速添加(append)和彈出(pop)

ChainMap 類似字典(dict)的容器類,將多個映射集合到一個視圖里面

Counter 字典的子類,提供了可哈希對象的計數(shù)功能

OrderedDict 字典的子類,保存了他們被添加的順序

defaultdict 字典的子類,提供了一個工廠函數(shù),為字典查詢提供一個默認值

UserDict 封裝了字典對象,簡化了字典子類化

UserList 封裝了列表對象,簡化了列表子類化

UserString 封裝了字符串對象,簡化了字符串子類化

其中Counter中文意思是計數(shù)器,也就是我們常用于統(tǒng)計的一種數(shù)據(jù)類型,在使用Counter之后可以讓我們的代碼更加簡單易讀。Counter類繼承dict類,所以它能使用dict類里面的方法

舉例

#統(tǒng)計詞頻

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

result = {}

for fruit in fruits:

if not result.get(fruit):

result[fruit] = 1

else:

result[fruit] += 1

print(result)

#{'apple': 2, 'peach': 3, 'lemon': 1}下面我們看用Counter怎么實現(xiàn):

from collections import Counter

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

c = Counter(fruits)

print(dict(c))

#{'apple': 2, 'peach': 3, 'lemon': 1}顯然代碼更加簡單了,也更容易閱讀和維護了。

elements()

返回一個迭代器,其中每個元素將重復出現(xiàn)計數(shù)值所指定次。元素會按首次出現(xiàn)的順序返回。如果一個元素的計數(shù)值小于1,elements()將會忽略它。

c = Counter(a=4, b=2, c=0, d=-2)

sorted(c.elements())

['a', 'a', 'a', 'a', 'b', 'b']most_common([n])

返回一個列表,其中包含n個最常見的元素及出現(xiàn)次數(shù),按常見程度由高到低排序。如果n被省略或為None,most_common()將返回計數(shù)器中的所有元素。計數(shù)值相等的元素按首次出現(xiàn)的順序排序:

Counter('abracadabra').most_common(3)

[('a', 5), ('b', 2), ('r', 2)]這兩個方法是Counter中最常用的方法,其他方法可以參考 python3.10.1官方文檔

實戰(zhàn)

Leetcode 1002.查找共用字符

給你一個字符串數(shù)組words,請你找出所有在words的每個字符串中都出現(xiàn)的共用字符(包括重復字符),并以數(shù)組形式返回。你可以按任意順序返回答案。

輸入:words = ["bella", "label", "roller"]

輸出:["e", "l", "l"]

輸入:words = ["cool", "lock", "cook"]

輸出:["c", "o"]看到統(tǒng)計字符,典型的可以用Counter完美解決。這道題是找出字符串列表里面每個元素都包含的字符,首先可以用Counter計算出每個元素每個字符出現(xiàn)的次數(shù),依次取交集最后得出所有元素共同存在的字符,然后利用elements輸出共用字符出現(xiàn)的次數(shù)

class Solution:

def commonChars(self, words: List[str]) - List[str]:

from collections import Counter

ans = Counter(words[0])

for i in words[1:]:

ans = Counter(i)

return list(ans.elements())提交一下,發(fā)現(xiàn)83個測試用例耗時48ms,速度還是不錯的

sorted

在處理數(shù)據(jù)過程中,我們經(jīng)常會用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時候就需要用到sorted(),它可以對任何可迭代對象進行排序,并返回列表

對列表升序操作:

a = sorted([2, 4, 3, 7, 1, 9])

print(a)

# 輸出:[1, 2, 3, 4, 7, 9]對元組倒序操作:

sorted((4,1,9,6),reverse=True)

print(a)

# 輸出:[9, 6, 4, 1]使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長度來排序:

fruits = ['apple', 'watermelon', 'pear', 'banana']

a = sorted(fruits, key = lambda x : len(x))

print(a)

# 輸出:['pear', 'apple', 'banana', 'watermelon']all

all() 函數(shù)用于判斷給定的可迭代參數(shù)iterable中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。元素除了是 0、空、None、False外都算True。注意:空元組、空列表返回值為True。

all(['a', 'b', 'c', 'd']) # 列表list,元素都不為空或0

True

all(['a', 'b', '', 'd']) # 列表list,存在一個為空的元素

False

all([0, 1,2, 3]) # 列表list,存在一個為0的元素

False

all(('a', 'b', 'c', 'd')) # 元組tuple,元素都不為空或0

True

all(('a', 'b', '', 'd')) # 元組tuple,存在一個為空的元素

False

all((0, 1, 2, 3)) # 元組tuple,存在一個為0的元素

False

all([]) # 空列表

True

all(()) # 空元組

Trueany函數(shù)正好和all函數(shù)相反:判斷一個tuple或者list是否全為空,0,F(xiàn)alse。如果全為空,0,F(xiàn)alse,則返回False;如果不全為空,則返回True。

F-strings

在python3.6.2版本中,PEP 498提出一種新型字符串格式化機制,被稱為 “字符串插值” 或者更常見的一種稱呼是F-strings,F(xiàn)-strings提供了一種明確且方便的方式將python表達式嵌入到字符串中來進行格式化:

s1='Hello'

s2='World'

print(f'{s1} {s2}!')

# Hello World!在F-strings中我們也可以執(zhí)行函數(shù):

def power(x):

return x*x

x=4

print(f'{x} * {x} = {power(x)}')

# 4 * 4 = 16而且F-strings的運行速度很快,比傳統(tǒng)的%-string和str.format()這兩種格式化方法都快得多,書寫起來也更加簡單。

本文主要講解了python幾種冷門但好用的函數(shù),更多內(nèi)容以后會陸陸續(xù)續(xù)更新~

Python基礎實戰(zhàn)之函數(shù)的參數(shù)講解(三)

參數(shù)可以是任意類型。

比如可以是列表。

-------------------------------

library=['python精通','MySQL','數(shù)據(jù)分析','人工智能']

#形參

def add_book(bookname):

library.append(bookname)

print('圖書添加成功!')

pass

def show_book(books):

for book in books:

print(book)

pass

pass

#調(diào)用函數(shù)

add_book('新概念英語')

show_book(library)

------------------------------

#輸出列表中所有大于50的數(shù)

list1=[23,45,77,88,58,10]

def get_list(list_1):

new_list=[ ]

for e in list_1:

if e=50:

new_list.append(e)

pass

pass

print(new_list)

pass

#調(diào)用函數(shù)

get_list(list1) #[77,88,58]

------------------------------

#刪除列表中小于50的數(shù)

def remove_from_list(list_1):

n=0

while nlen(list_1): p="" /len(list_1):

if list_1[n]50:

list_1.remove(list_1[n])

pass

else:

n+=1

pass

pass

print(list_1)

pass

#調(diào)用函數(shù)

remove_from_list(list1) #[77,88,58]

python需要學習什么內(nèi)容?

Python的學習內(nèi)容還是比較多的,我們將學習的過程劃分為4個階段,每個階段學習對應的內(nèi)容,具體的學習順序如下:

Python學習順序:

①Python軟件開發(fā)基礎

掌握計算機的構成和工作原理

會使用Linux常用工具

熟練使用Docker的基本命令

建立Python開發(fā)環(huán)境,并使用print輸出

使用Python完成字符串的各種操作

使用Python re模塊進行程序設計

使用Python創(chuàng)建文件、訪問、刪除文件

掌握import 語句、From…import 語句、From…import* 語句、方法的引用、Python中的包

②Python軟件開發(fā)進階

能夠使用Python面向對象方法開發(fā)軟件

能夠自己建立數(shù)據(jù)庫,表,并進行基本數(shù)據(jù)庫操作

掌握非關系數(shù)據(jù)庫MongoDB的使用,掌握Redis開發(fā)

能夠獨立完成TCP/UDP服務端客戶端軟件開發(fā),能夠實現(xiàn)ftp、http服務器,開發(fā)郵件軟件

能開發(fā)多進程、多線程軟件

③Python全棧式WEB工程師

能夠獨立完成后端軟件開發(fā),深入理解Python開發(fā)后端的精髓

能夠獨立完成前端軟件開發(fā),并和后端結合,熟練掌握使用Python進行全站W(wǎng)eb開發(fā)的技巧

④Python多領域開發(fā)

能夠使用Python熟練編寫爬蟲軟件

能夠熟練使用Python庫進行數(shù)據(jù)分析

招聘網(wǎng)站Python招聘職位數(shù)據(jù)爬取分析

掌握使用Python開源人工智能框架進行人工智能軟件開發(fā)、語音識別、人臉識別

掌握基本設計模式、常用算法

掌握軟件工程、項目管理、項目文檔、軟件測試調(diào)優(yōu)的基本方法

互聯(lián)網(wǎng)行業(yè)目前還是最熱門的行業(yè)之一,學習IT技能之后足夠優(yōu)秀是有機會進入騰訊、阿里、網(wǎng)易等互聯(lián)網(wǎng)大廠高薪就業(yè)的,發(fā)展前景非常好,普通人也可以學習。

想要系統(tǒng)學習,你可以考察對比一下開設有相關專業(yè)的熱門學校,好的學校擁有根據(jù)當下企業(yè)需求自主研發(fā)課程的能力,中博軟件學院、南京課工場、南京北大青鳥等開設python專業(yè)的學校都是不錯的,建議實地考察對比一下。

祝你學有所成,望采納。

請點擊輸入圖片描述

學習多目標優(yōu)化需要掌握哪些python知識

多目標優(yōu)化

目標優(yōu)化問題一般地就是指通過一定的優(yōu)化算法獲得目標函數(shù)的最優(yōu)化解。當優(yōu)化的目標函數(shù)為一個時稱之為單目標優(yōu)化(Single-

objective Optimization Problem,

SOP)。當優(yōu)化的目標函數(shù)有兩個或兩個以上時稱為多目標優(yōu)化(Multi-objective Optimization Problem,

MOP)。不同于單目標優(yōu)化的解為有限解,多目標優(yōu)化的解通常是一組均衡解。

多目標優(yōu)化算法歸結起來有傳統(tǒng)優(yōu)化算法和智能優(yōu)化算法兩大類。

1. 傳統(tǒng)優(yōu)化算法包括加權法、約束法和線性規(guī)劃法等,實質(zhì)上就是將多目標函數(shù)轉化為單目標函數(shù),通過采用單目標優(yōu)化的方法達到對多目標函數(shù)的求解。

2. 智能優(yōu)化算法包括進化算法(Evolutionary Algorithm, 簡稱EA)、粒子群算法(Particle Swarm Optimization, PSO)等。

Pareto最優(yōu)解:

若x*∈C*,且在C中不存在比x更優(yōu)越的解x,則稱x*是多目標最優(yōu)化模型式的Pareto最優(yōu)解,又稱為有效解。

一般來說,多目標優(yōu)化問題并不存在一個最優(yōu)解,所有可能的解都稱為非劣解,也稱為Pareto解。傳統(tǒng)優(yōu)化技術一般每次能得到Pareo解集中的一個,而

用智能算法來求解,可以得到更多的Pareto解,這些解構成了一個最優(yōu)解集,稱為Pareto最優(yōu)解。它是由那些任一個目標函數(shù)值的提高都必須以犧牲其

他目標函數(shù)值為代價的解組成的集合,稱為Pareto最優(yōu)域,簡稱Pareto集。

Pareto有效(最優(yōu))解非劣解集是指由這樣一些解組成的集合:與集合之外的任何解相比它們至少有一個目標函數(shù)比集合之外的解好。

求解多目標優(yōu)化問題最有名的就是NSGA-II了,是多目標遺傳算法,但其對解的選擇過程可以用在其他優(yōu)化算法上,例如粒子群,蜂群等等。這里簡單介紹一下NSGA-II的選擇算法。主要包含三個部分:

1. 快速非支配排序

要先講一下支配的概念,對于解X1和X2,如果X1對應的所有目標函數(shù)都不比X2大(最小問題),且存在一個目標值比X2小,則X2被X1支配。

快速非支配排序是一個循環(huán)分級過程:首先找出群體中的非支配解集,記為第一非支配層,irank=1(irank是個體i的非支配值),將其從群體中除去,繼續(xù)尋找群體中的非支配解集,然后irank=2。

2. 個體擁擠距離

為了使計算結果在目標空間比較均勻的分布,維持種群多樣性,對每個個體計算擁擠距離,選擇擁擠距離大的個體,擁擠距離的定義為:

L[i]d=L[i]d+(L[i+1]m?L[i?1]m)/(fmaxm?fminm)

L[i+1]m是第i+1個個體的第m目標函數(shù)值,fmaxm 和 fminm是集合中第m個目標函數(shù)的最大和最小值。

3. 精英策略選擇

精英策略就是保留父代中的優(yōu)良個體直接進入子代,防止獲得的Pareto最優(yōu)解丟失。將第t次產(chǎn)生的子代種群和父代種群合并,然后對合并后的新種群進行非支配排序,然后按照非支配順序添加到規(guī)模為N的種群中作為新的父代。

網(wǎng)頁名稱:python目標函數(shù)講解 常見目標函數(shù)
文章鏈接:http://jinyejixie.com/article0/hpceoo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設計公司、App設計、關鍵詞優(yōu)化、外貿(mào)建站、小程序開發(fā)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設
讷河市| 静宁县| 横山县| 加查县| 揭阳市| 旅游| 安徽省| 柳州市| 瓮安县| 迭部县| 志丹县| 山丹县| 施秉县| 贵州省| 古丈县| 安溪县| 阿拉善右旗| 中山市| 周口市| 平遥县| 恩平市| 宁河县| 龙南县| 大方县| 浮梁县| 大埔县| 伊宁县| 巴林右旗| 马尔康县| 吉水县| 全南县| 竹山县| 永春县| 萍乡市| 宁晋县| 佛山市| 静安区| 许昌市| 牙克石市| 彭州市| 临朐县|