我創建了一個遺傳演算法來從父母那里創造孩子。在演算法開始時,會創建一個隨機作業負載(子陣列的陣列)。作業量 L=2,種群大小 N=30,InputsNumber=3,突變率 m=0.05。然后我對總體進行一些分數計算,以選擇得分最高的 2 個作業負載(父母)。現在新的人口只是父母。之后形成兩個父母,我創建具有交叉功能和變異功能的孩子,并將孩子與父母一起添加到人口中。現在我做了 10 次同樣的事情,每次我從人群中挑選出兩個最好的作為父母。現在的問題是,當我在變異函式中更改子項值時,父母突然將其值更改為子項值。如何避免這種情況?父母在我呼叫突變()函式之前是正確的,在他們改變突變函式之后是正確的。我不明白為什么會這樣。請幫我找出為什么會這樣!
這是一個示例輸出:https ://ibb.co/m5T0hSq
父或子陣列示例:[[0 0 0],[0 0 0]] 父或子陣列示例:[ [[0 0 0],[0 0 0]], [[0 0 0],[0 0 0]]]
def generateRandomWorkload(inputsNumber, L, N):
global population
individualWorkload = []
for n in range(N):
for i in range(L):
individual = [0 for _ in range(len(inputsNumber))]
individualWorkload.append(individual)
population.append(individualWorkload)
individualWorkload = []
def crossover(L):
global parents, children
children = []
for i in range(2):
C = random.randint(0, 1)
R = random.randint(0, L)
if C == 0:
child = parents[0][0:R] parents[1][R:L]
children.append(child)
elif C == 1:
child = parents[1][0:R] parents[0][R:L]
children.append(child)
return children
def mutation(mutation_rate):
global children
for i in range(len(children)):
for j in range(len(children[i])):
for k in range(len(children[i][j])):
r = random.uniform(0, 1)
if r <= mutation_rate:
children[i][j][k] = 1 - children[i][j][k]
return children
def geneticAlgorithm(inputsNumber, L, N):
global parents, children, population
generateRandomWorkload(inputsNumber, L, N)
print("SEED POPULATION: ", population, "\n \n")
for generation in range(10):
print(bcolors.OKGREEN "MEASUREMENTS OF ", generation 1, " GENERATION" bcolors.ENDC)
for individualWorkload in population:
### HERE I CALCULATE SOME SCORES (scoreI) ###
# Parents
print("PARENTS SELECTION... \n")
scoreI.sort(key=lambda x: x[1])
parents = [scoreI[-1][0], scoreI[-2][0]]
population = [parents[0], parents[1]]
print("SELECTED PARENTS: \n", parents, "\n")
print("PARENTS IN POPULATION:", population)
# Crossover
print("BEGIN CROSSOVER... \n")
print("PARENTS: ", parents)
children = crossover(L)
print("CROSSOVER CHILDREN:\n", children, "\n")
# Mutation
print("BEGIN MUTATION...\n")
print("PARENTS: ", parents)
children = mutation(0.05)
print("MUTATION CHILDREN:\n", children, "\n")
# New population
population.append(children[0])
population.append(children[1])
print("PARENTS: ", parents)
print("NEW POPULATION: \n", population, "\n")
uj5u.com熱心網友回復:
如果我理解正確,這是由于 python 中稱為可變性的東西。
我還沒有真正研究過它,但是我相信它源于 C 指標,因為 python 是用 C 撰寫的并且與 C 代碼有很好的集成(例如查找 CPython)。
基本上,這意味著當你說:
listB = listA
listA并且listB實際上是同一個串列,因為它們實際上不是一個串列,而是一個指向特定記憶體地址的數字。
你可以通過許多不同的方式解決這個問題
- 深拷貝
from copy import deepcopy
listB = deepcopy(listA)
- 陣列切片
listB = listA[::]
- 使用 for 回圈進行迭代(我不推薦它,但在這里)
listB = []
for element in listA:
listB.append(element)
您也可以快速谷歌搜索以了解更多資訊,這些只是我現在能想到的一些選項。
uj5u.com熱心網友回復:
也許按地址和按值混淆副本?使用陣列時不要直接做作,因為它們是鏈接的。
“使用 copy() 函式是 Python 中復制陣列的另一種方式。在這種情況下,從原始陣列創建一個新的陣列物件,這種型別的復制稱為深拷貝。如果在原始陣列中修改了任何值或復制的陣列,那么它不會在另一個陣列上創建任何更改。”
uj5u.com熱心網友回復:
將陣列復制到另一個陣列時,僅使用等號不會復制值,但會復制此值所在的位置,因此會出現正在復制的陣列,但如果嘗試更改陣列,它將改變兩者。為避免發生這種情況,請遍歷陣列中的每個元素并單獨復制該值
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/532353.html
標籤:Python数组
上一篇:如何使用map方法顯示陣列元素
下一篇:提取熊貓資料框中的陣列串列值
