有人在标准ML中有旅行商问题解决方案,请告诉我。
我已经尝试了很多但是没有成功。
答案 0 :(得分:5)
对旅行商的蛮力解决方案非常直接。您填充可能路径列表并选择最小路径。
至于在SML中这样做,有无数的方法。它首先取决于您使用的数据结构,其次取决于您是否希望使用“懒惰”函数/流。
我的建议是首先编写一个简单的路径查找器,然后将其扩展为生成所有路径作为列表或其他数据结构。最后将该列表排序为最小的行程长度。在考虑如何解决此问题时,请使用wiki上的TSP作为有用的资源。
我很抱歉,但我不是为他们做其他功课。
答案 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应该是直截了当的。