在 Lua 中无法正常工作的 GA 群体中的随机化顺序

Randomizing orders in a GA population not working properly in Lua

我是 Lua 的新手,我正在使用遗传算法在 Lua 中创建 TSP 解决方案,但是随机化人口顺序的函数似乎被覆盖了其他订单。每次新订单循环通过随机化器时,它确实会以不同于所有先前订单的方式随机化其订单,但它也会将所有先前订单设置为等于自己。

我已经调试以定位问题所在,而且我确信这是正在发生的事情,但无论我检查多少次,我都无法从逻辑上找出原因。有什么明显的我想念的东西吗?

只是表明 table 正在正确创建并且随机化器种子已设置。

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 个不同的随机顺序填充总体。相反,第二个循环将第一个 table 分配给一个随机顺序,然后在下一次循环时显然将下一个顺序和它之前的所有订单设置为一个新的随机顺序,使它们彼此相等到循环结束时。

我已经检查了受控环境中的随机播放和交换功能,并确定它们工作正常。此外,正在正确设置初始顺序。

感谢任何想法,谢谢

您遇到的问题是由于 lua 处理 table 的方式所致。

这是一个例子:

tbl1 = {}
tbl2 = tbl1

tbl2[1] = 1

print(tbl1[1])

结果是 tbl1[1] 打印 1。这是因为 tbl2tbl1 相同的 table 只是名称不同。

这就是你在 population[i] = order 时遇到的情况,你只有 1 table by 10不同的名字。

要避免这种情况,您可以复制 table。这是关于 table 应对的资源:

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