我是新手使用Lua,我正在使用遗传算法在Lua中创建一个TSP解决方案,但随机化人口订单的功能似乎是覆盖其他订单。每当新订单循环通过随机数发生器时,它会以不同于之前所有订单的方式随机化其订单,但它也会将所有先前订单设置为等于自身。
我调试了本地化问题,我很肯定这是发生了什么,但无论我多少次检查它,我都无法从逻辑上找出原因。我错过了一件明显的事吗?
只是显示正确创建了表并设置了随机化器种子。
order = {}
population = {}
math.randomseed(os.time())
这是使用的swap和shuffle函数。他们应该根据我的测试正常工作,但总是有可能我错过了一些东西。
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功能,并确保它们正常工作。此外,正确设置初始订单。
任何想法都表示赞赏,谢谢
您遇到的问题是由于lua如何处理表。
这是一个例子:
tbl1 = {}
tbl2 = tbl1
tbl2[1] = 1
print(tbl1[1])
结果是tbl1[1]
打印1
。这是因为tbl2
和tbl1
只是用不同的名字来表。
这就是你在制作population[i] = order
时遇到的问题,你只有10个不同名字的1个表。
为避免这种情况,您可以复制表格。这是桌面应对的资源:
调整代码的最快方法是:
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