AOE网 Javascript实现

作者: xrsylf | 来源:发表于2020-01-07 17:52 被阅读0次

该算法可用于关键路径的查找

算法介绍

参考 这里

代码

/**
 * 只针对一个开始节点,一个结束节点的情况
 */
export class Aoe {
    constructor(
    public startNode: string, // 确定开始节点, 如果不想传入,可以通过edges查找
    public edges: Edge[] = [],
        ) { }
    getCriticalPath(): string[] {
        const ee: Event[] = []; 
        const processNodes = [];
        processNodes.push(this.startNode);
        while(true) {
            const node = processNodes.pop();
            if(!node) {
                break;
            }
            const edges = this.edges.filter(u => u.target === node);
            if(edges.length == 0) {
                ee.push(new Event(node, 0));
                this.edges.filter(u => u.source === node).forEach(u => processNodes.push(u.target));
            } else if (edges.filter(u => ee.findIndex(v => v.node === u.source) < 0).length === 0) {
                const eeValue = edges.map(u => u.weight + ee.find(v=>v.node === u.source).weight).sort((a, b) =>  b - a)[0];
                ee.push(new Event(node, eeValue));
                this.edges.filter(u => u.source === node).forEach(u => processNodes.push(u.target));
            }
        }
        const lastEvent = ee[ee.length - 1];
        const le: Event[] = [];
        processNodes.push(lastEvent.node);
        while(true) {
            const node = processNodes.pop();
            if(!node) {
                break;
            }
            const edges = this.edges.filter(u => u.source === node);
            if(edges.length == 0) {
                le.push(new Event(node, lastEvent.weight));
                this.edges.filter(u => u.target === node).forEach(u => processNodes.push(u.source));
            } else if (edges.filter(u => le.findIndex(v => v.node === u.target) < 0).length === 0) {
                const leValue = edges.map(u => le.find(v => v.node === u.target).weight - u.weight).sort((a, b) =>  a - b)[0];
                le.push(new Event(node, leValue));
                this.edges.filter(u => u.target === node).forEach(u => processNodes.push(u.source));
            }
        }
        console.log('ee', ee);
        console.log('le', le);
        const path =  ee.filter(u => le.find(v => v.node === u.node).weight === u.weight).map(u => u.node);
        console.log('critical path', path);
        return path;
    }
}

class Event {
    constructor(public node: string, public weight: number) {}
}

export class Edge {
    constructor(public source: string, 
        public target: string, 
        public weight: number) { }
}

相关文章

  • AOE网 Javascript实现

    该算法可用于关键路径的查找 算法介绍 参考 这里 代码

  • AOE网

    那么AOE网主要用在如何计算一个工程的完工时间,和优化工程方案减少工程完工时间。在一个表示工程的带权有向图中,用顶...

  • AOE网

    AOE网实用场景 主要用在如何计算一个工程的完工时间,和优化工程方案减少工程完工时间。 辅助决策系统,工程管理、生...

  • 网(二,AOE网)

    概述 AOE网主要用在如何计算一个工程的完工时间,和优化工程方案减少工程完工时间 在一个表示工程的带权有向图中,用...

  • 图之--AOV/AOE网及关键路径

    有向图的两个广泛应用的网络,AOV和AOE网AOV网:图中的顶点表示活动,边表示依赖关系AOE网:图中的顶点表示事...

  • AOV网与AOE网

    AOV网: 顶点表示活动,有向边表示课程的先导关系。 AOV网是有向无环图,即不应该带有回路,因为若带有回路,则会...

  • AOV网与拓扑排序算法

    主要为AOE网打下基础。AOE网:主要用在如何计算一个工程的完工时间,和优化工程方案减少工程完工时间 1、概念 A...

  • 图-关键路径(AOE网)

    AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向...

  • 区块链挖矿系统开发

    AOE智能合约系统开发,AOE区块链游戏系统开发,AOE社交游戏系统开发,AOE币生息系统开发,AOE挖矿系统开发...

  • javascript和jscript的区别

    javascript和jscript都是一种脚本语言,都是ECMA-262的实现,不同的是javascript是网...

网友评论

    本文标题:AOE网 Javascript实现

    本文链接:https://www.haomeiwen.com/subject/qxkdactx.html