精华内容
下载资源
问答
  • 应用故障树形图分析法对点火源和油气泄漏的基本原因进行了分析,建立了油罐火灾爆炸故障树形图。采用布尔代数化简法求出系统的最小径集,给出了故障树顶上事件发生概率和基本事件的3种重要度分析。通过对系统的故障树...
  • echarts中的树形结构(参数分析

    万次阅读 多人点赞 2018-05-10 10:41:24
    先上echarts官网示例,可以点开链接查看,这里先上一张截图,以及官网代码 官网代码: myChart.showLoading(); //显示Loading标志; var myChart = echarts.init(document.getElementById('页面中div的id'));...

    先上echarts官网示例图,可以点开链接查看,这里先上一张截图,以及官网代码

    官网代码:

    myChart.showLoading();    //显示Loading标志; var myChart = echarts.init(document.getElementById('页面中div的id')); 
    $.get('data/asset/data/flare.json', function (data) {
        myChart.hideLoading();    //得到数据后隐藏Loading标志
    
        echarts.util.each(data.children, function (datum, index) {
            index % 2 === 0 && (datum.collapsed = true);
        });    //间隔展开子数据,animate,display,physics,scale,vis是展开的
    
        myChart.setOption(option = {
            tooltip: {    //提示框组件
                trigger: 'item',    //触发类型,默认:item(数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用)。可选:'axis':坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。'none':什么都不触发。
                triggerOn: 'mousemove'    //提示框触发的条件,默认mousemove|click(鼠标点击和移动时触发)。可选mousemove:鼠标移动时,click:鼠标点击时,none:        
            },
            series: [    //系列列表
                {
                    type: 'tree',    //树形结构
    
                    data: [data],    //上面从flare.json中得到的数据
    
                    top: '1%',       //距离上
                    left: '7%',      //左
                    bottom: '1%',    //下
                    right: '20%',    //右的距离
    
                    symbolSize: 7,   //标记的大小,就是那个小圆圈,默认7
    
                    label: {         //每个节点所对应的标签的样式
                        normal: {
                            position: 'left',       //标签的位置
                            verticalAlign: 'middle',//文字垂直对齐方式,默认自动。可选:top,middle,bottom
                            align: 'right',         //文字水平对齐方式,默认自动。可选:top,center,bottom
                            fontSize: 9             //标签文字大小
                        }
                    },
    
                    leaves: {    //叶子节点的特殊配置,如上面的树图示例中,叶子节点和非叶子节点的标签位置不同
                        label: {
                            normal: {
                                position: 'right',
                                verticalAlign: 'middle',
                                align: 'left'
                            }
                        }
                    },
    
                    expandAndCollapse: true,    //子树折叠和展开的交互,默认打开
                    animationDuration: 550,     //初始动画的时长,支持回调函数,默认1000
                    animationDurationUpdate: 750//数据更新动画的时长,默认300
                }
            ]
        });
    });

    附上一张官网的flare.json数据结构的截图

    展开之后:

    可以看到每一层都是以name,children的形式

    附上一段我自己写的代码得到的结果,数据少一点看起来更清晰:

            {
                "children": [
                    {
                        "children": [
                            {
                                "children": [
                                    {
                                        "children": [],
                                        "name": "低压车间表计82"
                                    }
                                ],
                                "name": "低压关口表计1"
                            }
                        ],
                        "name": "高压子表计122"
                    },
                    {
                        "children": [
                            {
                                "children": [],
                                "name": "低压关口表计101"
                            }
                        ],
                        "name": "高压子表计141"
                    }
                ],
                "name": "高压总表计102"
            }

    自己写来用的js代码,该树状图垂直模式:

    myChart.setOption(option = {
                tooltip: {
                    // show:'true',//默认:true;是否显示提示框组件,包括提示框浮层和 axisPointer。
                    trigger: 'item',//默认:item;触发类型。item:数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用。'axis':坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。'none':什么都不触发。
                    triggerOn: 'mousemove'
                },
                series:[
                    {
                        type: 'tree',
    
                        data: [data],
    
                        left: '2%',
                        right: '2%',
                        top: '15%',
                        bottom: '10%',
    
                        symbol: 'emptyCircle',
    
                        orient: 'vertical',
    
                        expandAndCollapse: true,//默认:true;子树折叠和展开的交互,默认打开 。
    
                        initialTreeDepth:2,//默认:2,树图初始展开的层级(深度)。根节点是第 0 层,然后是第 1 层、第 2 层,... ,直到叶子节点
    
                        label: {
                            normal: {
                                position: 'top',//标签的位置。
                                rotate: -90,//标签旋转。从 -90 度到 90 度。正值是逆时针。
                                verticalAlign: 'middle',//文字垂直对齐方式,默认自动。
                                align: 'right',//文字水平对齐方式,默认自动。
                                fontSize: 12,//文字的字体大小
                            }
                        },
    
                        leaves: {
                            label: {
                                normal: {
                                    position: 'bottom',
                                    rotate: -90,
                                    verticalAlign: 'middle',
                                    align: 'left',
                                    fontSize: 8,//文字的字体大小
                                }
                            }
                        },
    
                        animationDurationUpdate: 750
                        
                    }
                ]
            });

     

    附上我写出来的效果图:

     

     

    echarts官网中tooltip的参数文档

    echarts官网中tree的series参数文档

    echarts官网中.setOption参数文档

     

    再列出一些我觉得可能会用到的参数,方便以后使用:

    series(系列列表)

    1,layout:树图的布局,有 正交 和 径向 两种(正交就是水平或垂直;径向就是以根节点为原点,每一层为一环)

    2,orient:树图中 正交布局 的方向

    3,symbol:标记的图形(默认:emptyCricle)

    4,initialTreeDepth:树图初始展开的层级(深度)(默认:2)

    5,itemStyle:树图中每个节点的样式

    6,label:每个节点所对应的文本标签的样式

    7,rich:自定义富文本样式,在标签中做出非常丰富的效果。

    8,leaves:叶子节点的特殊配置

    9,emphasis:树图中个图形和标签高亮的样式

    10,data:数据格式是树状结构

    11,lineStyle:定义树图边的样式

     

     

    展开全文
  • Java中树形菜单分析和实现

    万次阅读 多人点赞 2018-06-19 16:38:14
    最近在搭建基于Spring Boot(2.0.2)种子项目框架时,遇到了树形菜单加载问题。特此把解决的问题方案记录下去,供其他小伙伴参考和日后回顾。 方案分析 方案选择 一次性加载完,返回前台需要的数据...

    一、背景概述

    • 最近在搭建基于Spring Boot(2.0.2)种子项目框架时,遇到了树形菜单加载问题。特此把解决的问题方案记录下去,供其他小伙伴参考和日后回顾。

    二、方案分析

    • 方案选择
      • 一次性加载完,返回前台需要的数据结构
      • 点击加载,默认记载根层级的菜单。后续点击那一级菜单加载其下的子节点
    • 方案实现
      • 在这里只分析一次性加载实现。第二种实现起来更简单。在这里略过。有兴趣可以自己研究一下。

    三、具体实现

    1. 表、对象设计

      1. 表结构
        这里写图片描述
      2. 测试数据(忽略内容==)
        这里写图片描述
      3. 对象字段
      private String informationTypeId; // 菜单id
      private Integer informationTypeNum;
      private String informationTypeCode;
      private String informationTypeUrl;
      private String informationTypeName;
      private String informationTypePicBosKey;
      private Integer informationTypeLevel;
      private String type;
      private String model;
      private Boolean isEdit;
      private String parentId;  // 父菜单id
      private String remark;
      private String createUserId;
      private Date createTime;
      private String modifyUserId;
      private Date modifyTime;
      private Date timeStamp;
      private List<InformationTypeEntity> childNodes = new ArrayList<>();  // 子菜单list
      // 省略set,get
      
      1. 查出所有菜单列表
        /**
         * 查询资讯菜单(一次性加载)
         *
         * @throws CustomException
         */
        @RequestMapping(value = "/findAllTypeList")
        public List<InformationTypeEntity> findAllTypeList() throws CustomException {
            // 加载所有菜单列表
            // 根级的菜单列表
            List<InformationTypeEntity> rootList = informationTypeService.findInfoTypeByType("1", null);
            List<InformationTypeEntity> list = new ArrayList<>();
            
            for (int i = 0; i < rootList.size(); i++) {
                InformationTypeEntity typeEntity = rootList.get(i);
                if ("-1".equals(typeEntity.getParentId())) {
                    list.add(typeEntity);
                }
            }
    
            for (InformationTypeEntity entity : list) {
                entity.setChildNodes(getChildNodes(entity.getInformationTypeId(), rootList));
            }
            return list;
        }
    
    1. 找出根节点菜单列表
        /**
         * 查询资讯菜单(一次性加载)
         *
         * @throws CustomException
         */
        @RequestMapping(value = "/findAllTypeList")
        public List<InformationTypeEntity> findAllTypeList() throws CustomException {
            List<InformationTypeEntity> rootList = informationTypeService.findInfoTypeByType("1", null);
            List<InformationTypeEntity> list = new ArrayList<>();
            for (int i = 0; i < rootList.size(); i++) {
                InformationTypeEntity typeEntity = rootList.get(i);
                // 找出根级菜单,(约定所有根级菜单的parentId属性为-1)
                if ("-1".equals(typeEntity.getParentId())) {
                    list.add(typeEntity);
                }
            }
        
            for (InformationTypeEntity entity : list) {
                entity.setChildNodes(getChildNodes(entity.getInformationTypeId(), rootList));
            }
            return list;
        }
    
    1. 循环找出每个子节点的菜单列表
        /**
         * 查询资讯菜单(一次性加载)
         *
         * @throws CustomException
         */
        @RequestMapping(value = "/findAllTypeList")
        public List<InformationTypeEntity> findAllTypeList() throws CustomException {
            List<InformationTypeEntity> rootList = informationTypeService.findInfoTypeByType("1", null);
            List<InformationTypeEntity> list = new ArrayList<>();
            for (int i = 0; i < rootList.size(); i++) {
                InformationTypeEntity typeEntity = rootList.get(i);
                // 找出根级菜单,(约定所有根级菜单的parentId属性为-1)
                if ("-1".equals(typeEntity.getParentId())) {
                    list.add(typeEntity);
                }
            }
            
            // 循环根级菜单,为每个根级菜单下的子菜单list赋值。
            for (InformationTypeEntity entity : list) {
                entity.setChildNodes(getChildNodes(entity.getInformationTypeId(), rootList));
            }
            return list;
        }
    
    • 递归解决无限层级嵌套(里面的注释我写的很清楚。大概的思路就是除了当前子菜单后,还要考虑子菜单的子菜单,考虑用递归处理。递归结束的条件就是没有子菜单,也就是list的size为0.此种方式支持无线的嵌套)
        /**
         * Return the list of children node from percent menu id
         *
         * @param id  current menu id
         * @param rootList  all list of menus
         * @return
         * @throws CustomException
         */
        private List<InformationTypeEntity> getChildNodes(String id, List<InformationTypeEntity> rootList) throws CustomException {
            // The list of child nodes
            List<InformationTypeEntity> childList = new ArrayList<>();
            // Fill the list of child'nodes which parent id equal params of id
            for (InformationTypeEntity typeEntity : rootList) {
                if (StringUtils.isNotBlank(typeEntity.getParentId())) {
                    if (id.equals(typeEntity.getParentId())) {
                        childList.add(typeEntity);
                    }
                }
            }
            if (childList.size() == 0) {
                return null;
            }
            // Look up it's child node and fill
            for (InformationTypeEntity entity : childList) {
                entity.setChildNodes(getChildNodes(entity.getInformationTypeId(), rootList));
            }
            return childList;
        }
    

    四、总结

    • 关于树形菜单的实现方案有很多,我只是列举出比较典型的2种方案。
    • 举例的这种方案可以支持无限级嵌套
    • 举例的这种只发送一次sql,可以在一定程度上调高效率,减少数据库压力
    • 理解思路,上面的代码好看优化哈,以后有时间再补充上

    五、测试结果返回的数据结果示例如下 (数组中包含多个对象,对象里面嵌套子节点集合…)

    其实这样的数据结构会满足大部分前端树形组件的数据结构的要求。

    前台菜单形如下图:

    在这里插入图片描述

    后端返回的结果如下结构:

    [
      {
        "informationTypeId": "4",
        "informationTypeNum": 1,
        "informationTypeCode": "001",
        "informationTypeUrl": "/index",
        "informationTypeName": "资讯管理",
        "informationTypePicBosKey": "pic",
        "informationTypeLevel": null,
        "type": "1",
        "model": "1",
        "isEdit": null,
        "parentId": "-1",
        "remark": null,
        "createUserId": null,
        "createTime": null,
        "modifyUserId": null,
        "modifyTime": null,
        "timeStamp": "2018-06-15 10:17:51",
        "childNodes": [
          {
            "informationTypeId": "1",
            "informationTypeNum": 1,
            "informationTypeCode": "001001",
            "informationTypeUrl": "/index1",
            "informationTypeName": "十九大管理",
            "informationTypePicBosKey": "pic1",
            "informationTypeLevel": null,
            "type": "1",
            "model": "1",
            "isEdit": null,
            "parentId": "4",
            "remark": null,
            "createUserId": null,
            "createTime": "2018-06-01 10:15:35",
            "modifyUserId": null,
            "modifyTime": null,
            "timeStamp": "2018-06-15 10:17:56",
            "childNodes": [
              {
                "informationTypeId": "5",
                "informationTypeNum": 1,
                "informationTypeCode": "001001001",
                "informationTypeUrl": "/index/index1",
                "informationTypeName": "中国梦",
                "informationTypePicBosKey": "pic",
                "informationTypeLevel": null,
                "type": "1",
                "model": "2",
                "isEdit": null,
                "parentId": "1",
                "remark": null,
                "createUserId": null,
                "createTime": null,
                "modifyUserId": null,
                "modifyTime": null,
                "timeStamp": "2018-06-15 10:18:53",
                "childNodes": [
                  {
                    "informationTypeId": "8",
                    "informationTypeNum": 1,
                    "informationTypeCode": "001001001001",
                    "informationTypeUrl": "/index/index/index",
                    "informationTypeName": "白日梦",
                    "informationTypePicBosKey": "pic",
                    "informationTypeLevel": null,
                    "type": "1",
                    "model": "1",
                    "isEdit": null,
                    "parentId": "5",
                    "remark": null,
                    "createUserId": null,
                    "createTime": null,
                    "modifyUserId": null,
                    "modifyTime": null,
                    "timeStamp": "2018-06-15 11:21:50",
                    "childNodes": [
                      {
                        "informationTypeId": "10",
                        "informationTypeNum": 1,
                        "informationTypeCode": "001001001001001",
                        "informationTypeUrl": "/index/index/index2",
                        "informationTypeName": "李白的白日梦",
                        "informationTypePicBosKey": "pic",
                        "informationTypeLevel": null,
                        "type": "1",
                        "model": "1",
                        "isEdit": null,
                        "parentId": "8",
                        "remark": null,
                        "createUserId": null,
                        "createTime": null,
                        "modifyUserId": null,
                        "modifyTime": null,
                        "timeStamp": "2018-06-15 11:24:05",
                        "childNodes": [
                          {
                            "informationTypeId": "12",
                            "informationTypeNum": 1,
                            "informationTypeCode": "000013123123123123123",
                            "informationTypeUrl": "12341234123123",
                            "informationTypeName": "李白的白日梦儿子1",
                            "informationTypePicBosKey": "23213",
                            "informationTypeLevel": null,
                            "type": "1",
                            "model": "1",
                            "isEdit": null,
                            "parentId": "10",
                            "remark": null,
                            "createUserId": null,
                            "createTime": null,
                            "modifyUserId": null,
                            "modifyTime": null,
                            "timeStamp": "2018-06-15 11:32:36",
                            "childNodes": [
                              {
                                "informationTypeId": "14",
                                "informationTypeNum": 2,
                                "informationTypeCode": "242424",
                                "informationTypeUrl": "24243234234",
                                "informationTypeName": "l李白的白日梦儿子1的儿子11111",
                                "informationTypePicBosKey": "2424",
                                "informationTypeLevel": null,
                                "type": "1",
                                "model": "2",
                                "isEdit": null,
                                "parentId": "12",
                                "remark": null,
                                "createUserId": null,
                                "createTime": null,
                                "modifyUserId": null,
                                "modifyTime": null,
                                "timeStamp": "2018-06-15 11:36:28",
                                "childNodes": null
                              }
                            ]
                          },
                          {
                            "informationTypeId": "13",
                            "informationTypeNum": 2,
                            "informationTypeCode": "2424234234234234",
                            "informationTypeUrl": "2424242424",
                            "informationTypeName": "李白的白日梦儿子2",
                            "informationTypePicBosKey": "23424",
                            "informationTypeLevel": null,
                            "type": "1",
                            "model": "1",
                            "isEdit": null,
                            "parentId": "10",
                            "remark": null,
                            "createUserId": null,
                            "createTime": null,
                            "modifyUserId": null,
                            "modifyTime": null,
                            "timeStamp": "2018-06-15 11:33:07",
                            "childNodes": null
                          }
                        ]
                      },
                      {
                        "informationTypeId": "11",
                        "informationTypeNum": 2,
                        "informationTypeCode": "0010001001001002",
                        "informationTypeUrl": "/index/index/index2",
                        "informationTypeName": "杜甫的白日梦",
                        "informationTypePicBosKey": "pic",
                        "informationTypeLevel": null,
                        "type": "1",
                        "model": "2",
                        "isEdit": null,
                        "parentId": "8",
                        "remark": null,
                        "createUserId": null,
                        "createTime": null,
                        "modifyUserId": null,
                        "modifyTime": null,
                        "timeStamp": "2018-06-15 11:24:58",
                        "childNodes": null
                      }
                    ]
                  },
                  {
                    "informationTypeId": "9",
                    "informationTypeNum": 2,
                    "informationTypeCode": "001001001002",
                    "informationTypeUrl": "/index/index/index2",
                    "informationTypeName": "黑夜梦",
                    "informationTypePicBosKey": "pic",
                    "informationTypeLevel": null,
                    "type": "1",
                    "model": "2",
                    "isEdit": null,
                    "parentId": "5",
                    "remark": null,
                    "createUserId": null,
                    "createTime": null,
                    "modifyUserId": null,
                    "modifyTime": null,
                    "timeStamp": "2018-06-15 11:22:30",
                    "childNodes": null
                  }
                ]
              },
              {
                "informationTypeId": "6",
                "informationTypeNum": 2,
                "informationTypeCode": "001001002",
                "informationTypeUrl": "/index/index2",
                "informationTypeName": "扶贫",
                "informationTypePicBosKey": "pic",
                "informationTypeLevel": null,
                "type": "1",
                "model": "2",
                "isEdit": null,
                "parentId": "1",
                "remark": null,
                "createUserId": null,
                "createTime": null,
                "modifyUserId": null,
                "modifyTime": null,
                "timeStamp": "2018-06-15 10:20:23",
                "childNodes": null
              }
            ]
          },
          {
            "informationTypeId": "2",
            "informationTypeNum": 2,
            "informationTypeCode": "001002",
            "informationTypeUrl": "/index2",
            "informationTypeName": "党代会议管理",
            "informationTypePicBosKey": "pic2",
            "informationTypeLevel": null,
            "type": "1",
            "model": "2",
            "isEdit": null,
            "parentId": "4",
            "remark": null,
            "createUserId": null,
            "createTime": "2018-06-13 05:48:42",
            "modifyUserId": null,
            "modifyTime": null,
            "timeStamp": "2018-06-15 10:17:54",
            "childNodes": [
              {
                "informationTypeId": "7",
                "informationTypeNum": 1,
                "informationTypeCode": "001002001",
                "informationTypeUrl": "/index/index",
                "informationTypeName": "党会管理",
                "informationTypePicBosKey": "pic111",
                "informationTypeLevel": null,
                "type": "1",
                "model": "3",
                "isEdit": null,
                "parentId": "2",
                "remark": null,
                "createUserId": null,
                "createTime": null,
                "modifyUserId": null,
                "modifyTime": null,
                "timeStamp": "2018-06-15 10:20:59",
                "childNodes": null
              }
            ]
          },
          {
            "informationTypeId": "3",
            "informationTypeNum": 3,
            "informationTypeCode": "001003",
            "informationTypeUrl": "/index3",
            "informationTypeName": "两学一做",
            "informationTypePicBosKey": "pic3",
            "informationTypeLevel": null,
            "type": "1",
            "model": "1",
            "isEdit": null,
            "parentId": "4",
            "remark": null,
            "createUserId": null,
            "createTime": null,
            "modifyUserId": null,
            "modifyTime": null,
            "timeStamp": "2018-06-15 10:17:53",
            "childNodes": null
          }
        ]
      }
    ]
    
    展开全文
  • R语言画聚类分析树形图

    万次阅读 2014-09-23 16:52:48
    以iris数据集为例: data(iris) newiris newiris$Species library(colorspace) ...#nbproc为处理器数,系统聚类分析 ...2、枝叶在横轴上的树形图 源码:

    以iris数据集为例:

    data(iris)

    newiris<-iris

    newiris$Species<-NULL

    library(colorspace)

    require(amap, quietly=TRUE)

    require(ggplot2, quietly=TRUE)

    require(ggdendro, quietly=TRUE)

    hclust <- hclusterpar(na.omit(newiris), method="euclidean", link="ward", nbproc=2)#nbproc为处理器数,系统聚类分析

    ddata <- dendro_data(hclust, type="rectangle")
    g <- ggplot(segment(ddata))
    g <- g + geom_segment(aes(x = y, y = x, xend = yend, yend = xend))#将x和y互换,即将树的形状转90度
    g <- g + scale_y_discrete(labels = ddata$label$label)#y轴的显示,即x的值,如公司名称等
    g <- g + labs(x="高度", y="公司")#x和y轴的label
    print(g)


    2、枝叶在横轴上的树形图

    源码:




    展开全文
  • 用TeX画句法树形图.7z

    2012-06-13 23:02:59
    用TeX画句法树形图
  • 龙卷风:是项目管理中用于在风险识别和定性分析之后,进行定量风险分析的技术----敏感性分析技术中最常用的一种图表技术。 敏感性分析:敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它把所有其他不...

    龙卷风图:是项目管理中用于在风险识别和定性分析之后,进行定量风险分析的技术----敏感性分析技术中最常用的一种图表技术。 

    敏感性分析:敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它把所有其他不确定因素保持在基准值的条件下,考察项目的每项要素的不确定性对目标产生多大程度的影响。 

      

    敏感性分析最常用的显示方式是龙卷风图。   

    龙卷风图有助于比较具有较高不确定性的变量与相对稳定的变量之间的相对重要程度。 

    它因其显示形式像龙卷风一样而得名。图例请见图片。

     

    ___________________________________________________________________________________________

    风险定量分析工具之龙卷风图

    https://blog.csdn.net/rongwenbin/article/details/9301091

      
    龙卷风图(TornadoDiagram)是在风险定量分析中采用的一种对单因素敏感性分析的工具。因其图形状像龙卷风,因此而得名。主要用来分析在其它因素单个较高不确定性因素和其它相对稳定因素之间的相对重要程度。
    一个标准的龙卷风图如下图所示。
    龙卷风图.jpg

    图中,X轴表示各因素对结果的影响的取值范围。Y轴表示各不确定性因素的名称,它们对结果的影响值和它们本身的取值。
    对每一个不确定的决定因素,该图都包含了一个横杆和两组数字(分别在横杆的左边和右边)。
    每组数字对应着该因素对结果的影响值(上面的数字,负数用括号括住了)和该因素本身的值(下面的数字,花括号内)。

    _________________________________________________________________________________________

     

    决策树形图:按照当前数据集的不同属性特征将其划分为不同分支节点(数据子集),直到每一个节点的所有样本数据都属于同一类别分支属性停止划分,最终形成“树状”分支结构图形。

     

     

    ________________________________________________________________________________________________-

    蒙特卡洛模拟(Monte Carlo Simulation)浅析

    https://www.jianshu.com/p/cb44f4b457c3
     

    蒙特卡洛模拟作为一种常用的模拟技术,在PMBOK里经常可以看到它的身影,其主要出现在风险管理知识领域中的定量风险分析过程,是用于做项目定量风险分析的工具之一,同时蒙特卡洛模拟也可以用于估算进度或成本以及制定进度计划等。(全文共 2741 字,阅读大约需要 10 分钟。)

    蒙特卡洛模拟由于在PMBOK里讲得较为简单和抽象,理解起来稍微有点困难。为了让大家更加通透地理解蒙特卡洛模拟的作用及其过程原理,本文试图通过一个简单的例子来实操模拟一下这个蒙特卡洛模拟的过程。

    一、简要介绍

    到底什么是蒙特卡洛模拟呢?蒙特卡洛模拟是一种统计学的方法,用来模拟大量数据。可能童鞋们看到这个定义更晕了,到底什么是统计学方法,模拟大量数据干什么?别着急下面会慢慢一一道来。

    我们先来简单介绍一下关于蒙特卡洛模拟的一些背景知识。蒙特卡洛模拟是在二战期间,当时在原子弹研制的项目中,为了模拟裂变物质的中子随机扩散现象,由美国数学家冯·诺伊曼(学计算机的同学都知道这位冯同志的大名,人称“计算机之父”)和乌拉姆等发明的一种统计方法。之所以起名叫蒙特卡洛模拟,是因为蒙特卡洛在是欧洲袖珍国家摩纳哥一个城市,这个城市在当时是非常著名的一个赌城。因为赌博的本质是算概率,而蒙特卡洛模拟正是以概率为基础的一种方法,所以用赌城的名字为这种方法命名。

    蒙特卡洛模拟是在计算机上模拟项目实施了成千上万次,每次输入都随机选择输入值。由于每个输入很多时候本身就是一个估计区间,因此计算机模型会随机选取每个输入的该区间内的任意值,通过大量成千上万甚至百万次的模拟次数,最终得出一个累计概率分布图,这个就是蒙特卡洛模拟。

    二、 模拟过程

    蒙特卡洛模拟在实际的项目管理应用中一般较为复杂,而且很多时候用在专业的项目风险分析软件里面(比如Pertmaster),通常用在较为大型的项目和企业中。我们这篇文章只是为了让童鞋们对于蒙特卡洛模拟有个更为直观清晰的认识,同时鉴于篇幅和不至于让讲解过于晦涩,所以这儿我们只是准备用Excel工具来简单地模拟和介绍一下蒙特卡洛模拟的实施操作过程,这样大家也能对蒙特卡洛模拟有个更为直观地了解。

    我们以定量分析项目总持续时间为例来简要介绍一下蒙特卡洛模拟。比如说我们现在有个项目,该项目共有三个WBS要素分别是设计、建造和测试,为了简单起见我们假设这三个WBS要素的预估的工期概率分布都呈标准正态分布,各自的平均工期、标准差以及最悲观、最可能和最乐观的估计工期如下图所示(我们这儿简单地认为基于正态分布的工期的最悲观/最乐观的估算工期定在均值正负3个标准差的位置),而且三者之间都是完成到开始的逻辑关系,这样整个项目工期就是这三个WBS要素工期之和。

     

    现在我们需要用蒙特卡洛模拟来以这三个要素的工期的分布为输入,来模拟得到整个项目的工期概率分布图。由于设计、建造和测试这三个要素都是呈标准正态分布,我们可以根据上面表格中的各自的均值和标准差数据大致画出这三个要素工期的概率分布图如下面的样子:

     

    我们要用蒙特卡洛模拟来定量分析整个项目的工期进度风险。于是我们用计算机来模拟项目的实施,我们的思路是:第一步:随机选取每个WBS要素的工期值作为输入(因为每个要素的工期不是恒定的,本身就是一个估计的分布区间);第二步:然后把三个WBS要素的值相加得到整个项目的工期值,这样就完成了一次模拟;第三步:重复第一二步,然后就这样一次一次的模拟,需要模拟成千上万次最终得到成千上万个整个项目总工期的数值;第四步:再对这些海量模拟次数得到海量总工期数值进行统计分析,得出其最终的项目总工期估计的概率分布。

    我们先做第一步。第一步需要我们先产生这些每个要素的随机工期值。Excel里面有个函数可以生成呈正态分布的随机数,就是NORMINV。我们的设计要素的第一个随机工期取值的公式就是这么写的:=ROUND(NORMINV(RAND(),$E$3,$F$3),0),如下图所示:

     

    解释一下这个公式:ROUND(NORMINV(RAND(),$E$3,$F$3),0),RAND() 是生成0到1之间的随机数,NORMINV(RAND(),$E$3,$F$3) 是生成呈均值为E3(图中为14)、标准差为F3(图中为2)的正态分布的随机数,ROUND 是四舍五入的意思,这样回车我们就生成了设计这个要素的第一个随机工期值17。同理我们把这个公式值往下拉,复制400次(我们此例中模拟400次),就得到了400个呈正态分布的随机工期值;然后建造和测试的随机工期值也是照葫芦画瓢,这样我们就得到了这3个要素的400次模拟的随机值,再每次的3个要素的随机值相加得到总工期的模拟值,如下图所示:

     

    此时前三步就做完了得到了总工期的一组数据(400个)。现在开始做第四步对这组数据做统计分析和作图。

    4.1 先把总工期这一列(图中E列)400个值拷贝一份,粘贴数值到另外一列(注意粘贴的时候选择“选择性粘贴”然后选“值”,因为随机数随时变动,这儿需要把值固定下来),用MAX和MIN函数计算出这一列400个值的最大值为76,和最小值为45,作为分组依据,然后在旁边 I 列依次升序排列42-78(前后多取几个数值图像更完整)这部分数值作为分组数据,如下图所示:

     

    4.2 然后计算每个分组数据在总工期这组数据中出现的概率,这儿需要用到函数FREQUENCY,计算概率的公式为:=FREQUENCY(H8:H407,I8:I40)/400,意思是统计每个分组数据在总工期这一组数据中出现的次数,再除以模拟总次数400就得到这个分组数据出现的概率。再计算一个累积概率值,累积概率值就是前面的所有单个概率值加起来的概率,比如算分组数据46的累积概率值就是把46以下的数值的概率值全部加起来,这样我们就得到关于分组数据在总工期这组数据中出现的概率和累积概率的数据,如下表格所示:

     

    4.3 通过对上面表格的数据,以分组数据为X轴,出现概率和累积概率的值为Y轴于是可以做出下面关于总工期的概率分布图:

     

    红色柱状图是整个项目估计刚好多少天完工的概率数据,比如图中60天对应的概率大约是11%,表示整个项目刚好60天完工的概率是11%;蓝线就是我们PMBOK上定量风险分析得到的那张S曲线图,也是我们最终蒙特卡洛模拟需要得到的最终的模拟输出:总工期的概率分布图。通过这个S曲线,我们可以预测整个项目在多少天内完工的概率。比如我们需要预测整个项目在56天完工的概率,通过S曲线了解到56天对应的累积概率是34%左右,也就是整个项目56天内完工的概率是34%,那么56天内不能完工的概率就是1-34%=66%,这就是风险。如果觉得风险太高无法接受,那么我们可以把工期适当规划长一些,比如60天,这样查询S曲线可以得到60天内整个项目完工的概率是70%,这样就只有剩下30%的不能按时完工的风险,项目在进度方面的风险就大大降低了。

    好了,至此关于蒙特卡洛模拟的基本概念和操作流程就说完了,希望能通过本文对大家学习和理解蒙特卡洛模拟有所助益,如有任何疑问、建议或指正,欢迎留言交流,谢谢阅读。

    推荐阅读作者更

     

    转载于:https://www.cnblogs.com/kelelipeng/p/10418082.html

    展开全文
  • echarts实现人物树形关系实例

    万次阅读 热门讨论 2017-11-14 21:14:56
    写这个栗子的时候主要因为是刚刚做一个项目,要用到人物关系,所以一直在找合适插件,最后选择echarts2.0的tree最合适这个关系了。哈哈,话不多少,现在就把效果献上吧。 ps:照片是网上下载的,莫要见外啊...
  • 高仿CSDN社区树形图

    千次阅读 多人点赞 2012-03-14 00:45:52
    最近做系统的时候需要用到这个树形结构,于是模仿CSDN的树形结构做了一个自己的树形结构,将实现过程记录如下,希望对读者有用。 工欲善其事必先利其器,要模仿一个经典的树形结构就应该参照人家是怎么实现的,...
  • layui源码详细分析树形菜单

    万次阅读 2017-08-10 19:28:10
    前言今天分析的是layui框架内置模块tree.js,该模块的功能是构建树形菜单,具体的形式(layui官网该模块的具体形式)如下: 自实现树形菜单使用html+css+js实现了树形菜单,具体的实现思路如下: html中定义包含树形...
  • Extjs树形结构

    千次阅读 2011-12-06 15:48:09
    下面简单分析一下Ext的组件结构. Ext的所有组件都是扩展于Ext.Component, 而后子类扩展和集成形成了一个单根的组件. Ext中使用组件的方式很不一样,可以看一个例子. js 代码 var formPanel = ...
  • 动态生成树形图目录

    千次阅读 2019-01-18 09:28:42
    我们平时看到的树形图都是固定的目录,而且大多数是利用JavaScript(简称JS)来实现的效果,了解JavaScript的人都不陌生,JavaScript是一种直译式脚本语言,是一种动态类型、基于原型的语言,内置支持类。...
  • 有一棵 n 个节点的上每个节点都有一个正整数权值。如果一个点被选择了,那么在上和它相邻的点都不能被选择。求选出的点的权值和最大是多少? 输入格式 第一行包含一个整数 n 。 接下来的一行包含 n 个正...
  • 树形图常用于对分类变量进行可视化分析树形图的面积代表了所对应类别的数量,常用于比较各类别在数量上的差异。 二、代码实现 数据来源于上市企业数据,通过绘制树形图,来比较不同行业的企业数量分布差异。 ...
  • 树形dp+树形结构总结

    万次阅读 多人点赞 2017-10-18 10:17:54
     最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的。 树形dp一般都是用子树更新父亲(即从下向上更新),那么首先应该考虑的是一个一个子树的更新父亲还是把所有...
  • 有向的最小树形图(朱刘算法)

    千次阅读 2018-08-07 07:49:47
    最小树形图的定义: 设G=(V,E)是一个有向,如果具有下述性质: (1)G中不包含有向环 (2)存在一个顶点vi,它不是任何弧的终点,而V的其他顶点都恰好是唯一的一条弧的终点,则称G是以vi为根的树形图。 最小树形图...
  • 利用canvas绘画二级树形结构

    千次阅读 2017-09-25 11:39:25
    上周需要做一个把页面左侧列表内容拖拽到右侧区域,并且绘制成关系的功能。看了设计,第一反应是用canvas绘制关系线。吭哧吭哧搞定这个功能后,发现用canvas绘图,有一个很严重的缺陷。那就是如果左侧关系特别多...
  • 对于最小树形图的理解

    千次阅读 2012-10-23 22:08:09
    最小树形图的算法步骤简化得说一下就是重复一下三个步骤,直到中没有环为止或者判定有孤立节点无法形成最小树形图: 1、删除自环,除根节点以外,每个点留最小入边;2、判断有没有环;3、如果有环,缩为一点。 ...
  • 20张树形结构、14道精选回溯题目,21篇回溯法精讲文章,由浅入深,一气呵成,这是全网最强回溯算法总结!
  • 磁盘空间占用分析工具_
  • 线性表、树形结构和图形结构的区别 线性表:数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继 树形结构:数据元素之间有明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即...
  • 树形结构表3种设计优劣分析与分享

    万次阅读 2019-07-11 11:58:13
    在开发中经常遇到树形结构的场景,本文将以部门表为例对比几种设计的优缺点; 问题 需求背景:根据部门检索人员,问题:选择一个顶级部门情况下,跨级展示当前部门以及子部门下的所有人员,表怎么设计更合理 ? ...
  • 红黑详细分析(图文详解),看了都说好

    万次阅读 多人点赞 2019-10-15 17:39:05
    文章目录红黑简介红黑的性质红黑操作旋转操作插入情况一情况二情况三情况四情况五插入总结删除情况一情况二情况三情况四情况五情况六删除总结总结 红黑简介 红黑是一种自平衡的二叉查找,是一种高效的...
  • 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40212367,本文出自:【张鸿洋的博客】1、概述大家在项目中或多或少...整体是一个树形结构;遇到这样的情况,大家可能回去百度,因为层次多嘛,可
  • mysql 树形结构表设计与优化

    千次阅读 2021-09-20 09:15:15
    在诸多的管理类,办公类等系统中,树形结构展示随处可见,以“部门”或"机构"来说,接触过的同学应该都知道,最终展示到页面的效果就是层级结构的那种,下随机列举了一个部门的树型结构展示 设计考虑因素 1、表...
  • mysql存储树形结构的数据

    万次阅读 2017-12-03 23:46:58
    分析树形数据 JSON格式的树形结构数据需要保存到mysql中。 树形图如下: 分析成文本如: 存到表中的结构为: 需求 一般树形结构的数据使用需求有两点: 显示整棵树的数据 select * from treeNodes 给...
  • 最全的R语言聚类树形图画法

    千次阅读 2018-11-25 11:45:33
    https://blog.csdn.net/flyfrommath/article/details/78865156 原文 http://rstudio-pubs-static.s3.amazonaws.com/1876_df0bf890dd54461f98719b461d987c3d.html
  • 上一节实现了决策树,但只是使用包含树结构信息的嵌套字典来实现,其表示...Python没有提供自带的绘制树工具,需要自己编写函数,结合Matplotlib库创建自己的树形图。第二部分,使用决策树预测患者佩戴隐形眼镜的类型。
  • elementUI中el-table树形结构一键折叠/展开 1.业务需求: vue项目,权限菜单管理中菜单table的树形结构,一般情况下如果使用的是elementUI那么可以使用里面el-table的树形结构,实际场景需要一键折叠/展开功能。 2...
  • /* http://hi.baidu.com/bin183/blog/item/45c37950ece4475f1138c273.html 最小树形图(有向的最小生成树)思想:对于有根的,首先求出每个点费用最小的前驱边,如果这些前驱边构成了回路, 那么缩点
  • bootstrap树形结构

    千次阅读 2019-08-13 16:45:28
    先看效果 dome下载地址:https://download.csdn.net/download/hexu_blog/11540065

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,990
精华内容 27,996
关键字:

如何制作树形分析图