導航:首頁 > 源碼編譯 > fsp的遺傳演算法實例python

fsp的遺傳演算法實例python

發布時間:2023-01-29 13:15:20

1. python 遺傳演算法問題

遺傳演算法(GA)是最早由美國Holland教授提出的一種基於自然界的「適者生存,優勝劣汰」基本法則的智能搜索演算法。
遺傳演算法也是借鑒該基本法則,通過基於種群的思想,將問題的解通過編碼的方式轉化為種群中的個體,並讓這些個體不斷地通過選擇、交叉和變異運算元模擬生物的進化過程,然後利用「優勝劣汰」法則選擇種群中適應性較強的個體構成子種群,然後讓子種群重復類似的進化過程,直到找到問題的最優解或者到達一定的進化(運算)時間。

2. 使用流行的遺傳演算法python庫是哪個

建議使用由華南農業大學、暨南大學、華南理工大學高校碩博學生聯合團隊推出的Python高性能遺傳和進化演算法工具箱:Geatpy。它是目前進化計算領域與platemo、matlab遺傳演算法工具箱等有相當的權威和影響力的高性能實用型進化演算法工具箱,而其效率和易用性居於領先地位。

目前已得到多所高校研究生實驗室以及企業採用,為相關領域的研究和應用注入了全新的活力。

它支持GA、DE、ES等進化演算法,支持單目標、多目標進化優化、復雜約束優化等問題的求解,提供豐富的遺傳演算法和多目標進化優化演算法模板,採用高性能的C內核和mkl矩陣運算,提供功能強大的開源進化演算法框架,尤其適合數學建模和研究進化演算法的研究生們。

官網:Geatpy

多目標優化求解案例:

使用方法:

第一步:實例化一個問題類把待優化的問題寫在裡面。

第二步:編寫執行腳本調用遺傳或其他進化演算法模板,完成問題的求解。

官網教程:Geatpy教程

3. 有沒有用python實現的遺傳演算法優化BP神經網路的代碼

下面是函數實現的代碼部分:
clc
clear all
close all
%% 載入神經網路的訓練樣本 測試樣本每列一個樣本 輸入P 輸出T,T是標簽
%樣本數據就是前面問題描述中列出的數據
%epochs是計算時根據輸出誤差返回調整神經元權值和閥值的次數
load data
% 初始隱層神經元個數
hiddennum=31;
% 輸入向量的最大值和最小值
threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
inputnum=size(P,1); % 輸入層神經元個數
outputnum=size(T,1); % 輸出層神經元個數
w1num=inputnum*hiddennum; % 輸入層到隱層的權值個數
w2num=outputnum*hiddennum;% 隱層到輸出層的權值個數
N=w1num+hiddennum+w2num+outputnum; %待優化的變數的個數
%% 定義遺傳演算法參數
NIND=40; %個體數目
MAXGEN=50; %最大遺傳代數
PRECI=10; %變數的二進制位數
GGAP=0.95; %代溝
px=0.7; %交叉概率
pm=0.01; %變異概率
trace=zeros(N+1,MAXGEN); %尋優結果的初始值
FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)]; %區域描述器
Chrom=crtbp(NIND,PRECI*N); %初始種群
%% 優化
gen=0; %代計數器
X=bs2rv(Chrom,FieldD); %計算初始種群的十進制轉換
ObjV=Objfun(X,P,T,hiddennum,P_test,T_test); %計算目標函數值
while gen

4. Python實現基於遺傳演算法的排課優化

排課問題的本質是將課程、教師和學生在合適的時間段內分配到合適的教室中,涉及到的因素較多,是一個多目標的調度問題,在運籌學中被稱為時間表問題(Timetable Problem,TTP)。設一個星期有n個時段可排課,有m位教師需要參與排課,平均每位教師一個星期上k節課,在不考慮其他限制的情況下,能夠推出的可能組合就有 種,如此高的復雜度是目前計算機所無法承受的。因此眾多研究者提出了多種其他排課演算法,如模擬退火,列表尋優搜索和約束滿意等。

