python-3.x - 如何将 Mathematica 中的代码转换为 Python?

标签 python-3.x optimization graph wolfram-mathematica mathematical-optimization

我使用以下 Mathematica 代码将图形的边长缩放为等于边权重。 ( ref )

edges = {1 <-> 2, 1 <-> 3, 1 <-> 4, 2 <-> 5, 2 <-> 6, 5 <-> 6, 
   3 <-> 4, 3 <-> 7, 6 <-> 7, 7 <-> 8, 2 <-> 9};

vd = {{75., 25., 0}, {115., 45., 0}, {10., 5., 0}, {45., 0, 0}, 
  {90., 60., 0}, {45., 55., 0}, {0, 25., 0}, {10., 50., 0}, {115.,  25.,0}};

vl = Range[Length@vd];

vcoords = MapIndexed[#2[[1]] -> # &, vd];
ew = {1 \[UndirectedEdge] 2 -> 49.6, 1 \[UndirectedEdge] 3 -> 74.4, 
 1 \[UndirectedEdge] 4 -> 49.6, 2 \[UndirectedEdge] 5 -> 37.2, 
 2 \[UndirectedEdge] 6 -> 74.4, 5 \[UndirectedEdge] 6 -> 49.6, 
 3 \[UndirectedEdge] 4 -> 37.2, 3 \[UndirectedEdge] 7 -> 24.8, 
 6 \[UndirectedEdge] 7 -> 62, 7 \[UndirectedEdge] 8 -> 37.2, 
 2 \[UndirectedEdge] 9 -> 24.8}

g3d = Graph3D[vl, edges, VertexCoordinates -> vcoords, 
  EdgeWeight -> ew, VertexLabels -> Placed["Name", Center], 
  EdgeLabels -> {e_ :> Placed["EdgeWeight", Center]}, 
  VertexSize -> .3, VertexStyle -> Red]
vars3d = Array[Through[{x, y, z}@#] &, Length @ vd];

λ = 1/100.;

obj3d = Total[(Norm[vars3d[[First@#]] - vars3d[[Last@#]]] - # /. ew)^2 & /@ 
  EdgeList[g3d]] +  λ Total[Norm /@ (vars3d - vd)];

lbnd = 0;
ubnd = 500;

solution3d = Last@Minimize[{obj3d, And @@ Thread[lbnd <= Join @@ vars3d <= ubnd]}, 
    Join @@ vars3d];

edgeLengths3d = # -> Norm[vars3d[[First@#]] - vars3d[[Last@#]]] /. 
     solution3d & /@ EdgeList[g3d];

Grid[Prepend[{#, # /. ew, # /. edgeLengths3d} & /@ 
   EdgeList[g3d], {"edge", "EdgeWeight", "Edge Length"}], 
 Dividers -> All]

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

edges = [(1,2), (1,3), (1,4), (2,5), (2,6), (5,6), (3,4), (3,7), (6,7), (7,8), (2,9)];
vl = [1,2,3,4,5,6,7,8,9]
ew = {(1, 2) : 49.6, (1,3): 74.4, (1, 4) : 49.6, (2,5): 37.2, (2, 6) : 74.4, (5, 6): 49.6, 
     (3, 4) : 37.2, (3, 7):24.8, (6, 7) : 62, (7, 8) : 37.2, (2, 9) : 24.8}
vd = {1:[75., 25., 0], 2:[115., 45., 0], 3:[10., 5., 0], 4:[45., 0, 0], 
      5:[90., 60., 0], 6:[45., 55., 0], 7:[0, 25., 0], 8:[10., 50., 0], 9:[115.,  25.,0]}; 

我不确定必须如何在 Python 中转换优化命令。 关于如何在 Python 中编写行 obj3dsolution3d 的建议将有很大帮助。

最佳答案

How to convert code in Mathematica to Python?

如果代码很小(几百行),最好手工转换(或转包)。

您需要阅读 Mathematica 的文档和 Python .

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

关于python-3.x - 如何将 Mathematica 中的代码转换为 Python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64003338/

相关文章:

python - 是否有可能 "hack"Python 的打印功能?

python - 在 zip 对象列表上执行 len 会清除 zip

python - Django 如何在过滤后注释多个模型上关键字的实例总数?

python - "pip install --user ..."的目的是什么?

下降网格项目的算法

python - 返回无向图中的顶点

optimization - 当 Postgres 的 work_mem 达到最大值时会发生什么?

optimization - 是否有用于在简单处理器上生成自修改代码的高级语言的现代编译器?

c# - 在 C# 中获取屏幕像素颜色的最快方法

c++ - 这张图说明了时间复杂度是多少?