You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

节点图中引用的异常行为排查求助

问题原因与解决方案

核心问题:双向连接是两个独立的Connection实例

在GetInput方法构建图的双向连接时,你创建了两个完全独立的Connection对象:

fromNode.connections.Add(new Connection() { nextNode = toNode, lamps = input_lamps });
toNode.connections.Add(new Connection() { nextNode = fromNode, lamps = input_lamps });

这两个Connection是不同的引用,只是初始lamps值相同、nextNode指向对方节点。所以修改其中一个的lamps时,另一个不会自动同步——它们根本不是同一个对象。

你混淆了节点引用和连接引用

你调试时用Node.ReferenceEquals验证的是节点对象的引用一致性,这确实是对的(两个连接的nextNode指向同一个节点实例),但这和Connection对象本身的引用无关。你修改的是其中一个连接的lamps,另一个连接的lamps自然不会变化。

两种可行的解决方案

1. 给连接添加反向引用,修改时同步更新

修改Connection类,增加反向连接的属性:

internal class Connection
{
    public Node nextNode;
    public int lamps;
    public Connection Reverse { get; set; } // 新增反向连接属性
}

在构建连接时关联反向连接:

var forwardConn = new Connection() { nextNode = toNode, lamps = input_lamps };
var reverseConn = new Connection() { nextNode = fromNode, lamps = input_lamps };
forwardConn.Reverse = reverseConn;
reverseConn.Reverse = forwardConn;
fromNode.connections.Add(forwardConn);
toNode.connections.Add(reverseConn);

之后修改lamps时,同时更新反向连接:

edgeNode.lamps = 0;
edgeNode.Reverse.lamps = 0;

2. 修改时直接查找并更新反向连接

在Proceed方法中,修改邻节点的连接时,精准找到指向当前节点的反向连接再修改:

// 替换原有的邻节点循环逻辑
var targetNode = edgeNode.nextNode;
// 找到targetNode中指向当前node的连接
var reverseConnection = targetNode.connections.First(c => c.nextNode.number == node.number);
reverseConnection.lamps -= removeLamps;

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:15:26