Github : https://github.com/xiaochus/GeneticClassSchele

遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。遺傳演算法的流程如下所示:

遺傳演算法首先針對待解決問題隨機生成一組解,我們稱之為種群(Population)。種群中的每個個體都是問題的解,在優化的過程中,演算法會計算整個種群的成本函數,從而得到一個與種群相關的適應度的序列。如下圖所示:

為了得到新的下一代種群,首先根據適應度對種群進行排序,從中挑選出最優的幾個個體加入下一代種群,這一個過程也被稱為精英選拔。新種群餘下的部分通過對選拔出來的精英個體進行修改得到。

對種群進行修改的方法參考了生物DAN進化的方法,一般使用兩種方法: 變異 和 交叉 。 變異 的做法是對種群做一個微小的、隨機的改變。如果解的編碼方式是二進制,那麼就隨機選取一個位置進行0和1的互相突變;如果解的編碼方式是十進制,那麼就隨機選取一個位置進行隨機加減。 交叉 的做法是隨機從最優種群中選取兩個個體,以某個位置為交叉點合成一個新的個體。

經過突變和交叉後我們得到新的種群(大小與上一代種群一致),對新種群重復重復上述過程,直到達到迭代次數(失敗)或者解的適應性達到我們的要求(成功),GA演算法就結束了。

演算法實現

首先定義一個課程類,這個類包含了課程、班級、教師、教室、星期、時間幾個屬性,其中前三個是我們自定義的,後面三個是需要演算法來優化的。

接下來定義cost函數,這個函數用來計算課表種群的沖突。當被測試課表沖突為0的時候,這個課表就是個符合規定的課表。沖突檢測遵循下面幾條規則:

使用遺傳演算法進行優化的過程如下,與上一節的流程圖過程相同。

init_population :隨機初始化不同的種群。
mutate :變異操作,隨機對 Schele 對象中的某個可改變屬性在允許范圍內進行隨機加減。
crossover :交叉操作,隨機對兩個對象交換不同位置的屬性。
evolution :啟動GA演算法進行優化。

實驗結果

下面定義了3個班,6種課程、教師和3個教室來對排課效果進行測試。

優化結果如下,迭代到第68次時,課程安排不存在任何沖突。

選擇1203班的課表進行可視化,如下所示,演算法合理的安排了對應的課程。

5. python遺傳演算法目標函數怎麼編

一、遺傳演算法介紹
遺傳演算法是通過模擬大自然中生物進化的歷程,來解決問題的。大自然中一個種群經歷過若干代的自然選擇後,剩下的種群必定是適應環境的。把一個問題所有的解看做一個種群,經歷過若干次的自然選擇以後,剩下的解中是有問題的最優解的。當然,只能說有最優解的概率很大。這里,我們用遺傳演算法求一個函數的最大值。
f(x) = 10 * sin( 5x ) + 7 * cos( 4x ), 0 <= x <= 10
1、將自變數x進行編碼
取基因片段的長度為10, 則10位二進制位可以表示的范圍是0到1023。基因與自變數轉變的公式是x = b2d(indivial) * 10 / 1023。構造初始的種群pop。每個個體的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
2、計算目標函數值
根據自變數與基因的轉化關系式,求出每個個體的基因對應的自變數,然後將自變數代入函數f(x),求出每個個體的目標函數值。
3、適應度函數
適應度函數是用來評估個體適應環境的能力,是進行自然選擇的依據。本題的適應度函數直接將目標函數值中的負值變成0. 因為我們求的是最大值,所以要使目標函數值是負數的個體不適應環境,使其繁殖後代的能力為0.適應度函數的作用將在自然選擇中體現。
4、自然選擇
自然選擇的思想不再贅述,操作使用輪盤賭演算法。其具體步驟:
假設種群中共5個個體,適應度函數計算出來的個體適應性列表是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] . 然後產生5個0-1之間的隨機數,將隨機數從小到大排序,假如是[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]

