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

电网网络边缘负载计算功能实现求助(附测试用例及未完成代码)

电网网络边缘负载计算功能实现求助(附测试用例及未完成代码)

各位大佬好,我现在在实现一个电网网络的边缘负载计算功能,卡在带connection类型节点的网络场景上了,目前的代码只能通过前几个简单的测试用例,复杂场景完全搞不定,求各位帮忙看看问题出在哪,或者给个实现思路!

数据结构定义

export type Network = {
  readonly nodes: readonly Node[];
  readonly edges: readonly Edge[];
}

export type Node = {
  readonly id: string;
  readonly displayName: string;
  readonly type: NodeType;
  readonly isGreenProduction: boolean;
  readonly hasFixedProduction: boolean;
  readonly maxProduction: number;
  production: number;
  readonly requiresGreenConsumption: boolean;
  readonly hasFixedConsumption: boolean;
  readonly maxConsumption: number;
  consumption: number;
}

export type NodeType = "participant" | "connection";

export type Edge = {
  readonly nodes: [Node, Node];
  readonly capacity: number;
  readonly maxCapacity: number;
}

测试用例(预期结果已标注)

这些测试用例定义了各种场景下的预期边缘负载值,我的代码目前只能通过前几个简单场景,带connection节点的复杂场景都不对:

const defaultNode: Node = {
  id: "testNode",
  displayName: "testNode",
  type: "participant",
  production: 0,
  maxProduction: 0,
  isGreenProduction: false,
  hasFixedProduction: false,
  consumption: 0,
  maxConsumption: 0,
  requiresGreenConsumption: false,
  hasFixedConsumption: false,
};

const defaultEdge: Edge = {
  nodes: [defaultNode, defaultNode],
  capacity: 0,
  maxCapacity: 0,
};

describe("Edge calculation", () => {
  /**
   * Producer(100) --- Consumer(100)
   */
  it("simple", () => {
    const producer: Node = { ...defaultNode, production: 100 };
    const consumer: Node = { ...defaultNode, consumption: 100 };
    const edge: Edge = { ...defaultEdge, nodes: [producer, consumer] };
    const network: Network = { nodes: [producer, consumer], edges: [edge] };
    calculateEdges(network);
    expect(edge.capacity).toBe(100);
  });

  /**
   * Producer(150) --- Consumer(100)
   *     |
   * Consumer(50)
   */
  it("simple split consumer", () => {
    const producer: Node = { ...defaultNode, production: 150 };
    const consumer: Node = { ...defaultNode, consumption: 100 };
    const consumer2: Node = { ...defaultNode, consumption: 50 };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, consumer] };
    const edge2: Edge = { ...defaultEdge, nodes: [producer, consumer2] };
    const network: Network = { nodes: [producer, consumer, consumer2], edges: [edge1, edge2] };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(50);
  });

  /**
   * Producer(150) --- Consumer(200)
   *                 /
   *     Producer(50)
   */
  it("simple split producer", () => {
    const producer: Node = { ...defaultNode, production: 150 };
    const producer2: Node = { ...defaultNode, production: 50 };
    const consumer: Node = { ...defaultNode, consumption: 200 };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, consumer] };
    const edge2: Edge = { ...defaultEdge, nodes: [producer2, consumer] };
    const network: Network = { nodes: [producer, producer2, consumer], edges: [edge1, edge2] };
    calculateEdges(network);
    expect(edge1.capacity).toBe(150);
    expect(edge2.capacity).toBe(50);
  });

  /**
   * Producer(100) --- Connection --- Consumer(100)
   */
  it("simple connection", () => {
    const producer: Node = { ...defaultNode, production: 100 };
    const consumer: Node = { ...defaultNode, consumption: 100 };
    const connection: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [connection, consumer] };
    const network: Network = { nodes: [producer, consumer, connection], edges: [edge1, edge2] };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(100);
  });

  /**
   * Producer(100) --- Connection --- Connection --- Consumer(100)
   */
  it("simple double connection", () => {
    const producer: Node = { ...defaultNode, production: 100 };
    const consumer: Node = { ...defaultNode, consumption: 100 };
    const connection: Node = { ...defaultNode, type: "connection" };
    const connection2: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [connection, connection2] };
    const edge3: Edge = { ...defaultEdge, nodes: [connection2, consumer] };
    const network: Network = {
      nodes: [producer, consumer, connection, connection2],
      edges: [edge1, edge2, edge3],
    };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(100);
    expect(edge2.capacity).toBe(100);
  });

  /**
   *                              / Consumer(50)
   * Producer(100) --- Connection
   *                              \ Consumer(50)
   */
  it("simple connection with split", () => {
    const producer: Node = { ...defaultNode, production: 100 };
    const consumer: Node = { ...defaultNode, consumption: 50 };
    const consumer2: Node = { ...defaultNode, consumption: 50 };
    const connection: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [connection, consumer] };
    const edge3: Edge = { ...defaultEdge, nodes: [connection, consumer2] };
    const network: Network = {
      nodes: [producer, consumer, consumer2, connection],
      edges: [edge1, edge2, edge3],
    };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(50);
    expect(edge3.capacity).toBe(50);
  });

  /**
   *
   * Producer(100) --- Connection --- Consumer(150)
   *                       |
   *                  Producer(50)
   */
  it("double producer", () => {
    const producer: Node = { ...defaultNode, production: 100 };
    const producer2: Node = { ...defaultNode, production: 50 };
    const consumer: Node = { ...defaultNode, consumption: 150 };
    const connection: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [producer2, connection] };
    const edge3: Edge = { ...defaultEdge, nodes: [connection, consumer] };
    const network: Network = {
      nodes: [producer, producer2, consumer, connection],
      edges: [edge1, edge2, edge3],
    };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(50);
    expect(edge3.capacity).toBe(150);
  });

  /**
   *
   * Producer(100green) --- Connection --- Consumer(100green)
   *                            |
   *                       Producer(50)
   */
  it("double producer green prefered", () => {
    const producer: Node = { ...defaultNode, production: 100, isGreenProduction: true };
    const producer2: Node = { ...defaultNode, production: 50 };
    const consumer: Node = { ...defaultNode, consumption: 100, requiresGreenConsumption: true };
    const connection: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [producer2, connection] };
    const edge3: Edge = { ...defaultEdge, nodes: [connection, consumer] };
    const network: Network = {
      nodes: [producer, producer2, consumer, connection],
      edges: [edge1, edge2, edge3],
    };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(0);
    expect(edge3.capacity).toBe(100);
  });

  /**
   *
   * Producer(100green) --- Connection --- Consumer(150green)
   *                            |
   *                       Producer(50)
   */
  it("double producer green prefered grey fillup", () => {
    const producer: Node = { ...defaultNode, production: 100, isGreenProduction: true };
    const producer2: Node = { ...defaultNode, production: 50 };
    const consumer: Node = { ...defaultNode, consumption: 150, requiresGreenConsumption: true };
    const connection: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [producer2, connection] };
    const edge3: Edge = { ...defaultEdge, nodes: [connection, consumer] };
    const network: Network = {
      nodes: [producer, producer2, consumer, connection],
      edges: [edge1, edge2, edge3],
    };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(50);
    expect(edge3.capacity).toBe(150);
  });

  /**
   *
   *                        Consumer(50)
   *                            |
   * Producer(100green) --- Connection --- Connection --- Consumer(150green)
   *                            |         |
   *                        Connection ---
   *                            |
   *                        Producer(100)
   */
  it("simple circle", () => {
    const producer: Node = { ...defaultNode, production: 100, isGreenProduction: true };
    const producer2: Node = { ...defaultNode, production: 100 };
    const consumer: Node = { ...defaultNode, consumption: 150, requiresGreenConsumption: true };
    const consumer2: Node = { ...defaultNode, consumption: 50 };
    const connection: Node = { ...defaultNode, type: "connection" };
    const connection2: Node = { ...defaultNode, type: "connection" };
    const connection3: Node = { ...defaultNode, type: "connection" };
    const edge1: Edge = { ...defaultEdge, nodes: [producer, connection] };
    const edge2: Edge = { ...defaultEdge, nodes: [producer2, connection2] };
    const edge3: Edge = { ...defaultEdge, nodes: [connection, connection2] };
    const edge4: Edge = { ...defaultEdge, nodes: [connection, consumer2] };
    const edge5: Edge = { ...defaultEdge, nodes: [connection, connection3] };
    const edge6: Edge = { ...defaultEdge, nodes: [connection2, connection3] };
    const edge7: Edge = { ...defaultEdge, nodes: [connection3, consumer] };
    const network: Network = {
      nodes: [producer, producer2, consumer, consumer2, connection, connection2, connection3],
      edges: [edge1, edge2, edge3, edge4, edge5, edge6, edge7],
    };
    calculateEdges(network);
    expect(edge1.capacity).toBe(100);
    expect(edge2.capacity).toBe(50);
    expect(edge3.capacity).toBe(50);
    expect(edge4.capacity).toBe(50);
    expect(edge5.capacity).toBe(100);
    expect(edge6.capacity).toBe(50);
    expect(edge7.capacity).toBe(150);
  });
});

