我是不熟悉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个不同的随机顺序填充总体。取而代之的是,第二个循环将第一个表分配给一个随机顺序,然后在下一次循环时,显然将下一个顺序和之前的所有顺序设置为一个新的随机顺序,从而使它们到循环结束。
我已经检查了受控环境中的随机播放和交换功能,并确保它们正常运行。此外,初始顺序已正确设置。
感谢任何想法,谢谢
答案 0 :(得分:3)
您遇到的问题是由于lua如何处理表。
这里是一个示例:
tbl1 = {}
tbl2 = tbl1
tbl2[1] = 1
print(tbl1[1])
结果是tbl1[1]
打印1
。这是因为tbl2
和tbl1
是相同表,只是名称不同。
这就是当您制作population[i] = order
时只有 1 个由 10 个不同名称组成的表的经验。
为避免这种情况,您可以复制表。这是有关表处理的资源:
调整代码的最快方法是:
for i = 1, 10 do
population[i] = {table.unpack(order)}
shuffle(population[i])
end
此方法仅适用于顺序数字索引
或者,您可以通过创建一个初始化订单的函数来避免整个过程:
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