Lua 中个体遗传算法种群随机排序不正常

我刚开始学习使用 Lua,在创建 TSP 解决方案时,采用了遗传算法,但是种群随机排序的函数似乎会覆盖其他排序。每次新的顺序通过随机器循环时,它确实会随机排列其顺序,但它也会将所有先前的顺序设置为与它自己相等。

我已经进行了调试以局限化问题,我确信这就是正在发生的事情,但是无论我经过多少次思考,我都无法逻辑上弄清原因。我是否漏掉了一个突出的事情?

只是展示表的正确创建和随机器的种子。

order = {}
population = {}
math.randomseed(os.time())

这里是正在使用的交换和随机函数。这些函数应该根据我的测试正常工作,但我可能忽略了一些东西。

function swap(tbl, i, j)
  tbl[i], tbl[j] = tbl[j], tbl[i]
end

function shuffle(tbl)
  for i = #tbl, 2, -1 do
    local j = math.random(#tbl)
    swap(tbl, i, j)
  end
  return tbl
end

设置初始顺序

for i = 1, 10 do
  order[i] = i
end

这可能是问题所在

for i = 1, 10 do
  population[i] = order
  shuffle(population[i])
end

这里的应该是初始顺序应该是基本的1到10,然后下一次循环应该使用 10 个不同的随机排列填充种群。相反,第二个循环给第一个表分配了一个随机排序,然后下一次循环明显将下一个排序和之前的所有排序设置为一个新的随机排序,使之在循环结束时都相等。

我已经在受控环境中检查了 shuffle 和 swap 函数,并确信它们正在正确工作。此外,初始排序被正确地设置了。

如有任何想法,请不吝赐教,谢谢

点赞
用户7396148
用户7396148

问题原因

你遇到的问题是由 lua 处理表的方式引起的。

以下是一个例子:

tbl1 = {}
tbl2 = tbl1

tbl2[1] = 1

print(tbl1[1])

结果是 tbl1[1] 打印出 1。这是因为 tbl2tbl1 是同一个表,只是名称不同。

当你执行 population[i] = order 时,你只有 1 个表,但有 10 个不同的名称。

为了避免这个问题,你可以复制表,这里有一个有关复制表的资源:

http://lua-users.org/wiki/CopyTable

最快的调整你的代码的方法是:

for i = 1, 10 do
  population[i] = {table.unpack(order)}
  shuffle(population[i])
end

此方法仅适用于连续的数字索引

https://www.lua.org/manual/5.2/manual.html#pdf-table.unpack


另外,你可以通过创建一个函数来初始化你的顺序来避免整个过程:

function init_order()
    local order = {}

    for i = 1, 10 do
        order[i] = i
    end

    return order
end

然后在你的 for 循环中调用该函数:

for i = 1, 10 do
  population[i] = init_order()
  shuffle(population[i])
end
2019-04-10 15:33:19