NetWork Modles(网络模型)
Jiggle 示范模型(repast/demo/jiggle)是一个简单的细网络模型例子, JinGirNew 网络模型(repast/demo/jinGirNew)是一个较复杂和现实的例子。
Contents
- Network Overview
- Displaying Networks
- Importing and Exporting Network Data
- Predefind Network Structures
Network Overview
在Repast中网络模型是围绕两个基本界面构建的: Node和 Edge。所有关于显示、输出和输出网络机制都使用这两个界面,并且它们应成为你自己的网络的基础。Repast提供这些界面缺省执行,DefaultNode和DefaultEdge可以当作你自己网络的node 和 edge类或为这些类的基础来使用。
Node 和 Edge 界面利用网络节点和连线为运行提供一些简单的方法。API 文档应该清晰,但其意图当 Edge 保持它所连接的节点的轨迹时,Node 保持它的流入和流出到连线的轨迹如同可选标签。此外,Edge 也有方法取得和设置连线强度,如同一个可选标签和类型。连线的类型参考连线所定义的网络类型。
在两个节点间建立一条线(一条连线)可以有两种方法。第一种:
// this sets up the Nodes DefaultNode nodeA = new DefaultNode("A"); DefaultNode nodeB = new DefaultNode("B"); // constructs a DefaultEdge from nodeA to nodeB // with a default strength of 1 // nodeA --> nodeB DefaultEdge edge = new DefaultEdge(nodeA, nodeB); nodeA.addOutEdge(edge); nodeB.addInEdge(edge);
这里生成两个节点,并生成连线来连接节点 A 到节点 B。这个增加的连线对于节点 A 是流出连线,对节点 B 是流入连线。
第二种也是首选的方法是使用EdgeFactory类去自动操作生成连线。例如:
// this sets up the Nodes DefaultNode nodeA = new DefaultNode("A"); DefaultNode nodeB = new DefaultNode("B"); // creates a DefaultEdge and links nodeA to nodeB EdgeFactory.createEdge(nodeA, nodeB);
这里 EdgeFactory 生成了一条缺省连线,并恰当地连接节点 A 和节点 B。EdgeFactory 也可以在连线生成之前,作为设置连线强度标签的方法。此外,你也可以提供你自己的连线执行类,并且 EdgeFactory 可以使用。例如:
// this sets up the Nodes DefaultNode nodeA = new DefaultNode("A"); DefaultNode nodeB = new DefaultNode("B"); // creates a DefaultEdge and links nodeA to nodeB EdgeFactory.linkNodes(nodeA, nodeB, new MyEdge());
在这,EdgeFactory使用MyEdge来连接节点A到节点B。从APIdocs可以看到更多的关于EdgeFactory信息。
一个节点能通过连线的连接涉及到另一个节点。例如:
// this sets up the Nodes DefaultNode nodeA = new DefaultNode("A"); DefaultNode nodeB = new DefaultNode("B"); EdgeFactory.createEdge(nodeA, nodeB); // set up is complete. The following shows // how to get a reference to nodeB given only // nodeA. ArrayList outEdges = nodeA.getOutEdges(); // we know there is only a single edge from nodeA // because we only added one. Typically you'd // iterate through or choose a specific edge based // on some criteria. DefaultEdge someEdge = (DefaultEdge)outEdges.get(0); // the getToNode() method returns a Node so we need to // cast to a DefaultNode. This someNode is in fact // nodeB. DefaultNode someNode = (DefaultNode)someEdge.getToNode(); // label = "B" String label = someNode.getLabel();
DefaultNode也提供了许多便利的方法,可以象上述那样简短地编译一些东西。可以在DefaultNode's APIdocs中看到详细说明。例如:
// this sets up the Nodes DefaultNode nodeA = new DefaultNode("A"); DefaultNode nodeB = new DefaultNode("B"); // constructs a DefaultEdge from nodeA to nodeB // with a default strength of 1 // nodeA --> nodeB DefaultEdge edge = new DefaultEdge(nodeA, nodeB); nodeA.addOutEdge(edge); nodeB.addInEdge(edge); // set up is complete. The following shows // how to get a reference to nodeB given only // nodeA. // we know there is only a single edge from nodeA // because we only added one, and thus only a single // ToNode. DefaultNode = (DefaultNode)nodeA.getToNodes().get(0); // label = "B" String label = someNode.getLabel();
这里 getToNodes()方法允许我们从第一个例子中移去一些编码。DefaultNode包含许多这样的方法
DefaultNode 提供许多网络类型功能你可能会需要。因此,通过继承或组合,你可以用这些 DefaultNodes 来组成你自己的主体。
一个典型的网络模型将视网络节点为主体,并构建这些节点和一些必要的连线作为 buildModel()模板方法的一部分。例如:
public class MyModel extends SimModelImpl { ArrayList agentList = new ArrayList(); ... private void buildModel() { // creates DefaultNodes and adds them to a list for (int i = 0; i < numAgents; i++) { DefaultNode node = new DefaultNode(String.valueOf(i)); agentList.add(node); } // iterate through the agentList creating edges between // the current node and the previous node. for (int i = 0; i < agentList.size(); i++) { Node node = (Node)agentList.get(i); Node prevNode = null; if (i == 0) { // current node is first node in list so // create an edge between it and the last node in // the list. prevNode = (Node)agentList.get(agentList.size() - 1); } else { prevNode = (Node)agentList.get(i - 1); } EdgeFactory.createEdge(node, prevNode); } } }
这是初始网络结构怎样去构建的一个简单的例子。实际的网络模型将使用一些编码去生成和添加连线,但添加连线的规则不尽相同。节点与它们的连线一起组成一个网络,并且所有的节点放置在一个排序中。因此,这个排序代表了整个网络。许多在NetUtilities类中的方法运行在一个完整网络上,并且期望取得象一个自变量一样的节点排序。

浙公网安备 33010602011771号