1. 程式人生 > 其它 >k圖著色 遺傳演算法的簡單python虛擬碼

k圖著色 遺傳演算法的簡單python虛擬碼

技術標籤:pythonnp問題演算法

文章目錄

概述

該問題中所使用到的部分函式與知識與區域性搜尋、模擬退火中的相同,參照k圖著色 區域性搜尋演算法與模擬退火演算法的python實現

遺傳演算法的整體思路比較簡單,在解決圖著色問題時這裡解的編碼形式就是所有節點的顏色序列,這時候依舊可以使用之前在區域性搜尋和模擬退火演算法中所用的衝突計算函式get_conflict_count(graph, color_solution)來評價個體的優秀程度,這裡不再做詳細的贅述。
先使用get_random_solution(color_num,city_list)來生成一定數量的種群,之後設定個迭代限制,在迭代迴圈中首先使用get_conflict_count()來計算種群中每個個體的衝突數量,若有0衝突的個體,那麼直接終止返回該最優解,若沒有則下面進行新的種群生成。

注意:隨機產生的解形式與其編碼的形式並不相同,兩者可以互相轉換,後面的虛擬碼中省去了這一轉換步驟,這麼做也為重用之前已有的程式碼帶來了方便。encode()與decode()。
解的形式:
在這裡插入圖片描述

解的編碼形式如下:
在這裡插入圖片描述

  • 選擇:根據之前計算的個體衝突個數可以按某種最優的方式來選去下一代的解,例如說直接按照衝突個數從小到大選擇前面衝突數最少的,也可以按概率選擇,衝突數越小的被選擇到的概率越大,輪盤賭的方式比較適合。這裡採用最簡單的前k個來選擇優秀個體。
  • 交叉:在這裡直接使用簡單的交叉方式,也就是隨機選擇兩個解序列,將兩個解序列的前半段與後半段互相交換,若編碼長度為奇數則前半段直接取截斷的數字,這樣就生成了新的交叉解。
  • 變異:以某個較小的概率1%-5%對解編碼進行變異,具體操作是在解編碼序列中隨機選擇某個節點將其更換為其他的顏色,這裡取5%。

python虛擬碼

#演算法主流程
main():
	設cur與next為空
	iter_num=k
	cur= get_random_solution_cluster()
	for i in range(k):
		for individual in cur:
			conflict_num, conflict=get_conflict_count(individual)
			if conflict_num==0:
				return individual
		next
=next+select(cur) next=next+cross(cur) next=next+mutate(cur) cur=nextnext為空 select(cur): conflict_num_list=[] for individual in cur: conflict_num_list.append(get_conflict_count(individual)) sort(conflict_num_list) return 前d個最小的個體 cross(cur): temp_list=[] for i in d: i1=random_select_one(cur) i2= random_select_one(cur) new_i1,new_i2=exchange(i1,i2) temp_list.append(new_i1,new_i2) return temp_list mutate(cur): res=[] for i in d: individual= random_select_one(cur) mutate_position=randint(node_number) random_change(individual, mutate_position) res.append(individual) return res