PCB决策引擎:多维决策表转决策树
准备设计一个PCB使用的决策引擎,需要用到决策表,而单维决策表不能满足业务要求,
这里主要是为了实现:用户编辑的是决策表,实际底层存储的是树结构,树的的各个节点挂上业务决策逻辑.
这里将多维决策表转决策树构思整理如下:
一.决策表(多维表头结构UI编辑界面)
用户可编辑的规则界面,规则决策表交由用户配制,可实现任意多表头结构的决策表。
二.决策树(TreeNode 简易界面)
TreeNode 是从决策表中转换过来的,可以实现节点决策控制,后续转换TreeNodeVIew用户可以附加属性编辑
左表头 上表头


三.DB数据库存储结构
多表头结构:

交叉行列号存储值表:

四.决策表转决策树 C#程序实现代码:
/// <summary>
/// 采用TreeNode做为树根结点做为起始点递归实现
/// </summary>
/// <param name="TreeNode_"></param>
private void ExcelHeadToTreeNodes(TreeNode TreeNode_)
{
T_RuleTableRowColumnMultiExpression ModTableCell_ = (T_RuleTableRowColumnMultiExpression)TreeNode_.Tag;
if (ModTableCell_ == null)
return; int StartColumnIndex = ;
int EndColumnIndex = ;
int ColumnCount = ;
int StartRowIndex = ;
if (ModTableCell_.DimensionNum == ) //维度1 列
{
ColumnCount = ModTableCell_.EndColumnIndex - ModTableCell_.StartColumnIndex + ;
if (ColumnCount == ) return;
StartColumnIndex = ModTableCell_.StartColumnIndex;
EndColumnIndex = ModTableCell_.EndColumnIndex;
StartRowIndex = ModTableCell_.StartRowIndex + ;
}
else if (ModTableCell_.DimensionNum == )//维度1 行
{
ColumnCount = ModTableCell_.EndRowIndex - ModTableCell_.StartRowIndex + ;
if (ColumnCount == ) return;
StartColumnIndex = ModTableCell_.StartRowIndex;
EndColumnIndex = ModTableCell_.EndRowIndex;
StartRowIndex = ModTableCell_.StartColumnIndex + ;
}
else
{
return;
}
int LayerIndexCurrent = ModTableCell_.LayerIndex + ;
int i = ; //层次
while (StartColumnIndex <= EndColumnIndex)
{
Excel.Range cell;
int StartRowIndex_ = , StartColumnIndex_ = , EndRowIndex_ = , EndColumnIndex_ = , ColumnCount_ = ;
string CellStringID_ = "", CellVal_ = "";
if (ModTableCell_.DimensionNum == ) //维度1 列头
{
cell = ((Excel.Range)_WorkSheet.Cells[StartRowIndex, StartColumnIndex]);
var CellMergeArea = cell.MergeArea;
var CellRowsCount = CellMergeArea.Rows.Count;
var CellColumnsCount = CellMergeArea.Columns.Count;
CellVal_ = cell.Text.ToString();
StartRowIndex_ = ModTableCell_.EndRowIndex + ;
StartColumnIndex_ = StartColumnIndex;
EndRowIndex_ = StartRowIndex_ + (CellRowsCount - );
EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - );
ColumnCount_ = CellColumnsCount;
CellStringID_ = Convert.ToChar(StartColumnIndex_ + ).ToString() + ((StartColumnIndex_ == EndColumnIndex_) ? "" : "_" + Convert.ToChar(EndColumnIndex_ + ).ToString()); }
else if (ModTableCell_.DimensionNum == ) //维度2 行头
{
cell = ((Excel.Range)_WorkSheet.Cells[StartColumnIndex, StartRowIndex]);
var CellMergeArea = cell.MergeArea;
var CellRowsCount = CellMergeArea.Rows.Count;
var CellColumnsCount = CellMergeArea.Columns.Count;
CellVal_ = cell.Text.ToString();
StartRowIndex_ = StartColumnIndex;
StartColumnIndex_ = ModTableCell_.EndColumnIndex + ;
EndRowIndex_ = StartRowIndex_ + (CellRowsCount - );
EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - );
ColumnCount_ = CellRowsCount;
CellStringID_ = StartRowIndex_.ToString() + ((StartRowIndex_ == EndRowIndex_) ? "" : "_" + EndRowIndex_.ToString());
} T_RuleTableRowColumnMultiExpression ModTableCell_new = new T_RuleTableRowColumnMultiExpression();
ModTableCell_new.LayerIndex = LayerIndexCurrent;
ModTableCell_new.StartRowIndex = StartRowIndex_;
ModTableCell_new.StartColumnIndex = StartColumnIndex_;
ModTableCell_new.EndRowIndex = EndRowIndex_;
ModTableCell_new.EndColumnIndex = EndColumnIndex_;
ModTableCell_new.LayerOrder = i;
ModTableCell_new.CellStringID = CellStringID_;
ModTableCell_new.ParentCellStringID = ModTableCell_.CellStringID;
ModTableCell_new.DimensionNum = ModTableCell_.DimensionNum;
ModTableCell_new.TableNo = ModTableCell_.TableNo;
ModTableCell_new.Text = CellVal_;
ModTableCell_new.Value = CellVal_;
ModTableCell_new.Remark = CellVal_;
ModTableCell_new.Expression = CellVal_;
ModTableCell_new.DisplayName = CellVal_ + "________" + ModTableCell_new.CellStringID;
ModTableCell_new.AllOrder = ModTableCell_.AllOrder + ;
TreeNode TreeNodeNew_ = new TreeNode(ModTableCell_new.DisplayName);
TreeNodeNew_.Tag = ModTableCell_new;
TreeNode_.Nodes.Add(TreeNodeNew_); ExcelHeadToTreeNodes(TreeNodeNew_); StartColumnIndex = StartColumnIndex + (ColumnCount_ - ) + ; i++;
} }
/// <summary>
/// 多维二维表结构
/// </summary>
public class T_RuleTableRowColumnMultiExpression
{
/// <summary>
/// 规则表名ID
/// </summary>
public int TableNo { get; set; }
/// <summary>
/// 维度
/// </summary>
public int DimensionNum { get; set; }
/// <summary>
/// 层次深度
/// </summary>
public int LayerIndex { get; set; }
/// <summary>
/// 层次排序号
/// </summary>
public int LayerOrder { get; set; }
/// <summary>
/// 节点单元格值ID
/// </summary>
public string CellStringID { get; set; }
/// <summary>
/// 父节点单元格值ID
/// </summary>
public string ParentCellStringID { get; set; }
/// <summary>
/// 节点:显示名
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 节点:表达式
/// </summary>
public string Expression { get; set; }
/// <summary>
/// 节点:文本内容
/// </summary>
public string Text { get; set; }
/// <summary>
/// 节点:值
/// </summary>
public string Value { get; set; }
/// <summary>
/// 节点:备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 开始行号
/// </summary>
public int StartRowIndex { get; set; }
/// <summary>
/// 开始列号
/// </summary>
public int StartColumnIndex { get; set; }
/// <summary>
/// 终止行号
/// </summary>
public int EndRowIndex { get; set; }
/// <summary>
/// 终止列号
/// </summary>
public int EndColumnIndex { get; set; }
/// <summary>
/// 总排序
/// </summary>
public int AllOrder { get; set; }
}
PCB决策引擎:多维决策表转决策树的更多相关文章
- PCB 围绕CAM自动化,打造PCB规则引擎
AutoCAM自动化平台,前端管理订单,而后端执行任务,前端UIl界面有板厚,铜厚,板材,表面处理,层数等信息,而这些信息并不是后端最终所需要的信息后.拿钻孔补偿来说,后端需要的是钻孔补偿值,但前端并 ...
- PCB 规则引擎之脚本语言JavaScript应用评测
世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...
- PCB 规则引擎之JSON对象查看器
在PCB规则引擎开发中,JavaScript V8引擎是处理业务逻辑的, 当然业务逻辑需要数据支撑才行, 即需有将数据推进入到V8引擎.目前这边数据传输到JavaScript V8引擎以C# Mod ...
- StartDT AI Lab | 视觉智能引擎+数据决策引擎——打造商业“智能沙盘”
众所周知,线上商家可以通过淘宝平台的大量前端“埋点”轻松获取商品的加购率.收藏率.转化率.成交额等大量基础信息,甚至商家能够在更精细的层面,获取商品关键字变化或者上新/爆款带来的流量变化数据,更甚者商 ...
- 通俗地说决策树算法(三)sklearn决策树实战
前情提要 通俗地说决策树算法(一)基础概念介绍 通俗地说决策树算法(二)实例解析 上面两篇介绍了那么多决策树的知识,现在也是时候来实践一下了.Python有一个著名的机器学习框架,叫sklearn.我 ...
- PCB 规则引擎之编辑器(语法着色,错误提示,代码格式化)
对于一个规则引擎中的脚本代码编辑器是非常关键的,因为UI控件直接使用对象是规则维护者,关系到用户体验,在选用脚本编辑器的功能时除了满足代码的编辑的基本编辑要求外,功能还需要包含;语法着色,错误提示,代 ...
- PCB Genesis加二维码 实现方式
使用incam可以很轻松的增加2维码,这里通过另外一种方式玩转二维码的加法, 使用谷歌zxing.dll类库实现,将文字信息转为bitmap点阵后,在Genesis绘制点即可. 一.incam增加二维 ...
- .Net规则引擎Biztalk,Workflow和CKRule的比较
微软的规则引擎 很多朋友会问,.Net平台有没有规则引擎?像Java就有很多的规则引擎,Drools,ILog都做得非常好,但.Net好像还没有哦.很多知道规则引擎,但不知道.Net的朋友都烦这个 ...
- 决策树(decision tree)
决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...
随机推荐
- GCD & Operation queues & Thread
One of the technologies for starting tasks asynchronously is Grand Central Dispatch (GCD). This tech ...
- 在把table表格中的数据导出到Excel的时候,以科学计数法显示位数多的数字时怎么解决?
sbHtml.AppendFormat("<td> {0}</td>", data[i].IDcard.ToString()); sbHtml.Append ...
- Shell基本运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. 例如,两个数相加(注意使用 ...
- Linux 之CentOS7使用firewalld打开关闭防火墙与端口
一.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...
- element ui 日期控件范围时间限制记录、以及计算两个日期之间的天数
日期的筛选经常会有最小的日期选择,例如:当前日期 :clearable="false" :picker-options="pickerOptions0" val ...
- php银联支付
简介 PHP银联支付 流程 1.注册 银联 - 技术开发平台和商户服务平台 https://open.unionpay.com 注意:注册时建议使用IE浏览器,之前注册时插件老是用不了,使用IE10以 ...
- Windows下Unity安装
安装教程: https://www.paws3d.com/lesson/us-0101/ 问题1: 安装并完成注册后,在网页上能登录,但打开Unity时不能启动成功,一直停留在如下界面 解决方案:断网 ...
- tomcat8安装及配置
首先是解压版的安装.很简单,直接解压到要安装的位置就OK了. 2.启动 bin目录下,执行startup.bat文件 3.浏览器中打开地址http://localhost:8080/
- uva-156(Ananagrams UVA - 156)
map容器的模板题,判断是否能交换字母顺序变成另外一个单词,只需要先把单词都变成小写字母.然后再按字母字典序排序,放入map中进行计数,然后把计数为一的再放入另一个容器,再排序输出即可 我的代码(刘汝 ...
- python爬虫18 | 就算你被封了也能继续爬,使用IP代理池伪装你的IP地址,让IP飘一会
我们上次说了伪装头部 ↓ python爬虫17 | 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部 让自己的 python 爬虫假装是浏览器 小帅b主要是想让你知道 在爬取网站的时候 ...