1
我想爲遺傳編程實現3點交叉,但我不知道該怎麼做,從哪裏開始。Lua 3點交叉幫助開始
我的輸入是:
例如a = {(12345,67890), (09876,54321)}
(這些都是數字,而不是字符串)
輸出:像這樣:
實施例:a_1 = {(12895), (67340)}
也號碼。
感謝您的回覆,對不起我的英文不好。
我想爲遺傳編程實現3點交叉,但我不知道該怎麼做,從哪裏開始。Lua 3點交叉幫助開始
我的輸入是:
例如a = {(12345,67890), (09876,54321)}
(這些都是數字,而不是字符串)
輸出:像這樣:
實施例:a_1 = {(12895), (67340)}
也號碼。
感謝您的回覆,對不起我的英文不好。
這裏是我使用大多數整數算術快速實現整數的k點交叉。從這個開始,你可以擴展它來交叉使用循環的許多對整數的染色體。
math.randomseed(111)
-- math.randomseed(os.time())
a = 12345
b = 67890
len = 5 -- number of digits
function split(mum, dad, len, base)
local split = math.pow(base, math.random(len))
local son = math.floor(dad/split) * split + mum % split
local daughter = math.floor(mum/split) * split + dad % split
return son, daughter
end
function kpoint(mum, dad, len, base, k)
for i=1, k do
mum, dad = split(mum, dad, len, base)
end
return mum, dad
end
s, d = kpoint(a, b, len, 10, 3) -- 3 point crossover in base 10
print(s) -- 67395
print(d) -- 12840
-- binary, (crossover binary representation)
s, d = kpoint(tonumber("10001", 2), tonumber("10110", 2), 5, 2, 3)
print(s) -- 23 which is (10111) in base 2
print(d) -- 16 which is (10000) in base 2
-- binary, (crossover base 10, but interpret as binary)
s, d = kpoint(1101, 1010, 4, 10, 3)
print(s) -- 1001
print(d) -- 1110
應該使用'math.randomseed(os.time())'來代替,否則它在運行之間不會是隨機的。 – 2014-11-24 23:28:14
@ColonelThirtyTwo謝謝,我希望它能打印出我所說的打印內容。不管怎樣,任何情況下都應該讓OP知道。 – ryanpattison 2014-11-24 23:32:52
謝謝,所以如果我將math.randomseed(111)更改爲數學,randomseed(os.time()),它將在兩個回合之間是隨機的?我可以用它來交換二進制數嗎? – rockethole 2014-11-25 15:32:22