【发布时间】:2013-09-23 01:14:22
【问题描述】:
我写了以下代码:
combinationsstring = "List of Combinations"
for a = 0, 65 do
for b = 0, 52 do
for c = 0, 40 do
for d = 0, 28 do
for e = 0, 19 do
for f = 0, 11 do
for g = 0, 4 do
if (((1.15^a)-1)+((20/3)*((1.15^b)-1))
+((100/3)*((1.15^c)-1))+(200*((1.15^d)-1))
+((2000/3)*((1.15^e)-1))+((8000/3)*((1.15^f)-1))
+((40000/3)*((1.15^g)-1))) < 10000 then
combinationsstring = combinationsstring
.."\n"..a..", "..b..", "..c..", "..d
..", "..e..", "..f..", "..g
end
end
end
end
end
end
end
end
local file = io.open("listOfCombinations.txt", "w")
file:write(combinationsstring)
file:close()
我需要找到符合以下等式的所有数据集
(((1.15^a)-1)+((20/3)*((1.15^b)-1))+
((100/3)*((1.15^c)-1))+(200*((1.15^d)-1))+
((2000/3)*((1.15^e)-1))+((8000/3)*((1.15^f)-1))+
((40000/3)*((1.15^g)-1))) < 10000
每个变量 (a-g) 都是一个实整数。所以我计算了 7 个中的每一个的最大值(每个变量的最大值将是当所有其他值都为 0 时)。这些最大值分别为 65、52、40、28、19、11 和 4(62 = a、52 = b 等等)
所以我创建了 7 个嵌套的 for 循环(如上面的代码所示),在中间块中,我测试了 7 个值以查看它们是否符合标准,如果符合,则将它们添加到字符串中。在代码的最后,程序会覆盖一个文件,并将最后的字符串放入包含所有可能的组合。
该程序运行良好,但是在此模拟过程中执行了 31 亿次计算,并且通过一些测试,我发现我的计算机平均每秒进行 3000 次计算。这意味着总的模拟时间约为 12 天零 5 小时。我没有任何时间,所以我花了整个上午来简化要测试的方程式,删除不必要的代码,这就是我的最终结果。
我使用嵌套 for 循环完成的这个方法是不是这里最优化的方法?如果是,有没有其他方法可以加快速度,如果没有,您能告诉我另一种方法吗?
附:我使用 Lua 是因为它是我最熟悉的语言,但如果您有其他建议/示例,请用您的语言使用它,我可以尝试针对该程序进行优化。
【问题讨论】:
-
我还不够清醒,无法为算法改进提供建议,但你可以做的一件简单的事情就是从普通 Lua 切换到 LuaJIT,从而大幅提升性能。一件更难的事情是并行化你的代码。这就是所谓的“令人尴尬的并行”问题,其中结果都是相互独立的,因此使用诸如 Lanes 之类的东西将您的计算分成多个线程应该可以让您几乎线性加速(直到您用完内核,无论如何) .
-
致反对者:您介意解释一下为什么您认为这是一个低质量的问题吗?即使 OP 显然不是专家级程序员,这也是一个非常真实和具体的问题,可以使用程序来解决,并且尝试的解决方案显示了努力和学习的意愿。 (为我 +1)
标签: performance math lua nested-loops