`
zengshaotao
  • 浏览: 792476 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

树形节点设权重,叶子节点设权重

 
阅读更多

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html lang="en">

<head>

<base href="<%=basePath%>">

    <title></title>

    

    <meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

 

    <!-- 组织机构树插件的引入文件 -->

    <link rel="stylesheet" href="<%=request.getContextPath()%>/jsp/jorgchart/css/jquery.jOrgChart.css"/>

    <link rel="stylesheet" href="<%=request.getContextPath()%>/jsp/jorgchart/css/custom.css"/>

    <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-easyui-1.2.6/jquery-1.7.2.min.js"></script>

    <script type="text/javascript" src="<%=request.getContextPath()%>/jsp/jorgchart/jquery.jOrgChart.js"></script>

 

<!-- jquery easy ui 需要的引入文件 -->

<!-- <link rel="stylesheet" type="text/css" href="css/common.css" /> -->

<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/default/easyui.css" />

<link rel="stylesheet" type="text/css" href="js/jquery-easyui-1.2.6/themes/icon.css" />

<script type="text/javascript" src="js/jquery-easyui-1.2.6/jquery.easyui.min.js"></script>

<script type="text/javascript" src="js/jquery-easyui-1.2.6/locale/easyui-lang-zh_CN.js"></script>

 

    <script type="text/javascript">

 

var nodeInfoContainer= [];//存储所有评分组所有的节点

 

//存储规则的分配权重,要注意不同的叶子评分组设置规则的问题

//第一位存储的是叶子评分组的id和实际权重,之后存储的是规则的权重和分配权重信息

var ruleWeightArr= [];

 

    $(document).ready(function () {

queryCardTree();

$('#searchbtn').click(function(){

            checkGroupWeight();

});

        });

        

        function clickLeafNode(nodeId){

        var obj = event.srcElement;

        //第一次点击某个叶子评分组

        if(ruleWeightArr.length==0){

        ruleWeightArr[0] = nodeId+"@"+obj.id;

        }else{

        if(ruleWeightArr[0].split("@")[0]==nodeId){

        //多次点击了同一个叶子评分组,准备重新设置该节点下的规则权重

        }else{

        //设置不同的叶子评分组下的规则权重,这个时候要清除之前保存的其他评分组的规则的分配权重信息

        ruleWeightArr = [];

        ruleWeightArr[0] = nodeId+"@"+obj.id;

        }

        }

       

        $("#estimate_group_map_id").dialog("open").dialog("setTitle",obj.title);

        //加载数据

    $('#ruleWeight').datagrid({

                width: 'auto',  

                height: "380",//auto的话表格高度会随着数据的变化而变化               

                striped: true,  

                singleSelect : true,  

                url:'<%=request.getContextPath()%>/EstimateGroupManage.do?method=searchRuleWeightByGroupId&nodeId='+nodeId ,

                //queryParams:{},  

                loadMsg:'数据加载中请稍后……',  

                pagination: true,  

                rownumbers: true,     

                columns:[[

                    {field:'GROUP_ID',title: '评分组ID',align: 'center',width: 80,hidden:true},

                    {field:'FOLDER_NAME',title: '评分组名称',align: 'center',width: 140,hidden:true},  

                    {field:'CHECK_ID',title: '规则ID',align: 'center',width: 80},

                    {field:'SYS_ID',title: 'schema',align: 'center',width: 80},  

                    {field:'TABLE_NAME',title: '表名',align: 'center',width: 120},

                    {field:'CHECK_COLUMN_NAME',title: '字段名',align: 'center',width: 80},

                    {field:'WEIGHT',title: '实际权重',align: 'center',width: 50},

                    {field:'DIS_WEIGHT',title: '分配权重',align: 'center',width: 50,formatter:function(value , record , index){

var str = "<input type='text' id='"+record.CHECK_ID+"' value='"+value+"' onblur='modifyDisWeight(this)' />";

return str;

}},  

                    {field:'START_DT',title: '创建日期',align: 'center',width:200,formatter:function(value , record , index){

var str = value.substring(0,19);

return str;

}}, 

                    {field:'CREATE_OPER',title: '创建人',align: 'center',width: 100}                                                          

                ]],

                pagination: true , 

pageSize: 100 ,

                pageList:[100,150,200,500]

            }); 

        }

        //权重最终分配之后进行归一化的校验

        function checkGroupWeight(){

       

        //单独加入评分卡这一根节点信息

        for(var i = 0;i<nodeInfoContainer.length;i++){

        var nodeStr = nodeInfoContainer[i];

        var nodeArr = nodeStr.split("@");

        var parId = nodeArr[2];

        if(parId=="-1"){

        //评分卡这一根节点信息的权重默认是1

        nodeArr = nodeArr.join("@")+"@"+1;

        nodeInfoContainer[i] = nodeArr;

        break;

        }

        }

       

        var nodeStr = "";

        //id@name@parId@isleaf@weight

        //对每一个设置过权重的节点进行归一化校验

        for(var i = 0;i<nodeInfoContainer.length;i++){

        nodeStr = nodeInfoContainer[i];

        var nodeArr = nodeStr.split("@");

        var leaf = nodeArr[3];

        //对每一个节点,只要检查自身下级节点的权重是否归一就行

        var nodeId = nodeArr[0];

        if(leaf=="1"){

        //叶子节点不做检查

        continue;

        }else{

        var parId="";

        var nodeChild=[];

        //找出每一个非叶子节点的子节点

        for(var k = 0;k<nodeInfoContainer.length;k++){

        parId = nodeInfoContainer[k].split("@")[2];

        if(parId==nodeId){

        nodeChild.push(nodeInfoContainer[k]);

        }

       }

var weightCheck = 0;

var childWeight=0;

 

//还有未设置子节点权重的节点

if(nodeChild.length==0){

alert("还有未设置子节点权重的节点!");

return;

}else{

for(var k = 0;k<nodeChild.length;k++){

       childWeight = nodeChild[k].split("@")[4];

       weightCheck = parseFloat(weightCheck) + parseFloat(childWeight);

       }

       //容易出现0.9999999999这样的计数问题

       weightCheck = parseFloat(weightCheck.toFixed(4));

       if(weightCheck !=1.0000){

       alert("【"+nodeArr[1]+"】节点下的所有子节点的权重之和应该为1,目前是:"+weightCheck);

       return;

       }

}

        }//non leaf node

        }// for every set weight

       

        var rootNode = getRootNode();

        //从根节点开始,自顶向下递归计算每一个节点的实际权重

        calChildOfCurrNode(rootNode);

        //alert(nodeInfoContainerWeight);

        //将最新的权重分配信息更新到数据库

        updateGroupWeight(nodeInfoContainer);

        }

        

        function updateGroupWeight(nodeInfoContainerWeight){

           //这里传入json参数格式为{issueNoParams:issueNos.join(",")},issuesNos是数组,一定要拼接成字符串

           $.post('<%=request.getContextPath()%>/EstimateGroupManage.do?method=updateWeight',{estimateGroupWeight:nodeInfoContainerWeight.join(",")},

           function(result){

           $.messager.alert("提示",result.resultInfo,"icon-ok");

               },'json');

        }

        

        function getRootNode(){

        var rootNode;

        for(var k = 0;k<nodeInfoContainer.length;k++){

    parId = nodeInfoContainer[k].split("@")[2];

    if(parId=="-1"){

    nodeInfoContainer[k] = nodeInfoContainer[k]+"@"+1;

    rootNode = nodeInfoContainer[k];

    break;

    }

       }

       return rootNode;

        }

        

        //id@name@parId@isleaf@dis_weight@actureWeight

        function calChildOfCurrNode(currObj){

       

        var parId = "";

        var leaf = "";

        var childWeight;

        var currNodeId = currObj.split("@")[0];

        var currNodeWeight = currObj.split("@")[5];//当前节点的实际权重

        for(var k = 0;k<nodeInfoContainer.length;k++){

        var currNodeChild = nodeInfoContainer[k];

        var nodeInfoArr = currNodeChild.split("@");

    parId = nodeInfoArr[2];

    leaf = nodeInfoArr[3];

    childWeight = nodeInfoArr[4];//当前节点的孩子节点的分配权重

    if(parId==currNodeId){

    if(leaf=="0"){

    //非叶子节点开始计算

    var newWeight = (parseFloat(currNodeWeight)*parseFloat(childWeight)).toFixed(4);

    nodeInfoArr[5] = newWeight;

    nodeInfoContainer[k] = nodeInfoArr.join("@");

    //需要将最新的节点信息进行传递

    calChildOfCurrNode(nodeInfoContainer[k]);

    }else if(leaf=="1"){

    var newWeight = (parseFloat(currNodeWeight)*parseFloat(childWeight)).toFixed(4);

    nodeInfoArr[5] = newWeight;

    nodeInfoContainer[k] = nodeInfoArr.join("@");

    }

    }

       }//for block

       

       //alert(nodeInfoContainer);

        }

        //每个节点的blur事件

        function setNodeWeight(obj){

        var nodeStr;

        //id@name@parId@isleaf@weight@actureWeight

for(var i = 0;i<nodeInfoContainer.length;i++){

//先拿到还未设置权重的节点信息

        nodeStr = nodeInfoContainer[i];

        var nodeArr = nodeStr.split("@");

        var nodeId = nodeArr[0];

        //更新刚刚设置过的节点权重

        if(obj.id==nodeId){

        //设置了权重之后的节点信息:分配权重

        nodeArr[4] = obj.value;

        nodeInfoContainer[i] = nodeArr.join("@");

        break;

        }else{

        continue;

        }

        }//for every node

 

        }

        function queryCardTree(){

       

        $("#estimateGroupEditForm").form('submit',{

       url: '<%=request.getContextPath()%>/EstimateGroupManage.do?method=weightSetTree',

       onSubmit: function(param){

       //除了表单的元素,再提交自定义的参数

           return true;

       },

       success: function(result){

       var result = eval('('+result+')');

       

         //这里直接定义,那么每次加载时都会创建

         var html = $("#org").html();//得到ul里面的html代码

         if(html !=null){

         $("#org").html("");//这里对org里面的标签内容进行了清空

         var showlist = $("#org");

         showall(result, showlist);

          $("#bodyId").append(showlist);

         $("div.jOrgChart").html("");//清除了里面的内容,但是div对象本身还是存在,会占用默认的页面空间

         $("div.jOrgChart").remove();//真正清除页面上生成的div

         //每次都会生成div

                   $("#org").jOrgChart();

         }else{

         //第一次查询,需要生成一定的数据结构对象

         var showlist = $("<ul id='org' style='display:none'></ul>");

                   showall(result, showlist);

                   //将生成好的固定格式的ul拼接到body,ul必须要依赖容器才能存在

                   $("#bodyId").append(showlist);

                   $("#org").jOrgChart();

         }

       }

   });

        }

        

         //menu_list为json数据

        //parent为要组合成html的容器

        function showall(menu_list, parent) {

            for (var menu in menu_list) {

            //已经将所有的节点信息都保存起来了

            nodeInfoContainer.push(menu_list[menu].id+"@"+menu_list[menu].name+

            "@"+menu_list[menu].parId+"@"+menu_list[menu].isLeaf

            +"@"+menu_list[menu].disWeight+"@"+menu_list[menu].weight);

                if (menu_list[menu].children.length > 0) {

                //有子节点

                var li = $("<li></li>");

                if(menu_list[menu].parId=="-1"){

                //评分卡的权重是1,并且不可输入

                    $(li).append(" <a  href='javascript:void(0)' style='width:50px;text-decoration:none' >" 

                   + menu_list[menu].name

                   +"<br>权重:<input type='text' value='1' readonly style='text-align:center;width:50px;border:0px' /></a>")

                    .append("<ul></ul>")

                    .appendTo(parent);

                }else{

                //将li的文本设置好,并马上添加一个空白的ul子节点,并且将这个li添加到父亲节点中

                    $(li).append(" <a  href='javascript:void(0)' style='width:50px;text-decoration:none' >" 

                   + "<font size='2' color='black'>"+ menu_list[menu].name+"</font>"

                   +"<br><font size='0.6'>分配权重</font>:<input type='text' value='"+menu_list[menu].disWeight+"' id='"+menu_list[menu].id+"' onblur='setNodeWeight(this)' style='width:50px'/>"

                   +"<font size='0.6'>实际权重</font>:<input type='text' value='"+menu_list[menu].weight+"' style='width:50px;border:0px'/></a>")

                    .append("<ul></ul>")

                    .appendTo(parent);

                }

                    //将空白的ul作为下一个递归遍历的父亲节点传入

                    showall(menu_list[menu].children, $(li).children().eq(1));

                }else {

                //如果该节点没有子节点,则直接将该节点li以及文本创建好直接添加到父亲节点中

                    $("<li></li>")

                    .append(" <a href='javascript:void(0)' id='"+menu_list[menu].weight+"' title='"+menu_list[menu].name+"' onclick='clickLeafNode("+ menu_list[menu].id+ ")' style='width:50px;text-decoration:none'>" 

                    + "<font size='2' id='"+menu_list[menu].weight+"' color='black'>"+ menu_list[menu].name+"</font>"

                    +"<br><font size='0.6'>分配权重</font>:<input type='text' onclick='stopPop()' value='"+menu_list[menu].disWeight+"' id='"+menu_list[menu].id+"' style='width:50px' onblur='setNodeWeight(this)'/>"

                    +"<font size='0.6'>实际权重</font>:<input type='text' onclick='stopPop()' value='"+menu_list[menu].weight+"' style='width:50px;border:0px'/></a>")

                    .appendTo(parent);

                }

            }

        }

        

        //阻止事件的冒泡,防止点击输入框时执行了a里的onclick方法

        function stopPop(){

        //IE阻止事件冒泡的机制

        window.event.cancelBubble = true; 

        //event.stopPropagation();

        }

        //点击 权重确认时进行归一化校验

       function ruleWeightCheck(){

       var weight=0;

       for(var k = 1;k<ruleWeightArr.length;k++){

       weight = parseFloat(weight) + parseFloat(ruleWeightArr[k].split("@")[1]);

   }

   weight = parseFloat(weight.toFixed(4));

   if(weight >1){

   $.messager.alert("提示","规则的分配权重之和不能超过1!","icon-ok");

   return ;

   }

   //校验通过后,前端计算规则的实际权重

   calRuleWeight();

   updateRuleWeight();

       }

       

       function calRuleWeight(){

       

       var groupWeight = ruleWeightArr[0].split("@")[1];

       //ruleWeightArr只存储了设置过的规则权重,而不是全部的

       var tmp;

       for(var k = 1;k<ruleWeightArr.length;k++){

       tmp = parseFloat(ruleWeightArr[k].split("@")[1])*parseFloat(groupWeight);

       tmp = parseFloat(tmp.toFixed(4));

       ruleWeightArr[k] = ruleWeightArr[k]+"@"+tmp;

   }

   //alert(ruleWeightArr);

       }

       

       //校验通过后更新规则的权重和分配权重数据

       function updateRuleWeight(){

       $.post('<%=request.getContextPath()%>/EstimateGroupManage.do?method=updateRuleWeight',{ruleWeight:ruleWeightArr.join(",")},

           function(result){

           $.messager.alert("提示",result.resultInfo,"icon-ok");

           $("#ruleWeight").datagrid('reload');

           ruleWeightArr = [];//更新了权重之后需要置空已经修改过的规则权重

               },'json');

       }

       

       //前端修改和存储规则的分配权重

       function modifyDisWeight(obj){

       

       var nodeArr = obj.id+"@"+obj.value;

       var exist = false;

     var index;

     //需要遍历所有的节点,才知道当前校验的节点是否已经设置过权重

     //id@disweight

     //数据第一位存储的是评分组的id,所以要从第二位开始校验

     for(var k = 1;k<ruleWeightArr.length;k++){

     if(ruleWeightArr[k].split("@")[0]==obj.id){

exist = true;

index = k;

   }

   }

if(exist){

//已经设置过节点的权重信息,这里就要覆盖,而不是重新添加

ruleWeightArr[index] = nodeArr;

}else{

ruleWeightArr.push(nodeArr);

}

       //alert(ruleWeightArr);

       }

    </script>

  </head>

 

<body id="bodyId">

 

<div id="estimate_group_map_id" class="easyui-dialog" closed="true"

   style="width:700px;height:450px;" buttons="#ruleWeight_buttons">

<div class="ftitle"><!-- title信息,根据增加和修改按钮动态变化 --></div>

<table id="ruleWeight"></table> 

</div>

  <div id="ruleWeight_buttons" style="text-align:center">

        <a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-ok" onclick="ruleWeightCheck()" style="">权重确认</a>

    </div>

   

<form id="estimateGroupEditForm" method="post">

 

<input name="check_date" type="hidden" id="check_date" value="" style="width:120px" />

   <a id="searchbtn" class="easyui-linkbutton" style="margin-left:20px">权重确认</a>

   

</form>

       

 

</body>

</html>

分享到:
评论

相关推荐

    多重链接微博网络节点权重计算方法

    本文提出的“多重链接微博网络节点权重计算方法”是针对这一需求的一种解决方案。该方法考虑了微博网络的特殊性,即用户间的互动不仅限于单向关注,还可能包括转发、评论等多种形式的连接,这些被称为多重链接。通过...

    寻找树中两叶子节点之间的最长路径

    在二叉树问题中,寻找两个叶子节点之间的最长路径是一个典型的图论问题,可以转换为在树中找到具有最大权重的路径。这个问题的关键在于非递归的解决方案,它通常涉及广度优先搜索(BFS)或深度优先搜索(DFS)算法。...

    新概念智能树形菜单--利用加权多叉树结合

    通过JavaScript,我们可以轻松地实现树形菜单的交互效果,如节点的展开、折叠、动态加载以及根据权重动态排序等。JavaScript库和框架,如jQuery、React、Vue等,提供了丰富的工具和方法,简化了树形菜单的开发工作。...

    高斯正交节点和权重。:使用 chebfun 系统计算高斯正交节点和权重-matlab开发

    本主题将深入探讨如何利用 Chebfun 系统来计算高斯-Legendre 正交节点和权重,这对于数值积分、插值以及求解偏微分方程等应用至关重要。 高斯-Legendre 正交节点和权重是数值分析中的基本概念,它们在多项式插值和...

    哈夫曼树的建立和查找节点

    它通过构造一个带权重的二叉树,使得从根节点到每个叶子节点的路径上的权值之和(路径长度)达到最小,从而实现高效的数据存储和传输。 建立哈夫曼树的过程通常分为以下几个步骤: 1. **创建哈夫曼节点**:首先,...

    Legende-Gauss-Radau 节点和权重:计算 Legendre-Gauss-Radau 节点和权重。-matlab开发

    此脚本计算 Legendre-Gauss-Radau 正交的节点和权重以及光谱搭配方法的 LGR-vandermonde 矩阵。 节点是 P_N(x)+P_{N+1}(x) 的零点,其中包括 x=-1 处的固定横坐标。 另请参阅我使用 Legendre 多项式的 Gauss 和 ...

    python networkx 根据图的权重画图实现

    接着根据边的权重大小将其分成两组,再利用 `spring_layout()` 方法计算节点的位置。最后通过 `draw_networkx_nodes()` 和 `draw_networkx_edges()` 方法绘制节点和边,并通过 `draw_networkx_labels()` 添加节点...

    2021 最新 NOIP 学习课件:树形dp

    而“点权”可能是指树上每个节点赋予一定权重,树形DP需要根据这些权重来求解问题。 此外,“能选则选V”可能指的是在树形DP中对于某些选择题目的决策过程,需要根据某种原则来确定是否选择一个节点;“D66”可能是...

    哈夫曼树 霍夫曼编码

    2. **合并节点**:在所有节点中选择两个权重最小的节点,将它们合并为一个新节点,并且新节点的权重为其两个子节点权重之和。 3. **重复步骤2**:直到所有节点合并成一个根节点,此时形成的树即为哈夫曼树。 #### ...

    Gaussian Quadrature for Triangles:计算三角形的高斯节点和权重-matlab开发

    高斯积分的核心思想是找到一组特定的节点(Gauss points)和相应的权重(weights),使得对于所有在节点处连续的二次多项式,积分的近似值与真实值相等。在三角形上进行高斯积分时,我们需要找到这些特定的节点位置...

    Legende-Gauss-Lobatto 节点和权重:计算 Legendre-Gauss-Lobatto 权重、节点和范德蒙德矩阵。-matlab开发

    此脚本计算 Legendre-Gauss-Lobatto 正交的节点和权重,以及光谱方法的 LGL-vandermonde 矩阵。 节点是 (1-x^2)*P_N(x) 的零点,其中包括端点。 对于纯高斯正交,Chebyshev 在数值上更好,并且 Lebesgue 常数低于 ...

    【MATLAB三点定位函数,带气压高度校正和权重】输入待定位节点与各个锚节点的距离、锚节点位置、权重(可选),输出待测点位置

    % 输入待定位节点与各个锚节点的距离、锚节点位置、权重(可选),输出待测点位置 % Ver2:输入添加气压高度值用于校正距离 % Evand/2024年3月19日 % airghight 由气压高度计算的锚节点-待测节点的相对高度,按行...

    HuffMan【二叉树、树和哈夫曼树及其应用】

    3. **合并节点**:每次从堆中取出两个最小的节点,创建一个新的内部节点,该节点的权重为两个子节点权重之和,然后将新节点插入到堆中。 4. **重复步骤3**:直到堆中只剩下一个节点,这个节点就是哈夫曼树的根节点。...

    设置信号放大器 一、树的存储结构 struct node 定义树的节点 { int.doc

    算法的核心是将实际问题转化为树形网络,其中边的权重表示衰减量。这里采用后序遍历(Post-Order Traversal)策略,因为我们需要先处理子节点再处理父节点。遍历过程中,对于每个节点,我们检查其左右子节点是否需要...

    Fast Gauss-Legendre Quadrature Rules:计算高斯-勒格德勒正交节点和权重-开源

    Bogaert的“高斯-勒格德式正交节点和权重的无迭代计算”中开发的公式计算高斯-勒格德式正交节点和权重,该公式发表在SIAM科学计算杂志上(永久链接:http:// dx (doi.org/10.1137/140954969)。 关键特征是:-...

    树形动态规划_朱全民.ppt

    它通常涉及到树的遍历、节点的权重以及通过一系列决策达到最优解的过程。在朱全民的讲座中,他介绍了两个典型的树形动态规划问题:加分二叉树和选课问题。 1. 加分二叉树: 这个问题的目标是构建一个中序遍历为1,2,...

    论文研究-基于加权方法的节点重要性度量.pdf

    对于一个无权网络,先考虑网络全局信息,计算出每个节点的特征中心向量值,将边两端节点值的和作为边的权重,从而构成一个加权网络;然后根据加权网络的局部信息求出加权网络的度。基于SIR模型的四个实证网络,实验...

    哈夫曼树程序设计问题

    哈夫曼树的构建过程是从叶子节点开始,逐渐构建树形结构,直到根节点。 哈夫曼树的节点结构体中包括三个成员变量:weight、parent、lchild和rchild。其中,weight表示节点的权重,parent表示节点的父节点,lchild和...

    算法进阶02.zip 树形dp问题

    例如,在解决树的最短路径问题时,我们可以定义节点的状态为该节点到根节点的最短距离,然后设计一个转移方程,将子节点的最短距离加起来,加上从当前节点到子节点的边的权重,得到当前节点的最短距离。在实际编程...

Global site tag (gtag.js) - Google Analytics