Math 如何在不尝试所有可能性的情况下找到最小值

Math 如何在不尝试所有可能性的情况下找到最小值,math,lua,Math,Lua,我试图写一个程序(用Lua,但我想这更像是一个数学问题),计算一组数字之间的总距离,其中一些数字有两到三种不同的可能性 例如,一组数字是:2、5、0、1。在这种情况下,距离之和为9。(5-2 + 5-0 + 1-0) 第一行是:5,-,3,2。 第二行是:3,-,-,3 距离之和最小的两行之间的组合为:5、5、3、3,距离之和为2 我的第一次尝试是编写一个程序,尝试所有可能的迭代,但有一组大约40个数字,有太多的可能性,我的计算机崩溃 这是该版本的代码,它首先创建所有不同的可能性,然后计算差异并

我试图写一个程序(用Lua,但我想这更像是一个数学问题),计算一组数字之间的总距离,其中一些数字有两到三种不同的可能性

例如,一组数字是:2、5、0、1。在这种情况下,距离之和为9。(5-2 + 5-0 + 1-0) 第一行是:5,-,3,2。 第二行是:3,-,-,3 距离之和最小的两行之间的组合为:5、5、3、3,距离之和为2

我的第一次尝试是编写一个程序,尝试所有可能的迭代,但有一组大约40个数字,有太多的可能性,我的计算机崩溃

这是该版本的代码,它首先创建所有不同的可能性,然后计算差异并将其放在第0列中。之后,我可以很容易地找到最小值,也可以看到得出该值的数字组合

localtable1={2,5,0,1}
局部表2={5,nil,3,2}
局部imax=1
局部解={}
本地答案=表1[1]
对于x=1,#表1
解[x]={}
对于i=1,(2^imax)/2 do
溶液[x][i]=表1[x]
结束
如果表2[x]~=nil,那么——有一个替代数字
对于y=1,x-1 do——复制除最后一个表项之外的所有以前的表项
对于j=((2^imax)/2)+1,2^imax do——新行数呈指数增长
溶液[y][j]=溶液[y][j-imax]
结束
结束
对于j=((2^imax)/2)+1,2^imax do——使用可选数字创建新的表条目
溶液[x][j]=表2[x]
结束
imax=imax+1——这个数字是用来提醒在哪里可以找到多少个备选数字
结束
结束
解决方案[0]={}
对于x=1,#表1
对于i=1,(2^imax)/2 do
如果x<#表1,则答案=math.sqrt((解[x+1][i]-解[x][i])^2)否则答案=0结束
如果解[0][i]==nil,则解[0][i]=回答其他解[0][i]=解[0][i]+回答结束
结束
结束
在阅读了有关动态规划的内容后,我编写了这个程序的新版本。它计算的是最小的差异总和,但我也想知道这个总和的路径(数字的组合)。。。还有工作要做

localtable1={2,5,0,1}
局部表2={5,nil,3,2}
局部解={}
局部smallestsolution={}
解决方案[1]={}
解决方案[2]={}
解决方案[3]={}
解决方案[4]={}
对于i=1,(#表1-1)do
解[1][i]=数学sqrt((表1[i+1]-表1[i])^2)
如果表2[i]~=nil,则解[2][i]=math.sqrt((表1[i+1]-table2[i])^2)结束
如果表2[i+1]~=nil,则解[3][i]=math.sqrt((表2[i+1]-table1[i])^2)结束
如果表2[i]~=nil和表2[i+1]~=nil,则解[4][i]=math.sqrt((表2[i+1]-table2[i])^2)结束
结束
对于i=1,(#表1-1)do
最小解决方案[i]=100000
对于j=1,4 do
如果解[j][i]~=nil且解[j][i]
谢谢


埃米尔

我自己设法解决了!@EgorSkriptunoff对动态编程的提示成功了

local table1 = {2, 5, 0 ,1}
local table2 = {5, nil, 3, 2}
local solution = {}
local smallestsolution = {}
solution[1]={}
solution[2]={}
solution[3]={}
solution[4]={}
local path = {}
local temp = {}

for i = 1, (#table1-1) do
    solution[1][i] = math.sqrt((table1[i+1]-table1[i])^2)
    if table2[i] ~= nil then solution[2][i] = math.sqrt((table1[i+1]-table2[i])^2) end
    if table2[i+1] ~= nil then solution[3][i] = math.sqrt((table2[i+1]-table1[i])^2) end
    if table2[i] ~= nil and table2[i+1] ~= nil then solution[4][i] = math.sqrt((table2[i+1]-table2[i])^2) end
end

for i = 1, (#table1-1) do
    smallestsolution[i]=100000
    temp[i] = 0
    for j = 1, 4 do
        if solution[j][i] ~= nil and solution[j][i] < smallestsolution[i] then smallestsolution[i]=solution[j][i] temp[i] = j end
    end
end

local smallestsum = 0
for i = 1, (#table1-1) do
    smallestsum = smallestsum + smallestsolution[i]
end

for i = 1, (#table1) do -- find the path belonging to the smallest sum of differences
    if temp[i] == 1 then path[i] = table1[i] end
    if temp[i] == 2 then path[i] = table2[i] end
    if temp[i] == 3 then path[i] = table1[i] end
    if temp[i] == 4 then path[i] = table2[i] end
    if i == (#table1) then
        if temp[i-1] == 1 then path[i] = table1[i] end
        if temp[i-1] == 2 then path[i] = table1[i] end
        if temp[i-1] == 3 then path[i] = table2[i] end
        if temp[i-1] == 4 then path[i] = table2[i] end
    end
end
localtable1={2,5,0,1}
局部表2={5,nil,3,2}
局部解={}
局部smallestsolution={}
解决方案[1]={}
解决方案[2]={}
解决方案[3]={}
解决方案[4]={}
本地路径={}
本地温度={}
对于i=1,(#表1-1)do
解[1][i]=数学sqrt((表1[i+1]-表1[i])^2)
如果表2[i]~=nil,则解[2][i]=math.sqrt((表1[i+1]-table2[i])^2)结束
如果表2[i+1]~=nil,则解[3][i]=math.sqrt((表2[i+1]-table1[i])^2)结束
如果表2[i]~=nil和表2[i+1]~=nil,则解[4][i]=math.sqrt((表2[i+1]-table2[i])^2)结束
结束
对于i=1,(#表1-1)do
最小解决方案[i]=100000
温度[i]=0
对于j=1,4 do
如果溶液[j][i]~=nil且溶液[j][i]
嗨!请你考虑一下改写第二段好吗?我不明白。假设您有40个数字,每个数字有40个变量,动态编程可以立即解决这个问题。@Stef:如果我不清楚,很抱歉!我想计算行中所有数字集之间的差值。例如,第2、5、0、1行。2和5之间的差是3,5和0之间的差是5等等。所有这些差的总和是9。@EgorSkriptunoff谢谢你的建议。我有大约40个号码,每种情况都会改变,每个号码有0、1或2个变体。我不熟悉动态规划,但只是在谷歌上搜索了一下,乍一看,它似乎会奏效。我要去研究它!谢谢你能把你尝试的代码添加到问题中吗?