2014-11-24 43 views
1

我想爲遺傳編程實現3點交叉,但我不知道該怎麼做,從哪裏開始。Lua 3點交叉幫助開始

我的輸入是:

​​

例如a = {(12345,67890), (09876,54321)}(這些都是數字,而不是字符串)

輸出:像這樣:

實施例:a_1 = {(12895), (67340)}也號碼。

感謝您的回覆,對不起我的英文不好。

回答

1

這裏是我使用大多數整數算術快速實現整數的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 
+0

應該使用'math.randomseed(os.time())'來代替,否則它在運行之間不會是隨機的。 – 2014-11-24 23:28:14

+0

@ColonelThirtyTwo謝謝,我希望它能打印出我所說的打印內容。不管怎樣,任何情況下都應該讓OP知道。 – ryanpattison 2014-11-24 23:32:52

+0

謝謝,所以如果我將math.randomseed(111)更改爲數學,randomseed(os.time()),它將在兩個回合之間是隨機的?我可以用它來交換二進制數嗎? – rockethole 2014-11-25 15:32:22