如何将 Mathematica 中的代码转换为 Python?

Nat*_*sha 2 optimization wolfram-mathematica graph mathematical-optimization python-3.x

我有以下 Mathematica 代码,用于将图的边长度缩放为等于边权重。\n( ref )

\n
edges = {1 <-> 2, 1 <-> 3, 1 <-> 4, 2 <-> 5, 2 <-> 6, 5 <-> 6, \n   3 <-> 4, 3 <-> 7, 6 <-> 7, 7 <-> 8, 2 <-> 9};\n\nvd = {{75., 25., 0}, {115., 45., 0}, {10., 5., 0}, {45., 0, 0}, \n  {90., 60., 0}, {45., 55., 0}, {0, 25., 0}, {10., 50., 0}, {115.,  25.,0}};\n\nvl = Range[Length@vd];\n\nvcoords = MapIndexed[#2[[1]] -> # &, vd];\new = {1 \\[UndirectedEdge] 2 -> 49.6, 1 \\[UndirectedEdge] 3 -> 74.4, \n 1 \\[UndirectedEdge] 4 -> 49.6, 2 \\[UndirectedEdge] 5 -> 37.2, \n 2 \\[UndirectedEdge] 6 -> 74.4, 5 \\[UndirectedEdge] 6 -> 49.6, \n 3 \\[UndirectedEdge] 4 -> 37.2, 3 \\[UndirectedEdge] 7 -> 24.8, \n 6 \\[UndirectedEdge] 7 -> 62, 7 \\[UndirectedEdge] 8 -> 37.2, \n 2 \\[UndirectedEdge] 9 -> 24.8}\n\ng3d = Graph3D[vl, edges, VertexCoordinates -> vcoords, \n  EdgeWeight -> ew, VertexLabels -> Placed["Name", Center], \n  EdgeLabels -> {e_ :> Placed["EdgeWeight", Center]}, \n  VertexSize -> .3, VertexStyle -> Red]\nvars3d = Array[Through[{x, y, z}@#] &, Length @ vd];\n\n\xce\xbb = 1/100.;\n\nobj3d = Total[(Norm[vars3d[[First@#]] - vars3d[[Last@#]]] - # /. ew)^2 & /@ \n  EdgeList[g3d]] +  \xce\xbb Total[Norm /@ (vars3d - vd)];\n\nlbnd = 0;\nubnd = 500;\n\nsolution3d = Last@Minimize[{obj3d, And @@ Thread[lbnd <= Join @@ vars3d <= ubnd]}, \n    Join @@ vars3d];\n\nedgeLengths3d = # -> Norm[vars3d[[First@#]] - vars3d[[Last@#]]] /. \n     solution3d & /@ EdgeList[g3d];\n\nGrid[Prepend[{#, # /. ew, # /. edgeLengths3d} & /@ \n   EdgeList[g3d], {"edge", "EdgeWeight", "Edge Length"}], \n Dividers -> All]\n
Run Code Online (Sandbox Code Playgroud)\n

我正在尝试用 Python 重写相同的代码。输入已转换为\npython 数据类型列表和字典。

\n
edges = [(1,2), (1,3), (1,4), (2,5), (2,6), (5,6), (3,4), (3,7), (6,7), (7,8), (2,9)];\nvl = [1,2,3,4,5,6,7,8,9]\new = {(1, 2) : 49.6, (1,3): 74.4, (1, 4) : 49.6, (2,5): 37.2, (2, 6) : 74.4, (5, 6): 49.6, \n     (3, 4) : 37.2, (3, 7):24.8, (6, 7) : 62, (7, 8) : 37.2, (2, 9) : 24.8}\nvd = {1:[75., 25., 0], 2:[115., 45., 0], 3:[10., 5., 0], 4:[45., 0, 0], \n      5:[90., 60., 0], 6:[45., 55., 0], 7:[0, 25., 0], 8:[10., 50., 0], 9:[115.,  25.,0]}; \n
Run Code Online (Sandbox Code Playgroud)\n

我不确定如何在 Python 中转换优化命令。\n关于如何在 Python 中编写这些行的建议obj3d将会solution3d有很大帮助。

\n

Bas*_*tch 6

如何将 Mathematica 中的代码转换为 Python?

如果代码很小(几百行),您最好手动进行转换(或分包它)。

您需要阅读MathematicaPython的文档。

如果代码很大(数十万行),您可以考虑编写源到源转换器。为此,请阅读Dragon书籍,然后选择一种高级编程语言(例如OcamlSBCLHaskell)来编写这样的翻译器(使用解析器生成器工具,例如MenhirANTLR和受Iburg等启发的方法......)。预算半年的全职工作。