我目前的未完成代码

我尝试用CalcNode来记录每个节点的供需情况,但connection节点的处理逻辑明显有问题,现在的代码只能处理简单的直连场景,复杂的连接节点转发、绿色能源优先的场景都处理不了:

type CalcNode = {
  giving: number;
  requesting: number;
  realNode: Node;
};

export function calculateEdges(network: Network): void {
  const calcNodes: CalcNode[] = network.nodes.map((node) => {
    const calcNode: CalcNode = { giving: 0, requesting: 0, realNode: node };
    if (node.type === "connection") {
      network.edges
        .filter((edge) => edge.nodes[0] === node || edge.nodes[1] === node)
        .forEach((edge) => {
          // TODO add
          if (edge.nodes[0] === node) {
            calcNode.giving = Math.max(calcNode.giving, edge.nodes[1].production);
            calcNode.requesting = Math.max(
              calcNode.requesting,
              edge.nodes[1].consumption,
            );
          } else if (edge.nodes[1] === node) {
            calcNode.giving = Math.max(calcNode.giving, edge.nodes[0].production);
            calcNode.requesting = Math.max(
              calcNode.requesting,
              edge.nodes[0].consumption,
            );
          }
        });
    } else {
      calcNode.giving = node.production;
      calcNode.requesting = node.consumption;
    }
    return calcNode;
  });

  calcNodes.forEach((node) => console.log(node));

  network.edges.forEach((edge) => {
    const node1 = calcNodes.find((calcNode) => calcNode.realNode === edge.nodes[0])!;
    const node2 = calcNodes.find((calcNode) => calcNode.realNode === edge.nodes[1])!;
    if (node1.requesting == 0) {
      edge.capacity = Math.max(node1.giving, node2.giving, node2.requesting);
    }
  });
}

核心问题

我现在的主要困惑是:

  • connection节点本身没有生产和消费,它只是起到中转作用,怎么正确计算它的供需,进而算出连接它的每条边的负载?
  • 绿色能源优先的规则(需要绿色消费的节点优先用绿色生产的能源)怎么融入到计算逻辑里?
  • 环形网络这种复杂拓扑的负载怎么正确分配?

希望各位大佬能给点思路,或者帮我修正代码,谢谢大家!

备注:内容来源于stack exchange,提问作者Reborok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:49:38