如何用SML解决旅行推销员?

时间:2010-03-11 02:12:41

标签: algorithm sml traveling-salesman

有人在标准ML中有旅行商问题解决方案,请告诉我。

我已经尝试了很多但是没有成功。

2 个答案:

答案 0 :(得分:5)

对旅行商的蛮力解决方案非常直接。您填充可能路径列表并选择最小路径。

至于在SML中这样做,有无数的方法。它首先取决于您使用的数据结构,其次取决于您是否希望使用“懒惰”函数/流。

我的建议是首先编写一个简单的路径查找器,然后将其扩展为生成所有路径作为列表或其他数据结构。最后将该列表排序为最小的行程长度。在考虑如何解决此问题时,请使用wiki上的TSP作为有用的资源。

我很抱歉,但我不是为他们做其他功课。

好的SML引用和another

答案 1 :(得分:0)

我不知道如何在SML中使用2D数组。这是一个F#解决方案:

let salesman2 (g:int array array) = 
    let n = Array.length g
    let rec salesman' visited last acc = 
        if Set.count visited = n then acc
        else 
            {0..n-1} 
            |> Seq.filter (fun i->not (Set.contains i visited)) 
            |> Seq.map (fun i->salesman' (Set.add i visited) i (acc + g.[last].[i]))
            |> Seq.min
    salesman' Set.empty 0 0 

let g = [|[|0;1;2;4|]; [|1;0;2;2;|]; [|2;2;0;3|]; [|4;2;3;0|] |]
salesman2 g

如果你知道SML,那么将它翻译成SML应该是直截了当的。