在Lua无法正常工作的GA群体中随机分配订单

时间:2019-04-10 15:06:09

标签: lua genetic-algorithm

我是不熟悉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个不同的随机顺序填充总体。取而代之的是,第二个循环将第一个表分配给一个随机顺序,然后在下一次循环时,显然将下一个顺序和之前的所有顺序设置为一个新的随机顺序,从而使它们到循环结束。

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

感谢任何想法,谢谢

1 个答案:

答案 0 :(得分:3)

您遇到的问题是由于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