我正在使用scala-graph库来构建方向图并以拓扑顺序检索其节点。由于图的拓扑顺序可能存在许多可能性,因此我需要对于相同且以相同方式构建的图的拓扑顺序具有确定性结果。
这个小应用程序突出了问题
import scalax.collection.Graph
import scalax.collection.GraphEdge.DiEdge
import scalax.collection.GraphPredef._
object MainApp extends App {
// Creates new graph for every call
// val is not an option
def graph: Graph[String, DiEdge] = Graph(
"A" ~> "B",
"A" ~> "C",
"A" ~> "D",
"B" ~> "E",
"B" ~> "F",
"C" ~> "G",
"C" ~> "H",
"D" ~> "F",
"D" ~> "G"
)
val results = 1 to 20 map { _ =>
graph.topologicalSort.mkString("")
}
println(results.tail.forall(_ == results.head))
}
这个应用程序打印错误。
有没有办法使用scala-graph库的api构建图的确定性拓扑排序?从头开始编写算法将是我的最后选择。
答案 0 :(得分:1)
根据函数on github的实现,使用ComponentTraverser
收集节点,该def componentTraverser(parameters: Parameters = Parameters(), subgraphNodes: (NodeT) ⇒ Boolean = anyNode, subgraphEdges: (EdgeT) ⇒ Boolean = anyEdge, ordering: ElemOrdering = noOrdering): ComponentTraverser
是用
topologicalSort
然后调用ComponentTraverser
。您可以通过对节点的值进行排序以获得 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.camera.preview" android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".CameraPreview" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
来强制拓扑排序为确定性,然后自己调用排序函数。 解决方案未经过测试。