gpt4 book ai didi

java - 这个算法在 Java 中执行有什么问题?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:53 25 4
gpt4 key购买 nike

考虑下面的树:

Tree

我正在尝试做的是模拟树波算法,这样如果一个节点从除了一个直接连接的邻居之外的所有节点都收到了一个 token ,它会向那个沉默的邻居发送一个 token (对于叶节点总是如此).如果一个节点从沉默的邻居那里收到一个 token ,就会做出决定。节点总是 7,树结构相同,所以我总是知道每个节点的邻居(直接连接的节点)。

树算法伪代码:

The tree algorithm

我有以下对象:

public final class Node implements Runnable {

private final int name;

// Indicating token receiving from neighbours
private Map<Node, Boolean> neigh = new
HashMap<Node, Boolean>();

public Node(int name) {
this.name = name;
}

public int getName() {
return name;
}

public void addNeigh(Node node) {
neigh.put(node, false);
}

private int flag() {
Collection<Boolean> c = neigh.values();
int count = 0;
for (Boolean bool : c) {
if (!bool) {
count++;
}
}
return count;
}

private Node getSilentNeigh() {
for (Entry<Node, Boolean> entry : neigh.entrySet()) {
if (false == entry.getValue()) {
return entry.getKey();
}
}
return null;
}

public void sendToken(Node from, String token) {

Node n;
if ((n = getSilentNeigh()) != null && flag() == 1) {
if (from.equals(n)) {
System.out.println(name + " decides!");
}
}

neigh.put(from, true);
}

@Override
public boolean equals(Object obj) {

if (this == obj) {
return true;
}

if (!(obj instanceof Node)) {
return false;
}

final Node n = (Node) obj;
return name == n.name;
}

@Override
public int hashCode() {
int hc = 17;
return 37 * hc + name;
}

@Override
public void run() {
while(flag() > 1);

Node n = getSilentNeigh();

System.out.println(name + " sends token to " + n.getName());

n.sendToken(this, "token");
}

@Override
public String toString() {
return "Node " + name;
}
}

在 run() 方法中有一个 while(condition) 实际上意味着..等待(从邻居那里接收 token ),当只有一个邻居节点没有收到 token 时,向他发送 token 。

这就是我如何创建节点以及如何相互关联:

        // Number of nodes
int numberOfNodes = 7;

// Array of nodes
Node[] nodes = new Node[numberOfNodes];

for (int i = 0; i < nodes.length; i++) {
// Creating node
nodes[i] = new Node(i);
}

nodes[0].addNeigh(nodes[1]);
nodes[0].addNeigh(nodes[2]);
nodes[1].addNeigh(nodes[0]);
nodes[1].addNeigh(nodes[3]);
nodes[1].addNeigh(nodes[4]);
nodes[2].addNeigh(nodes[0]);
nodes[2].addNeigh(nodes[5]);
nodes[2].addNeigh(nodes[6]);
nodes[3].addNeigh(nodes[1]);
nodes[4].addNeigh(nodes[1]);
nodes[5].addNeigh(nodes[2]);
nodes[6].addNeigh(nodes[2]);

我所做的是随机选择要执行的节点的顺序:

        // List holding random node numbers
List numbers = new ArrayList<Integer>();

int chosen = 0;
while (chosen < numberOfNodes) {
int processNum = randInt(0, (numberOfNodes - 1));
if (!numbers.contains(Integer.valueOf(processNum))) {
numbers.add(new Integer(processNum));
chosen++;
}
}

因此,例如节点可以按任何顺序排列:

0, 5, 3, 4, 6, 2, 1
5, 3, 0, 2, 1, 6, 4
3, 1, 0, 2, 4, 6, 5

然后我开始线程:

for (Integer number : numbers) {
Thread thread = new Thread(nodes[number]);
thread.start();
}

有时我会得到预期的结果(2 必须决定):

Nodes selected: 0, 4, 5, 2, 6, 3, 1
5 sends token to 2
4 sends token to 1
6 sends token to 2
3 sends token to 1
1 sends token to 0
0 sends token to 2
2 decides!
2 sends token to 0
0 decides!

但通常我会得到一个错误,只有一个决定:

Nodes selected: 5, 3, 4, 6, 0, 2, 1
3 sends token to 1
5 sends token to 2
4 sends token to 1
6 sends token to 2
2 sends token to 0
0 sends token to 1
1 decides!
Exception in thread "Thread-6" java.lang.NullPointerException
at uk.ac.ncl.csc8103.wave.Node.run(Node.java:86)
at java.lang.Thread.run(Thread.java:745)

是的,这是一项作业,我和这些人真的很亲近..但我面临着这个问题。

最佳答案

好吧,你的run方法调用了Node n = getSilentNeigh(); 这个调用可能会返回null,而你使用n变量没有检查它是否不为空。

@Override
public void run() {
while(flag() > 1);
Node n = getSilentNeigh(); // this call can return null
System.out.println(name + " sends token to " + n.getName()); // you are probably getting
// NullPointerException here
n.sendToken(this, "token");
}

关于java - 这个算法在 Java 中执行有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26554478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com