這兩個個體發生基因交換的概率pc = 0.6.如果要發生基因交換,則產生一個隨機數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、突變
遍歷每一個個體,基因的每一位發生突變(0變為1,1變為0)的概率為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 #種群的大小#用遺傳演算法求函數最大值:#f(x)=10*sin(5x)+7*cos(4x) x∈[0,10]chromlength = 10 #基因片段的長度pc = 0.6 #兩個個體交叉的概率pm = 0.001; #基因突變的概率results = [[]]bestindivial = []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) #計算目標函數值 fitvalue = calfitvalue(objvalue); #計算個體的適應值 [bestindivial, bestfit] = best(pop, fitvalue) #選出最好的個體和最好的函數值 results.append([bestfit,b2d(bestindivial)]) #每次繁殖,將最好的結果記錄下來 selection(pop, fitvalue) #自然選擇,淘汰掉一部分適應性低的個體 crossover(pop, pc) #交叉繁殖 mutation(pop, pc) #基因突變 results.sort() print(results[-1]) #列印函數最大值和對應的

來自CODE的代碼片
GA.py

1
2
3
4
5
6
7
8
9
def best(pop, fitvalue): #找出適應函數值中最大值,和對應的個體 px = len(pop) bestindivial = [] bestfit = fitvalue[0] for i in range(1,px): if(fitvalue[i] > bestfit): bestfit = fitvalue[i] bestindivial = pop[i] return [bestindivial, bestfit]

來自CODE的代碼片
best.py

1
2
3
4
5
6
7
8
9
10
11
def calfitvalue(objvalue):#轉化為適應值,目標函數值越大越好,負值淘汰。 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): #計算目標函數值 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 #目標函數值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): #個體間交叉,實現基因交換 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

6. python有沒有簡單的遺傳演算法庫

首先遺傳演算法是一種優化演算法,通過模擬基因的優勝劣汰,進行計算(具體的演算法思路什麼的就不贅述了)。大致過程分為初始化編碼、個體評價、選擇,交叉,變異。

以目標式子 y = 10 * sin(5x) + 7 * cos(4x)為例,計算其最大值

首先是初始化,包括具體要計算的式子、種群數量、染色體長度、交配概率、變異概率等。並且要對基因序列進行初始化

[python]view plain

7. 基於Python編程,使用遺傳演算法求解區間[0,31]上的二次函數y=x(x-1)的最大值

max_y=max(list(map(lambda x:[x,x*(x-1)], [x for x in range(0,32)])))
print(f"[x,y]={max_y=}")

'''python運行效果
[x,y]=max_y=[31, 930]

'''

8. python 哪個包里有 遺傳演算法

scikit-opt調研過很多遺傳演算法庫,這個挺好用的。

#目標函數
defdemo_func(x):
x1,x2,x3=x
returnx1**2+(x2-0.05)**2+x3**2
fromgaimportGA

調用遺傳演算法求解:

ga=GA(func=demo_func,lb=[-1,-10,-5],ub=[2,10,2],max_iter=500)
best_x,best_y=ga.fit()

閱讀全文

與fsp的遺傳演算法實例python相關的資料

熱點內容
5995用什麼簡便演算法脫式計算 瀏覽:916
電腦上如何上小米雲伺服器地址 瀏覽:917
手機資料解壓密碼 瀏覽:442
44引腳貼片單片機有哪些 瀏覽:690
阿里程序員腦圖 瀏覽:189
廣東編程貓學習班 瀏覽:708
上海數控編程培訓學校 瀏覽:313
怎麼下載我的解壓神器 瀏覽:634
lib文件無用代碼會編譯嗎 瀏覽:28
我的世界嗨皮咳嗽伺服器怎麼下 瀏覽:1002
mvn命令順序 瀏覽:978
車貸還完多少時間解壓 瀏覽:964
java頁面開發 瀏覽:818
學編程的小發明 瀏覽:25
為什麼說程序員喜歡格子 瀏覽:253
代碼編譯後叫什麼 瀏覽:969
電腦文件夾做了保護怎麼刪除 瀏覽:678
php資料庫連接全局 瀏覽:528
葫蘆島有程序員嗎 瀏覽:986
小胖機器人顯示無命令 瀏覽:775