精华内容
参与话题
问答
  • 竞速比赛规则   第十五届竞赛规则导读 参加过往届比赛的队员可以通过下面内容了解第十五届规则主要变化。如果第一次参加比赛,则建议对于本文进行全文阅读。 竞速比赛共分为为五个组别。详细情况参加文档第一...

    竞速比赛规则

    竞速比赛规则

    这是竞赛规则讨论稿,正式规则将会在竞赛网站公布:

    smartcar.cdstm.cn/index

     

    第十五届竞赛规则导读

    参加过往届比赛的队员可以通过下面内容了解第十五届规则主要变化。如果第一次参加比赛,则建议对于本文进行全文阅读。

    • 竞速比赛共分为为四个组别。详细情况参加文档第一节中的介绍,比赛组别是按照比赛任务来进行划分。在今年比赛中,由于引入更多的单片机赞助商,因此不同组别中的单片机使用有着比较大的区别。
    • 鉴于今年疫情对于参赛队伍准备比赛时间耽搁,以及由于改动控制单片机带来的挑战,所以在今年的比赛赛道元素中对于往届的比赛赛道进行了简化。
    • 在每个组别内允许所使用的单片机中,只要符合种类规定,单片机的数量不限。
    • 车模所使用的电池可以是原车模厂商配套的镍镉动力电池(7.2V,2AH),也可以是端口电压在12.6 V以内的锂电池。
    • 第十五届的信标的 引导方式是通过声音和射频信号来引导,这一点与之前比赛中的信标有很大区别。相关信标规格和修改方案参见附录。
    • AI电磁组比赛对于车模尺寸有着严格限制,这与普通的电磁基础组别有很大的区别。
    • 比赛规则中所涉及到的文档将会在3月份陆续发布。
    • 比赛正式文档发布官方网站为:smartcar.cdstm.cn/index

     

    一、前言

    智能车竞赛是从2006开始,由教育部高等教育司委托高等学校自动化类教学指导委员会举办的旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛,至今已经成功举办了十四届。在继承和总结前十四届比赛实践的基础上,竞赛组委会努力拓展新的竞赛内涵,设计新的竞赛内容,创造新的比赛模式,使得围绕该比赛所产生的竞赛生态环境得到进一步的发展。

    为了实现竞赛的"立足培养、重在参与、鼓励探索、追求卓越"的指导思想,竞赛内容设置需要能够面向大学本科阶段的学生和教学内容,同时又能够兼顾当今时代科技发展的新趋势。比赛形式包括有竞速比赛与创意比赛两大类。竞速比赛中包含不同的组别,难度适合本科不同阶段学生参赛。在竞速赛基础上,适当增加挑战性,形成创意比赛的内容,适合部分有条件、能力强的本科生和研究生参加创意比赛。

    参赛选手须使用竞赛秘书处统一指定的竞赛车模套件,不同组别会指定所使用的单片机种类,自主构思控制方案进行系统设计,包括传感器信号采集处理、电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试。

    竞赛分为分赛区比赛和全国总决赛两个阶段。参赛队伍的名次(成绩)由赛车现场成功完成赛道比赛时间来决定。参加全国总决赛的队伍同时必须提交车模技术报告。

    竞赛秘书处制定如下比赛规则适用于各分/省赛区比赛以及全国总决赛,在实际可操作性基础上,实现竞赛的公开、公平与公正。

    为了兼顾现在比赛规模的要求,同时避免同组别内出现克隆车的情况,能够便于参赛学校在有限的场地内使用兼容的赛道完成比赛准备,竞速比赛将按四个组别进行设置,具体包括有:

    • 基础四轮组
    • 直立节能组
    • 双车接力组
    • 声音信标组

    创意组别为AI电磁组,该组别的要求和任务也将在本文档后面给出。

     

    二、比赛器材

    1. 车模

    (1)车模种类

    本届比赛指定采用六种标准车模,分别用于个竞速组和创意组。车模中包括两种四轮车模、两种三轮车模、两种两轮直立车模。这些车模来自于两个竞赛车模供应厂商。车模规格请参见附录1:车模信息。

    D,E两轮车模可以通过增加第三万向轮,改装成三轮车,参加双车组的比赛。改装后的三轮车膜,万向轮的中心距离后轮轴线距离不小于15厘米

    除了上述车模之外,无线节能组可以购买任何商用车模进行改装、或者自制车模。

    (2)车模修改要求

    指定车模作为比赛统一平台,对于车模的机械的调整与修改有着严格要求。具体要求参见附录2:车模修改规定。除此之外,竞赛车模作品完成之后,还需要满足各组别对于车模作品外型尺寸的限制。

    对于参加节能组车模的改装则没有具体限制。

     

    2. 电子元器件

    (1)微控制器

    1. 按照不同赛题组别,竞赛车模分别采用英飞凌工程、宏晶公司,恩智浦公司出品的微控制器作为车模中唯一可编程主控制器;
    2. 车模上所使用的微控制器的数量没有限制;
    3. 如果所选用的传感器或者其它电子部件中也包含有微处理器,对此微处理器的种类和数量不做限制,但其不得参与对于赛道信息识别和处理、不参与车模运动决策与控制;
    4. 针对某些特殊电子模块的允许使用或者禁止使用组委会将会另行公布相应器材清单进行说明。

    (2)传感器

    1. 传感器的种类需要根据不同竞赛组别而进行的选用。具体请参见"比赛任务"中关于各比赛组别所允许使用的传感器类型说明。
    2. 传感器的种类和数量由参赛队伍自行确定,不再限制。

    (3)伺服电机

    • 定义: 车模上的伺服电机是指除了车模原有驱动车轮的电机之外的电机,包括舵机、步进电机或者其它种类的电机。

    车模上的伺服电机

    车模上的伺服电机

    • 数量限制: 车模上的伺服电机数量不能够超过三个,其中包括转向控制舵机。转向舵机(B,C车模中的舵机)只允许使用原车模配的舵机型号,而且只允许使用一个舵机。

    • 功能限制: 车模上的额外增加的伺服电机只能用于控制车模上的传感器的方位,或者改变车模底盘姿态。不允许直接或者间接控制车模的转向、改变车模车轮速度。

     

    3. 电路板

    竞赛智能车中,除单片机最小系统的核心子板、加速度计和陀螺仪集成电路板、摄像头、舵机自身内置电路外,所有电路均要求为自行设计制作,禁止购买现成的功能模块。购买的单片机最小核心子板上,只允许带有单片机、时钟、电源以及单片机调试接口。

    自制的PCB板包括但不限于传感器及信号调理、电源管理、电机驱动、主控电路、调试电路等。如果自制电路采用工厂加工的PCB印制电路板,必须在铜层(TopLayer或BottomLayer)醒目位置放置本参赛队伍所在学校名称、队伍名称、参赛年份,对于非常小的电路板可以使用名称缩写,名称在车模技术检查时直接可见。(如果电路板的面积小于1平方厘米,可以不用带有队伍特有信息。)

     

    三、比赛环境

    1. 赛道

    (1)赛道材质

    室内赛道采用PVC耐磨塑胶地板材料制作,材料与前几届比赛相同。对于信标组没有固定赛道,地面材质没有特别指定。

    (2)赛道的尺寸、形状、间距

    赛道宽度不小于45cm。预赛阶段的赛场形状为边长约5m×7m长方形,决赛阶段的赛场约为预赛阶段的两倍。两条相邻赛道中心线之间的间距不小于60cm。赛道中存在着直线、曲线、十字交叉路口等。曲线的曲率半径不小于50cm。如下图所示:

    赛道的基本尺寸

    赛道的基本尺寸

    (3)赛道引导方式

    除了信标组其余的赛道上都具有边界线和电磁引导线,信标组使用声音信标导引。

    • 赛道边界线: 赛道两侧铺设有黑色边界线用于赛道引导。边界线的宽度为25±5mm。如下图所示:

    赛道边界引导线

    赛道边界引导线

    • 中心电磁导引: 赛道铺设有中心电磁引导线。引导线为一条铺设在赛道中心线上,直径为0.1~1.0mm的漆包线,其中通有20kHz、100mA的交变电流。频率范围20k±1kHz,电流范围100±20mA。

      根据竞赛使用的20kHz的交变电流源的输出等效电路所示,可以使用下面建议的测量电路测量赛道电流。如果参赛队伍所使用的电流源输出电流的波形接近方波,则可以使用普通的数字万用表的交流电流档测量电流源输出的电流值。

      电磁线内嵌在赛道中心,上面使用白色胶带固定。如下图所示:

    电磁引导线固定示意图

    电磁引导线固定示意图

    在PVC赛道上刻画出固定漆包线的凹槽需要借助于一些小的工具,可以使用两片美工刀片制作成能够刻画出1.5mm的双缝刀片,沿着中心线进行刻画。然后将双缝中间的PVC材料表面揭开,便形成了宽度为1.5mm左右,深度为1mm左右的凹糟,可以铺设中心引导线。

    刻画赛道中心凹槽双缝刀片

    刻画赛道中心凹槽双缝刀片

    • 电磁线信号源: 参赛队伍可以使用自行制作的信号源。信号源通过单通道耳机插头直接插入现场信号源的插座中,即可替代缺省的信号源,为场地内的电磁导线提供信号激励了。

      选手自带信号源所使用的信号频率、波形和幅度没有任何限制,只要能够满足当前铺设的电缆和插座中允许的最大电压、电流和频率范围即可。

    外界自带信号源接口

    外界自带信号源接口

    • 信标引导: 在铺有蓝色广告布的平整场地内随机安放5至15左右的信标,车模在信标的导引下做定向运动。第十五届的信标主要通过Chirp声音和RF信号引导。关于信标的具体技术参数和制作方案参见《第十五届智能车竞赛信标比赛系统说明》。

    信标引导比赛场地示意图

    信标引导比赛场地示意图

    (4)起跑线标志

    竞速比赛要求车模在比赛完毕后,能够自动停止在停车区域内。除了信标组、双车组之外,其它各组别的停车区都是在赛道起跑线后三米的赛道内。停止时,要求赛车的所有轮胎都必须在赛道内。

    起跑线的标志有两种形式:

    • A.斑马线起跑线: 如下图所示,计时起始点处有一个宽度为10cm黑色斑马线,斑马线使用与赛道黑色边线一样的材料制作。

    斑马起跑线

    斑马起跑线

    • B. 永久磁铁标志: 在赛道中间安装有永久磁铁。磁铁参数:直径7.5 - 15mm,高度1-3mm,表面磁场强度3000-5000高斯。

      起跑线附近的永磁铁的分布是在跑道中心线两边对称分布。相应的位置如下图所示:

    起跑线中间的永磁体安放位置

    起跑线中间的永磁体安放位置

    • C. 车库: 车库元素是今年赛道元素新增的元素。车库赛道元素是在起跑线旁设置的方形区域,它的尺寸如下图所示:
      赛道车库
      赛道车库

    车模出发是从车库驶出,在运行一周之后在驶入车模内。比赛时间是从车模驶出车库和返回车库之间的时间差计算。因此计时线圈是放置在车库门口处。赛道上的斑马线和斑马线下的磁铁放置与往届规则相同。

    车库应用于“基础四轮组”,“节能组”,“双车接力组”。

    (5)赛道边界判定

    除了信标对抗组、室外越野电磁组别之外,其它各组别都要求车模在运行过程中保持在赛道内。

    在赛道边缘处有可能粘贴两层黑色高密度海绵条,形成赛道路肩,作为赛道边界。也有可能不粘贴黑色高密度海绵条。

    海绵条宽度为2.5cm,两层高度1cm。在赛道两侧相隔25cm粘贴,交错分布,间隔处仍为黑色边界。如下图所示:

    赛道路肩

    赛道路肩

    带有路肩赛道将会使用人工进行判罚车模是否冲出赛道,判罚方式和标准与以前比赛形式相同。不粘贴路肩赛道将会由裁判系统在随机选择的定地点出按照感应线圈完成自动判罚,具体判罚标准将会另行发布判罚规范文档。

    (6)赛道元素

    比赛赛道是一个封闭曲线赛道,具有以下赛道元素。

     注:赛道元素中的示意图:图例中除了赛道之外的交通标示只是用于赛道元素功能说明,在比赛现场的赛道周围没有这些交通标示。
    
    • 直线赛道: 这是赛道的基本形式。

    直线赛道示意图

    直线赛道示意图

    • 曲线弯道: 赛道中具有多段曲线弯道。这些弯道可以形成圆形环路,圆角拐弯,S型赛道等。赛道中心线的曲率半径大于50厘米。

    曲线弯道示意图

    曲线弯道示意图

    • 曲线弯道示意图

      曲线弯道示意图

    • 十字交叉路口: 车辆通过十字交叉路口需要直行,不允许左转、右转。

    十字交叉路口示意图

    十字交叉路口示意图

    • 坡道: 坡道的坡度不超过20°。坡道可以不是对称的。坡道的过渡弧长大于10厘米。坡道的长度、高度没有限制。一般情况下坡道的总长度会在1.5米左右。电磁组的导引线铺设在坡道的表面。

    坡道示意图

    坡道示意图

    注:对于AI电磁组,信标组没有坡道赛道元素。
    
    • 环岛: 赛车经过环岛时需进入环岛绕行一周后继续前行。环岛中心线半径不小于50厘米。电磁导线也是在环岛绕行一周。

    环岛赛道元素

    环岛赛道元素

    注:对于AI电磁组,不要求在环岛赛道元素进入环岛。
    

     

    2. 环境

    (1)赛道场地

    • 赛道场地地面平整。如果地面是平滑的水泥、水磨石、大理石地面则可以直接安装。如果为比赛场馆的地毯地面,则会在其上首先铺设一层KT板材,然后再铺设赛道。
    • 地面颜色要求:与白色赛道有一定的色差,颜色可以根据现场底板的情况确定。一般情况下会采用蓝色的广告布铺设赛道背景颜色。具体比赛现场的赛道背景颜色将会在正式比赛前一个月进行正式公布。
    • 室外比赛,一般选择在宽阔的操场,篮球场,或者马路上进行,对于地面没有特殊的要求。

    (2)环境光线

    室内比赛场地,一般会安排在室内场地。在比赛过程中可能会有阳光直接照射,或者强烈的灯光照射。

    (3)赛场围挡

    在比赛场地四周铺设围挡。围挡距离赛道大于50厘米。围挡高度不小于30厘米。围挡的材质可以使用长方体泡沫塑料块,也可以使用宣传布。

     

    3. 裁判系统

    比赛所使用的计时裁判系统将会实时自动测量车模运行时间、判定车模出界。

    (1)车模计时磁标

    比赛采用磁场感应方式记录车模通过赛道起跑线的时刻,或者检测车模是否运行在信标周围22.5cm范围内。感应线圈布置在赛道下面以及信标周围,对于运行车模干扰小,同时车模也不容易冲撞计时系统。如下图所示:

    基于磁感应的比赛计时系统

    基于磁感应的比赛计时系统

    为了能够触发计时系统,需要在车模底盘安装一块永磁铁作为标签。永磁铁距离地面高度在2cm以内。由于该磁标体积很小,所以提高了车模检测位置的精确度。具体按照方式如下图所示:

    车模计时磁标

    车模计时磁标

    计时磁标可以永久粘在车模的地盘上,也可以在比赛前临时固定在车模的底盘或者电机上。具体磁标固定的位置并不要求精确,计时的过程是检测该磁标前后通过磁感应线圈的时间间隔。

    特别提醒,对于信标对抗组,只有车模上的磁标进入信标周围的磁感应线圈之内,才能够触发计时系统去切换到下一个信标点亮。

    车模上的永磁标记由参赛车模自行准备,在比赛之前固定在车模上即可。

    根据不同的比赛场景,比赛系统也可能会采用光电计时传感器,届时车模就无需进行任何的改动。

    (2)计时系统

    比赛计时系统、信标控制系统由竞赛组委会在现场统一安置。

    参赛选手在平时训练的时候,可以自行设计制作简化的比赛系统辅助进行调试车模。也可以参照竞赛组委会提供《第十五届智能车竞赛比赛系统说明》来进行设计制作。

     

    四、比赛任务

    本节将就各个组别所能够使用的车模、传感器以及比赛所需要完成的任务指标进行介绍。

    1. 基础四轮组

    (1)车模

    车模可以使用竞赛指定车模中任何型号,车模运行方向不限。

    车模制作完毕后,车模宽度不超过25厘米,高度不超过20厘米,长度没有限制。

    (2)微控制器与传感器

    车模微控制器使用Infineon, STC, NXP系列单片机。

    允许使用各类电磁、红外光电、超声传感器器件进行赛道和环境检测。不允许任何摄像头传感器、激光传感器等。

    (3)比赛赛道与任务

    比赛是在PVC赛道上进行,赛道采用黑色边线和电磁进行导引。赛道中可能存在的元素包括表2中所有的元素。

    选手制作的车模完成从车库触发沿着赛道运行一周,然后在返回车库。比赛时间从车模冲过起跑线到重新回到起跑线为止。如果车模没有能够停止在车库内停车区内,比赛时间加罚一秒钟。

    车模出发和返回进入车库

    车模出发和返回进入车库

     

    2. 直立节能组

    (1)车模

    车模在运行过程中只允许两个轮子着地。可以使用竞赛指定车模中D,E车模,也可自行制作车模。

    车模制作完毕后,车模尺寸没有限制。车模轮胎外径不大于5.5厘米。

    直立节能组示意图

    直立节能组示意图

    无线充电线圈部署在车库内。在充电过程中,车模可以不保持平衡状态。充电结束后自动出发完成比赛。

    (2)微控制器与传感器

    车模微控制器使用STC系列单片机。

    允许使用各类电磁、红外光电、摄像头、激光传感器、超声传感器器件进行赛道和环境检测。

    (3)比赛赛道与任务

    比赛是在PVC赛道上进行,赛道采用黑色边线和电磁进行导引。赛道中可能存在的元素包括表2中所有的元素。

    比赛赛道发车区中安放有无线发射线圈,通过交变电流,产生交变磁场。车模通过接收线圈获得电能,对车模上的储能法拉电容进行充电。关于无线充电线圈具体技术规格以及制作方式,无线接收线圈的规格以及制作方式将会另行发布文档进行说明。

    车模上不允许安装任何电能储能器件,车模运行的能源来自于无线接收线圈感应电流提供的电能。

    车模在进入比赛场地前,车模上的储能电容需要经过放电,电容两端直流电压小于0.1V。比赛计时从无线充电线圈通电后计时。车模从车库出发和停止在车库的要求与基础四轮组要求相同。

     

    3. 双车接力组

    (1)车模

    车模可以使用竞赛指定车模中任何型号,车模运行方向不限,双车模中需要有一辆采用三轮车模。

    车模制作完毕后,车模宽度不超过25厘米,高度不超过20厘米,长度小于30厘米。

    (2)微控制器与传感器

    双车车模中,其中一辆车模的微控制器使用 Infineon公司的单片机,另外一辆车模可以使用Infineon, STC, NXP公司的单片机。

    允许使用各类电磁、红外光电、超声传感器器件进行赛道和环境检测。不允许任何摄像头传感器、激光传感器等。

    (3)比赛赛道与任务

    一辆车模在赛道中间指定位置停止。一辆车模从车库出发,到达中间车模位置时,将车上的一个尺寸不小于40厘米见方的球体传递给第二辆车模,第二辆车模带着球体返回车库。

    双车接力组出发和返回进入车库

    双车接力组出发和返回进入车库

    传递的球体可以使用用标准的乒乓球,或者高尔夫球。也可以另外自制其他材质的球体,只要其直径不小于40毫米即可。

    双车接力组传递物品示意图

    双车接力组传递物品示意图

     

    4. 声音信标组

    (1)车模

    车模可以使用竞赛指定H车模。车模制作完毕后,车模尺寸不超过30厘米见方,车模的高度没有限制。

    (2)微控制器与传感器

    车模微控制器使用Infineon系列单片机。

    允许使用麦克风阵列、RF天线、红外光电、摄像头传感器、激光传感器等。

    (3)比赛赛道与任务

    对抗组的比赛场地设置在平整的地面上,并铺设有单一颜色的广告布或者地毯。场地四周铺设5cm宽度的黄色胶带。比赛区域约为5米×7米。车模发车区域位于比赛场地一角,由2.5厘米黑色胶带标记区域。发车区域长宽都是50cm。

    比赛区域内随机安放由5至10个左右的信标,它们统一由比赛计时系统控制,如下图所示。

    比赛包括排位预赛和对抗决赛两个阶段。

    第一阶段是排位预赛。选手制作的车模开始位于发车区域内,此时所有的信标都是关闭状态。开始比赛后,比赛系统自动会启动第一个信标,信标会发送声音和无线射频导引信号。此时选手的车模能够识别确定信标的方位并做定向运动。

    当车模上安放的磁标进入信标附近的感应线圈后,比赛系统会自动切换到下一个信标,车模随机前往第二个打开的信标。此过程将会进行10次左右。最终比赛时间是从当一个信标启动,到最后一次信标关闭为止。

    第二阶段是对抗决赛。 在对抗决赛中,则按照预赛成绩进行配对分组对抗比赛。两个车队的车模同时在场内,按照熄灭信标的多少决出胜负。

    信标对抗组别中的磁标最多允许安装四个。磁标距离车模底盘或者车轮直线距离不超过5厘米,距离地面高度不超过2厘米。

     

    5. AI电磁组

    AI电磁组将会根据比赛组织和报名情况由普通的竞速组别转为创意组别。

    (1)车模

    车模可以使用竞赛指定车模B,C车模,车模运行方向不限。

    车模制作完毕后,车模长度不超过30厘米,宽度不超过20厘米,高度小于10厘米。

    车模上安装的传感器在车模运行方向上不超过车轮中心线5厘米。

    (2)微控制器与传感器

    车模微控制器允许使用Infineon, STC, NXP 公司的单片机。

    允许使用各类电磁、红外光电、超声传感器器件进行赛道和环境检测。不允许任何摄像头传感器、激光传感器等。

    (3)比赛赛道与任务

    比赛是在PVC赛道上进行,赛道采用黑色边线和电磁进行导引。赛道中可能存在的元素包括表2中除了坡道以外的元素。对于环岛元素,车模可以选择进入环岛,也可以选择不进入环岛。

    赛车直接在赛道上起跑线出发,车模完成赛道运行一周停止在起跑线后三米的赛道停车区内。比赛中没有发车和停车的车库。如果车模没有能够停止在起跑线后三米的赛道停车区内,比赛时间加罚一秒钟。

     

    五、比赛组织

    1. 比赛阶段

    竞赛分为分赛区(省赛区)和全国总决赛两个阶段。其中,全国总决赛阶段在全国竞赛组委会秘书处指导下,与决赛承办学校共同成立竞赛执行委员会,下辖技术组、裁判组和仲裁委员会,统一处理竞赛过程中遇到的各类问题。

    全国和分赛区(省赛区)竞赛组织委员会工作人员,包括技术评判组、现场裁判组和仲裁组成员均不得在现场比赛期间参与任何针对个别参赛队的指导或辅导工作,不得泄露任何有失公允竞赛的信息。在现场比赛的时候,组委会可以聘请参赛队伍带队教师作为车模检查监督人员。

    竞赛职能机构

    竞赛职能机构

     

    2. 比赛方式和流程

    竞赛组委会将根据2020年比赛筹备和报名情况,在分赛区可能采取以下,并不限于以下几种方式展开分赛区比赛:

    1. 采用赛会制在承办学校进行现场比赛;
    2. 参赛队伍按照学校委派代表到承办学校完成比赛;
    3. 参赛队伍将车模作品通过邮寄方式寄送到承办学校由组委会统一进行车模性能测试;
    4. 参赛队伍按照统一标准流程,在本校进行比赛,比赛过程进行全程直播。

    具体比赛方式将会在6月中旬组委会第二次扩大会议讨论之后进行公布。

     

    3. 比赛奖项

    比赛将按照"分赛区普及、全国赛提高"的原则,在分赛区、省赛区每个组别分别按照相同的比例设置奖项。每个组别按照相同的队伍选拔各分赛区队伍参加全国总决赛。

    (1)分赛区奖项设置

    • 一等奖:分赛区参赛队伍前20%队伍。
    • 二等奖:分赛区参赛队伍35%。
    • 三等奖:正常完成比赛但未获得一、二等奖的队伍。
    • 优秀奖:未正常完成比赛,但通过补赛完成比赛的队伍。

    各分赛区可以根据比赛需要,修改和设置不同的奖项,并报大赛组委会审批。

    (2)全国总决赛奖项设置

    第十五届全国总决赛奖项设置将在6月中旬另行发布。

     

    4. 组队即报名办法

    (1)组队规定

    2020年暑期之前在校具有正式学籍的全日制本科生均可以参加比赛。每支参赛队由本校3名学生(双车组别可以有5名学生)组成,本校带队老师1-2名。每名学生只能参加一个组别竞速比赛。

    (2)报名办法

    智能车竞赛网站: https://smartcar.cdstm.cn/index。

    参赛队通过竞赛网站报名,详细报名流程参见《第十五届全国大学智能汽车竞赛参赛队伍网络报名流程说明》。参赛队伍可以按照大赛网站上公布的信息联系购买车模套件、单片机开发工具以及辅助教材。

     

    六、其它

    1.比赛过程中有其他作弊行为的,取消比赛成绩;
    2.参加预赛并晋级决赛的队伍人员不允许改变;
    3.参加全国总决赛的队伍中的队员最多只允许改变一名队员。
    4.本规则解释权归比赛组织委员会和竞赛秘书处所有。

     

    七、附件

    附录1: 车模信息

    1. 车模供应商:北京科宇通博科技有限公司

    (1)B型车模:电机540,舵机:S-D5
    B型车模示意图

    B型车模示意图

    (2)E型车模:电机:RS-380
    E型车模示意图

    E型车模示意图

    (3)H型车模:电机RS-380
    H型车模示意图

    H型车模示意图

    2. 车模供应商:东莞市博思电子数码科技有限公司

    (1)C型车模:电机RS-380,舵机:FUTABA3010
    C型车模示意图

    C型车模示意图

    (2)D型车模:电机 RS-380
    D型车模示意图

    D型车模示意图

    (3)F型车模:电机RS-380
    F型车模示意图

    F型车模示意图

    附录2:车模修改要求

    • 禁止不同型号车模之间互换电机、舵机和轮胎;

    • 禁止改动车底盘结构、轮距、轮径及轮胎;如有必要可以对于车模中的零部件进行适当删减;

    • 禁止采用其它型号的驱动电机,禁止改动驱动电机的传动比;

    • 禁止改造车模运动传动结构;

    • 禁止改动舵机模块本身,但对于舵机的安装方式,输出轴的连接件没有任何限制;

    • 禁止改动驱动电机以及电池,车模前进动力必须来源于车模本身直流电机及电池;

    • 禁止增加车模地面支撑装置。在车模静止、动态运行过程中,只允许车模原有四个车轮对车模起到支撑作用。对于电磁平衡组组,车模直立行走,在比赛过程中,只允许原有车模两个后轮对车模起到支撑作用。

    • 为了安装电路、传感器等,允许在底盘上打孔或安装辅助支架等。

    • 车轮:参赛车模的车轮需要是原车模配置的车轮和轮胎,不允许更改使用其它种类的车轮和轮胎,不允许增加车轮防滑胶套。

      如果车轮损坏,则需要购买原车模提供商出售的车轮轮胎。

      允许对于车轮轮胎做适当打磨,但要求原车轮轮胎花纹痕迹依然能够分辨。不允许对于车轮胎进行雕刻花纹。

      参赛队伍的轮胎表面不允许有粘性物质,检测标准如下:

      车模在进入赛场之前,车模平放在地面A4打印纸上,端起车模后,A4打印纸不被粘连离开地面。检查过程如下图所示:
      车模轮胎粘性检查

      车模轮胎粘性检查

    车模在赛道上运行之后,不能够留下可辨析的痕迹。

     

    附录3:赛车磁标

    在比赛中新的计时系统采用的铺设的线圈感应磁标进行计时。为了便于车模安装,车模中可以采用以下几类钕铁硼永磁铁。

    用作计时磁标的永磁铁

    用作计时磁标的永磁铁

    第一类扁平的长方磁铁便于直接使用胶水粘贴在车模底板,既牢靠,又距离地面近,便于触发计时系统。推荐采用这类磁标。

    第二类和第三类都属于圆柱形的永磁铁,只是第三类中带有中间孔,方便利用螺丝固定在赛车底盘上。为了可靠触发计时系统,这两类的磁铁的大小(高、直径)应该在7至10毫米。太小不利于触发计时系统,太高则不易于安装。

    为了可靠触发计时系统,要求以上三种磁标安装后距离赛道表面应小于2厘米。一种比较简便的固定方式就是将上述永磁铁吸附在车模电机的下面。

    展开全文
  • 1、什么是规则引擎?

    2020-11-23 22:07:20
    一、什么是规则引擎 当我们在对复杂的业务进行开发时,程序本身逻辑代码和业务代码互相嵌套、错综复杂,同时维护成本高,可拓展性差。 规则引擎即是:可降低复杂业务逻辑组件复杂性、降低应用程序的维护和可扩展性...

    一、什么是规则引擎

    当我们在对复杂的业务进行开发时,程序本身逻辑代码和业务代码互相嵌套错综复杂,同时维护成本高可拓展性差

    规则引擎即是:可降低复杂业务逻辑组件复杂性、降低应用程序的维护和可扩展性成本的组件

    如下图:

    规则引擎实际上就是一个推理引擎,用于匹配facts(事实,我们可以理解为输入数据)和rules(规则),以推出结论。

    二、为什么使用规则引擎

    背景:业务规则经常变化,系统需依据业务的变化,实现快速低成本的迭代更新。

    因此,为了快速、低成本的更新,我们需将逻辑代码业务代码进行解耦:

    • 研发人员(不需懂业务)开发维护程序部分,同时测试通过后,后续不会经常变化改动;
    • 业务人员可直接管理这些业务规则,同时不需要研发人员的参与。

    因此它具有以下优点:

    1. 业务人员和研发人员各司其职;
    2. 稳定层和变化层分离,这是一种优秀的设计模式;
    3. 变化层支持可视化或配置化的方式,快速进行业务规则的增删改操作,甚至支持热插拔和热更新。以减少冗长的开发和测试周期;
    4. 部分规则引擎甚至带有设计器(如drools),还可解决我们 “简式建模” 的需求。

    三、主流规则引擎

    市面上主流的规则引擎包括:

    序号 名称 开源情况 流行度 运行模式 备注
    1 llog 商业 非常出名 / 价格昂贵,不推荐
    2 drools 开源 github 3.2k 嵌入式、分离式 支持可视化等整个配套,是一个完整的BMRS系统(业务规则管理系统),同时其生态很活跃。
    3 esayRule 开源 github 2.6k 嵌入式 支持ymljava注解方式配置规则,但是后两者无法实现动态加载。
    4 qlexpress 开源 github 2.3k 嵌入式 支持java方式书写规则,且支持动态加载,但加载比较耗时。后续还有Aviator、Vincio均是类似性质,故不予赘述。
    5 uRule 商业 github 1.1k 嵌入式、分离式 除了部分开源外,其他方面基本和drools差不多,也是一套完整的 BMRS系统,且是国内开发,学习和使用门槛更低。
    6 logstash 开源 出名 分离式 它不算规则引擎,但也放这儿了。想到它也是做数据处理,且支持正则模式匹配等简单数据处理。也许某些公司某些场景,就刚刚就能用上。
    7 jess 商业 文档巨少 / 不推荐
    8 jruleengine 开源 国内几乎没咋用 嵌入式 不推荐
    9 jlisa 商业 同上 / 不推荐
    10 esper 开源 github 659 嵌入式 不推荐
    11 自研 / / / /

    PS:

    • 顶书droolsesper权衡下,选择了drools
      原因是自研需投入大量人力物力,做的稳定好用还需时间,所以自研被否了,而esper热度较低,担心没人维护。
    • 美团droolsesayrule权衡下,选择了activi ^_^!

    因此,我们下一篇文章主要看看drools的一个大体架构,以及踩坑笔记。

    如果喜欢本文,请关注公众号:开猿笔记,里面会有持续更新噢!
    在这里插入图片描述

    展开全文
  • 规则引擎详解

    千次阅读 2018-12-21 21:16:00
    规则引擎(flagleader)由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务...

           规则引擎(flagleader)由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

    应用背景

    企业级管理者对企业IT系统的开发有着如下的要求:

    1.为提高效率,管理流程必须自动化,即使现代商业规则异常复杂。

    2.市场要求业务规则经常变化,IT系统必须依据业务规则的变化快速、低成本的更新。

    3.为了快速、低成本的更新,业务人员应能直接管理IT系统中的规则,不需要程序开发人员参与。

    产品优点

    使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性,降低应用程序的维护和可扩展性成本,其优点如下:

    · 分离商业决策者的商业决策逻辑和应用开发者的技术决策;

    · 能有效的提高实现复杂逻辑的代码的可维护性;

    · 在开发期间或部署后修复代码缺陷;

    · 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内;

    · 符合组织对敏捷或迭代开发过程的使用;

    代表企业

           大多数规则引擎都支持规则的次序和规则冲突检验,支持简单脚本语言的规则实现,支持通用开发语言的嵌入开发。目前业内有多个规则引擎可供使用,其中包括商业和开放源码选择。开源的代表是Drools,商业的代表是VisualRules ,iLog。

    结合BPEL

           许多组织正从面向对象的业务流程管理范例转移到面向服务的方法;实际上,服务正在成为应用程序开发的基本元素。同时,业务流程执行语言(BPEL)已经成为编排这些服务和管理业务流程的无缺陷执行的事实标准。这些趋势所产生的结果是,为更灵活、更经济高效地管理业务流程提供了一些良机。

           大多数业务流程(贷款审批就是一个典型示例)包含多个决策点。在这些决策点处,将对某个条件进行评估。业务流程根据这些标准或业务规则更改它们的行为。(一个是BPEL流程编排的分支可能存在规则,一个是BPEL中的活动节点本身可能存在数据处理规则。)实际上,这些业务规则对业务流程起到了推动作用。这些规则通常嵌入到业务流程本身或自定义Java代码的内部,这将导致在将来的某个时候出现若干问题:

    • 业务规则比业务本身更改得更频繁,而更改和管理嵌入的业务规则是一个复杂问题,并超出了大多数分析员的能力范围。因此,随着业务规则的更改,程序员通常要消耗大量时间来执行该任务。

    • 大多数组织都缺少中央规则信息库。策略中任何涉及到组织范围的更改都无法运用到所有业务流程中。

    • 业务流程无法重用规则。因此,IT人员最终要为每个流程设计规则,这通常导致不一致性或冗余。

           避免这些问题的最佳方法是使用规则引擎将业务流程与业务规则分离。在该方法中,规则公开为服务,而BPEL流程在到达决策点时通过查询该引擎来利用这些服务。该方法更为灵活-可以通过图形方式操作规则,而不是在编程语言中或在流程内部对规则进行编码。业务用户可以使用工具自行编写规则,并且无需IT人员的协助即可进行部署后的规则更改。由于大多数更新和功能增强是由业务用户执行的,因此可以显著减少维护成本。 

    产品说明

           规则引擎是解析、调用、执行规则包的服务,目前VisualRules采用java语言来实现规则引擎,并且提供了java类接口、Socket、Servlet、SOAP等多种外部调用接口。其实Java类接口是所有这些接口的核心,其他接口其实也是通过Java类接口来加以调用。考虑到最小化规则引擎,因此规则包的解析工作已经放在规则编辑时,预先进行了处理。规则引擎只处理规则包的调用和执行,同时为规则包用到的数据库接口、Excel接口、内存表接口、Xml接口提供缺省的实现。

    执行原理

           VisualRules规则引擎会根据规则包名称,取得对应规则包编译后的rsc文件。然后将rsc加载到内存中,生成规则包执行上下文。同时规则引擎将传递的参数传递到规则包执行上下文中,然后开始执行规则包。执行完毕后,再将规则包执行上下文中的数据,传回给调用规则包的应用程序。整个执行原理非常简单,因此最大限度的保证了规则运行平台的稳定以及最佳的性能。

    接口信息

    据库接口

           规则包的对象库中,定义了以下一些数据库对象接口Database、Table、Select、View、Procedure。VisualRules规则引擎直接用JDBC来实现这些接口,最大限度的保证了数据库对象调用的性能。当然用户可以根据自己的需要,重新来实现这些数据库接口

    Excel接口

           规则包需要调用的Excel接口主要是IExcelBook、IExcelSheet、IExcelTableSheet、IExcelXYSheet。VisualRules规则引擎采用POI来实现Excel接口。

    内存表格接口

           规则包需要调用的内存表格接口为Sheet,VisualRules采用Object[][]来实现内存表格接口的实现。

    Xml接口

           规则包需要调用的XML接口为Node。目前VisualRules采用Jdom来实现。

    如何调用

           规则引擎是外部Java程序调用规则包的一组Java类,其包含在engine.jar中。 外部Java程序调用规则包时只需要用到两个类。一个是 com.flagleader.engine.RuleEngine 。另一个是 com.flagleader.engine.RuleEngineFactory 。

    RuleEngineFactory是得到规则引擎实例的工厂类。 通常代码为

    RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();

    得到规则引擎实例后,可以调用规则引擎中的方法,主要是put、excute和get这三个方法。 put用于传入需要传入的值,excute用于运行指定的规则包,get用于得到传出的值。 一般的调用代码为:

    ruleEngine.put(传入对象);

    ruleEngine.excute("规则包调用名");

    传出对象 = ruleEngine.get("传出对象名");

    因此外部程序调用规则包非常简单。只需以上几行代码就可以完成应用。

    展开全文
  • Drool规则引擎详解(一)

    万次阅读 2018-12-25 15:27:35
    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。  本文所使用的...

    http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx

    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。

     本文所使用的demo已上传 http://download.csdn.net/source/3002213

    1、Drools语法

    开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。在drools中,这个传递数据进去的对象,术语叫 Fact对象。Fact对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。

    规则文件可以使用 .drl文件,也可以是xml文件,这里我们使用drl文件。

    规则语法:

    package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。特别的是,package的名字是随意的,不必必须对应物理路径,跟java的package的概念不同,这里只是逻辑上的一种区分。同样的package下定义的function和query等可以直接使用。

    比如:package com.drools.demo.point

    import:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。

    比如:

    import com.drools.demo.point.PointDomain;

    import com.drools.demo.point.PointDomain.getById;

    rule:定义一个规则。rule "ruleName"。一个规则可以包含三个部分:

    属性部分:定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。

    条件部分,即LHS,定义当前规则的条件,如  when Message(); 判断当前workingMemory中是否存在Message对象。

    结果部分,即RHS,这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用。

    规则事例:

    rule "name"

           no-loop true

           when

                   $message:Message(status == 0)

           then

                   System.out.println("fit");

                   $message.setStatus(1);

                   update($message);

    end

    上述的属性中:

    no-loop : 定义当前的规则是否不允许多次循环执行,默认是false,也就是当前的规则只要满足条件,可以无限次执行。什么情况下会出现一条规则执行过一次又被多次重复执行呢?drools提供了一些api,可以对当前传入workingMemory中的Fact对象进行修改或者个数的增减,比如上述的update方法,就是将当前的workingMemory中的Message类型的Fact对象进行属性更新,这种操作会触发规则的重新匹配执行,可以理解为Fact对象更新了,所以规则需要重新匹配一遍,那么疑问是之前规则执行过并且修改过的那些Fact对象的属性的数据会不会被重置?结果是不会,已经修改过了就不会被重置,update之后,之前的修改都会生效。当然对Fact对象数据的修改并不是一定需要调用update才可以生效,简单的使用set方法设置就可以完成,这里类似于java的引用调用,所以何时使用update是一个需要仔细考虑的问题,一旦不慎,极有可能会造成规则的死循环。上述的no-loop true,即设置当前的规则,只执行一次,如果本身的RHS部分有update等触发规则重新执行的操作,也不要再次执行当前规则。

    但是其他的规则会被重新执行,岂不是也会有可能造成多次重复执行,数据紊乱甚至死循环?答案是使用其他的标签限制,也是可以控制的:lock-on-active true

    lock-on-active true:通过这个标签,可以控制当前的规则只会被执行一次,因为一个规则的重复执行不一定是本身触发的,也可能是其他规则触发的,所以这个是no-loop的加强版。当然该标签正规的用法会有其他的标签的配合,后续提及。

    date-expires:设置规则的过期时间,默认的时间格式:“日-月-年”,中英文格式相同,但是写法要用各自对应的语言,比如中文:"29-七月-2010",但是还是推荐使用更为精确和习惯的格式,这需要手动在java代码中设置当前系统的时间格式,后续提及。属性用法举例:date-expires "2011-01-31 23:59:59" // 这里我们使用了更为习惯的时间格式

    date-effective:设置规则的生效时间,时间格式同上。

    duration:规则定时,duration 3000   3秒后执行规则

    salience:优先级,数值越大越先执行,这个可以控制规则的执行顺序。

    其他的属性可以参照相关的api文档查看具体用法,此处略。

     

    规则的条件部分,即LHS部分:

    when:规则条件开始。条件可以单个,也可以多个,多个条件一次排列,比如

     when

             eval(true)

             $customer:Customer()

             $message:Message(status==0)

    上述罗列了三个条件,当前规则只有在这三个条件都匹配的时候才会执行RHS部分,三个条件中第一个

    eval(true):是一个默认的api,true 无条件执行,类似于 while(true)

    $message:Message(status==0) 这句话标示的:当前的workingMemory存在Message类型并且status属性的值为0的Fact对象,这个对象通常是通过外部java代码插入或者自己在前面已经执行的规则的RHS部分中insert进去的。

    前面的$message代表着当前条件的引用变量,在后续的条件部分和RHS部分中,可以使用当前的变量去引用符合条件的FACT对象,修改属性或者调用方法等。可选,如果不需要使用,则可以不写。

    条件可以有组合,比如:

    Message(status==0 || (status > 1 && status <=100))

    RHS中对Fact对象private属性的操作必须使用getter和setter方法,而RHS中则必须要直接用.的方法去使用,比如

      $order:Order(name=="qu")
      $message:Message(status==0 && orders contains $order && $order.name=="qu")

    特别的是,如果条件全部是 &&关系,可以使用“,”来替代,但是两者不能混用

    如果现在Fact对象中有一个List,需要判断条件,如何判断呢?

    看一个例子:

    Message {

            int status;

            List<String> names;

    }

    $message:Message(status==0 && names contains "网易" && names.size >= 1)

    上述的条件中,status必须是0,并且names列表中含有“网易”并且列表长度大于等于1

    contains:对比是否包含操作,操作的被包含目标可以是一个复杂对象也可以是一个简单的值。 

    Drools提供了十二中类型比较操作符:

    >  >=  <  <=  ==  !=  contains / not contains / memberOf / not memberOf /matches/ not matches

    not contains:与contains相反。

    memberOf:判断某个Fact属性值是否在某个集合中,与contains不同的是他被比较的对象是一个集合,而contains被比较的对象是单个值或者对象。

    not memberOf:正好相反。

    matches:正则表达式匹配,与java不同的是,不用考虑'/'的转义问题

    not matches:正好相反。

     

    规则的结果部分

    当规则条件满足,则进入规则结果部分执行,结果部分可以是纯java代码,比如:

    then

           System.out.println("OK"); //会在控制台打印出ok

    end

    当然也可以调用Fact的方法,比如  $message.execute();操作数据库等等一切操作。

    结果部分也有drools提供的方法:

    insert:往当前workingMemory中插入一个新的Fact对象,会触发规则的再次执行,除非使用no-loop限定;

    update:更新

    modify:修改,与update语法不同,结果都是更新操作

    retract:删除

    RHS部分除了调用Drools提供的api和Fact对象的方法,也可以调用规则文件中定义的方法,方法的定义使用 function 关键字

    function void console {

       System.out.println();

       StringUtils.getId();// 调用外部静态方法,StringUtils必须使用import导入,getId()必须是静态方法

    }

    Drools还有一个可以定义类的关键字:

    declare 可以再规则文件中定义一个class,使用起来跟普通java对象相似,你可以在RHS部分中new一个并且使用getter和setter方法去操作其属性。

    declare Address
     @author(quzishen) // 元数据,仅用于描述信息

     @createTime(2011-1-24)
     city : String @maxLengh(100)
     postno : int
    end

    上述的'@'是什么呢?是元数据定义,用于描述数据的数据~,没什么执行含义

    你可以在RHS部分中使用Address address = new Address()的方法来定义一个对象。

     

    更多的规则语法,可以参考其他互联网资料,推荐:

    http://wenku.baidu.com/view/a6516373f242336c1eb95e7c.html

    (写的很基础,但是部分语法写的有些简单,含糊不好理解)

    2、Drools应用实例:

    现在我们模拟一个应用场景:网站伴随业务产生而进行的积分发放操作。比如支付宝信用卡还款奖励积分等。

    发放积分可能伴随不同的运营策略和季节性调整,发放数目和规则完全不同,如果使用硬编码的方式去伴随业务调整而修改,代码的修改、管理、优化、测试、上线将是一件非常麻烦的事情,所以,将发放规则部分提取出来,交给Drools管理,可以极大程度的解决这个问题。

    (注意一点的是,并非所有的规则相关内容都建议使用Drools,这其中要考虑系统会运行多久,规则变更频率等一系列条件,如果你的系统只会在线上运行一周,那根本没必要选择Drools来加重你的开发成本,java硬编码的方式则将是首选)

    我们定义一下发放规则:

    积分的发放参考因素有:交易笔数、交易金额数目、信用卡还款次数、生日特别优惠等。

    定义规则:

    // 过生日,则加10分,并且将当月交易比数翻倍后再计算积分

    // 2011-01-08 - 2011-08-08每月信用卡还款3次以上,每满3笔赠送30分

    // 当月购物总金额100以上,每100元赠送10分

    // 当月购物次数5次以上,每五次赠送50分

    // 特别的,如果全部满足了要求,则额外奖励100分

    // 发生退货,扣减10分

    // 退货金额大于100,扣减100分

    在事先分析过程中,我们需要全面的考虑对于积分所需要的因素,以此整理抽象Fact对象,通过上述的假设条件,我们假设积分计算对象如下:

    /** * 积分计算对象 * @author quzishen */ public class PointDomain { // 用户名 private String userName; // 是否当日生日 private boolean birthDay; // 增加积分数目 private long point; // 当月购物次数 private int buyNums; // 当月退货次数 private int backNums; // 当月购物总金额 private double buyMoney; // 当月退货总金额 private double backMondy; // 当月信用卡还款次数 private int billThisMonth;

    /**
     * 记录积分发送流水,防止重复发放
     * @param userName 用户名
     * @param type 积分发放类型
     */
    public void recordPointLog(String userName, String type){
    	System.out.println("增加对"+userName+"的类型为"+type+"的积分操作记录.");
    }
    
    public String getUserName() {
    	return userName;
    }
    

    // 其他getter setter方法省略
    }

    定义积分规则接口

    /** * 规则接口 * @author quzishen */ public interface PointRuleEngine {

    /**
     * 初始化规则引擎
     */
    public void initEngine();
    
    /**
     * 刷新规则引擎中的规则
     */
    public void refreshEnginRule();
    
    /**
     * 执行规则引擎
     * @param pointDomain 积分Fact
     */
    public void executeRuleEngine(final PointDomain pointDomain);
    

    }

    规则接口实现,Drools的API很简单,可以参考相关API文档查看具体用法:

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.List;

    import org.drools.RuleBase;
    import org.drools.StatefulSession;
    import org.drools.compiler.DroolsParserException;
    import org.drools.compiler.PackageBuilder;
    import org.drools.spi.Activation;

    /**

    • 规则接口实现类

    • @author quzishen
      */
      public class PointRuleEngineImpl implements PointRuleEngine {
      private RuleBase ruleBase;

      /* (non-Javadoc)

      • @see com.drools.demo.point.PointRuleEngine#initEngine()
        */
        public void initEngine() {
        // 设置时间格式
        System.setProperty(“drools.dateformat”, “yyyy-MM-dd HH:mm:ss”);
        ruleBase = RuleBaseFacatory.getRuleBase();
        try {
        PackageBuilder backageBuilder = getPackageBuilderFromDrlFile();
        ruleBase.addPackages(backageBuilder.getPackages());
        } catch (DroolsParserException e) {
        e.printStackTrace();
        } catch (IOException e) {
        e.printStackTrace();
        } catch (Exception e) {
        e.printStackTrace();
        }
        }

      /* (non-Javadoc)

      • @see com.drools.demo.point.PointRuleEngine#refreshEnginRule()
        */
        public void refreshEnginRule() {
        ruleBase = RuleBaseFacatory.getRuleBase();
        org.drools.rule.Package[] packages = ruleBase.getPackages();
        for(org.drools.rule.Package pg : packages) {
        ruleBase.removePackage(pg.getName());
        }

        initEngine();
        }

      /* (non-Javadoc)

      • @see com.drools.demo.point.PointRuleEngine#executeRuleEngine(com.drools.demo.point.PointDomain)
        */
        public void executeRuleEngine(final PointDomain pointDomain) {
        if(null == ruleBase.getPackages() || 0 == ruleBase.getPackages().length) {
        return;
        }

        StatefulSession statefulSession = ruleBase.newStatefulSession();
        statefulSession.insert(pointDomain);

        // fire
        statefulSession.fireAllRules(new org.drools.spi.AgendaFilter() {
        public boolean accept(Activation activation) {
        return !activation.getRule().getName().contains("_test");
        }
        });

        statefulSession.dispose();
        }

      /**

      • 从Drl规则文件中读取规则

      • @return

      • @throws Exception
        */
        private PackageBuilder getPackageBuilderFromDrlFile() throws Exception {
        // 获取测试脚本文件
        List<String> drlFilePath = getTestDrlFile();
        // 装载测试脚本文件
        List<Reader> readers = readRuleFromDrlFile(drlFilePath);

        PackageBuilder backageBuilder = new PackageBuilder();
        for (Reader r : readers) {
        backageBuilder.addPackageFromDrl®;
        }

        // 检查脚本是否有问题
        if(backageBuilder.hasErrors()) {
        throw new Exception(backageBuilder.getErrors().toString());
        }

        return backageBuilder;
        }

      /**

      • @param drlFilePath 脚本文件路径

      • @return

      • @throws FileNotFoundException
        */
        private List<Reader> readRuleFromDrlFile(List<String> drlFilePath) throws FileNotFoundException {
        if (null == drlFilePath || 0 == drlFilePath.size()) {
        return null;
        }

        List<Reader> readers = new ArrayList<Reader>();

        for (String ruleFilePath : drlFilePath) {
        readers.add(new FileReader(new File(ruleFilePath)));
        }

        return readers;
        }

      /**

      • 获取测试规则文件

      • @return
        */
        private List<String> getTestDrlFile() {
        List<String> drlFilePath = new ArrayList<String>();
        drlFilePath
        .add(“D:/workspace2/DroolsDemo/src/com/drools/demo/point/addpoint.drl”);
        drlFilePath
        .add(“D:/workspace2/DroolsDemo/src/com/drools/demo/point/subpoint.drl”);

        return drlFilePath;
        }
        }

    为了获取单实例的RuleBase,我们定义一个工厂类

    import org.drools.RuleBase; import org.drools.RuleBaseFactory;

    /**

    • RuleBaseFacatory 单实例RuleBase生成工具

    • @author quzishen
      */
      public class RuleBaseFacatory {
      private static RuleBase ruleBase;

      public static RuleBase getRuleBase(){
      return null != ruleBase ? ruleBase : RuleBaseFactory.newRuleBase();
      }
      }

    剩下的就是定义两个规则文件,分别用于积分发放和积分扣减

    addpoint.drl

    package com.drools.demo.point

    import com.drools.demo.point.PointDomain;

    rule birthdayPoint
    // 过生日,则加10分,并且将当月交易比数翻倍后再计算积分
    salience 100
    lock-on-active true
    when
    $pointDomain : PointDomain(birthDay == true)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()+10);
    pointDomain.setBuyNums(pointDomain.setBuyNums(pointDomain.getBuyNums()*2);
    pointDomain.setBuyMoney(pointDomain.setBuyMoney(pointDomain.getBuyMoney()*2);
    pointDomain.setBillThisMonth(pointDomain.setBillThisMonth(pointDomain.getBillThisMonth()*2);

    	$pointDomain.recordPointLog($pointDomain.getUserName(),"birthdayPoint");
    

    end

    rule billThisMonthPoint
    // 2011-01-08 - 2011-08-08每月信用卡还款3次以上,每满3笔赠送30分
    salience 99
    lock-on-active true
    date-effective “2011-01-08 23:59:59”
    date-expires “2011-08-08 23:59:59”
    when
    $pointDomain : PointDomain(billThisMonth >= 3)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()+$pointDomain.getBillThisMonth()/3*30);
    pointDomain.recordPointLog(pointDomain.recordPointLog(pointDomain.getUserName(),“billThisMonthPoint”);
    end

    rule buyMoneyPoint
    // 当月购物总金额100以上,每100元赠送10分
    salience 98
    lock-on-active true
    when
    $pointDomain : PointDomain(buyMoney >= 100)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()+ (int)$pointDomain.getBuyMoney()/100 * 10);
    pointDomain.recordPointLog(pointDomain.recordPointLog(pointDomain.getUserName(),“buyMoneyPoint”);
    end

    rule buyNumsPoint
    // 当月购物次数5次以上,每五次赠送50分
    salience 97
    lock-on-active true
    when
    $pointDomain : PointDomain(buyNums >= 5)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()+$pointDomain.getBuyNums()/5 * 50);
    pointDomain.recordPointLog(pointDomain.recordPointLog(pointDomain.getUserName(),“buyNumsPoint”);
    end

    rule allFitPoint
    // 特别的,如果全部满足了要求,则额外奖励100分
    salience 96
    lock-on-active true
    when
    $pointDomain:PointDomain(buyNums >= 5 && billThisMonth >= 3 && buyMoney >= 100)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()+ 100);
    pointDomain.recordPointLog(pointDomain.recordPointLog(pointDomain.getUserName(),“allFitPoint”);
    end

    subpoint.drl

    package com.drools.demo.point

    import com.drools.demo.point.PointDomain;

    rule subBackNumsPoint
    // 发生退货,扣减10分
    salience 10
    lock-on-active true
    when
    $pointDomain : PointDomain(backNums >= 1)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()-10);
    pointDomain.recordPointLog(pointDomain.recordPointLog(pointDomain.getUserName(),“subBackNumsPoint”);
    end

    rule subBackMondyPoint
    // 退货金额大于100,扣减100分
    salience 9
    lock-on-active true
    when
    $pointDomain : PointDomain(backMondy >= 100)
    then
    pointDomain.setPoint(pointDomain.setPoint(pointDomain.getPoint()-10);
    pointDomain.recordPointLog(pointDomain.recordPointLog(pointDomain.getUserName(),“subBackMondyPoint”);
    end

     

    测试方法:

    public static void main(String[] args) throws IOException { PointRuleEngine pointRuleEngine = new PointRuleEngineImpl(); while(true){ InputStream is = System.in; BufferedReader br = new BufferedReader(new InputStreamReader(is)); String input = br.readLine();

    		if(null != input &amp;&amp; "s".equals(input)){
    			System.out.println("初始化规则引擎...");
    			pointRuleEngine.initEngine();
    			System.out.println("初始化规则引擎结束.");
    		}else if("e".equals(input)){
    			final PointDomain pointDomain = new PointDomain();
    			pointDomain.setUserName("hello kity");
    			pointDomain.setBackMondy(100d);
    			pointDomain.setBuyMoney(500d);
    			pointDomain.setBackNums(1);
    			pointDomain.setBuyNums(5);
    			pointDomain.setBillThisMonth(5);
    			pointDomain.setBirthDay(true);
    			pointDomain.setPoint(0l);
    			
    			pointRuleEngine.executeRuleEngine(pointDomain);
    			
    			System.out.println("执行完毕BillThisMonth:"+pointDomain.getBillThisMonth());
    			System.out.println("执行完毕BuyMoney:"+pointDomain.getBuyMoney());
    			System.out.println("执行完毕BuyNums:"+pointDomain.getBuyNums());
    			
    			System.out.println("执行完毕规则引擎决定发送积分:"+pointDomain.getPoint());
    		} else if("r".equals(input)){
    			System.out.println("刷新规则文件...");
    			pointRuleEngine.refreshEnginRule();
    			System.out.println("刷新规则文件结束.");
    		}
    	}
    }</textarea></p>
    

    执行结果:

    -----------------

    增加对hello kity的类型为birthdayPoint的积分操作记录.
    增加对hello kity的类型为billThisMonthPoint的积分操作记录.
    增加对hello kity的类型为buyMoneyPoint的积分操作记录.
    增加对hello kity的类型为buyNumsPoint的积分操作记录.
    增加对hello kity的类型为allFitPoint的积分操作记录.
    增加对hello kity的类型为subBackNumsPoint的积分操作记录.
    增加对hello kity的类型为subBackMondyPoint的积分操作记录.
    执行完毕BillThisMonth:10
    执行完毕BuyMoney:1000.0
    执行完毕BuyNums:10
    执行完毕规则引擎决定发送积分:380

    展开全文
  • 文章目录1. 基本概念2....   “规则学习” (rule learning)是从训练数据中学习出一组能用于对未见示例进行判别的规则。 形式上一般为: 式子中,右边的部分称为规则体(Body),表示该条规则的前...
  • 规则引擎

    千次阅读 2018-01-02 15:42:54
    规则引擎现在很多商用软件开发本质为对于规则的一种软件化开发,对规则的实现,通过定义一个规则引擎可以更快更方便的实现标准业务下的业务流程,简化开发过程保证了绝大部分业务流程可以通过配置完成。 一、概要 ...
  • 规则引擎概述及选型

    万次阅读 2019-03-01 16:57:01
    规则引擎概述及选型
  • crontab的语法规则格式: 代表意义 分钟 小时 日期 月份 周 命令 数字范围 0~59 0~23 1~31 1~12 0~7 需要执行的命令 周的数字为 0 或 7 时,都代表“星期天”的意思。 另外,还有一些辅助的字符,大概有...
  • 总体介绍 业务进行营销活动目的是用最少的钱实现更好的营销效果,此时就需要针对营销活动的资格进行控制,其中就包括了用户身份、用户所处的环境等等一系列因素的考虑,且为了防止恶意套取营销费用和做到营销效果的...
  • jboss规则引擎

    万次阅读 2017-12-04 16:29:20
    前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5.x的一些教程,而且这些教程都是”缺...
  • 开源规则引擎 drools

    万次阅读 2018-08-06 21:30:34
    前言 在很多企业的 IT 业务系统中,经常会有大量的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改。...规则引擎是一种推理引擎,它是根据已有的事实,从规则知识库中匹配规则...
  • java 规则引擎

    万次阅读 2016-02-15 18:14:08
    最近刚刚接触JAVA的规则引擎,一般的系统而言,业务不是非常复杂,而且变化少,因此很少采用什么规则引擎,最近接触了一个规则引擎的系统,是使用BlazeSoft公司的Blaze来实现的,自己对它正在了解中,把具体的实现...
  • 规则引擎在基础软件,或者在很多系统中已经不是稀奇的玩意,最近这几年,国内不断兴起很多的规则引擎,至于什么是规则引擎,在这篇文章中,就不做介绍了,我想能看以下内容的,多少对规则引擎也都有所了解了。...
  • Java各种规则引擎

    千次阅读 2019-08-21 10:15:14
    Drools规则引擎 简介: Drools就是为了解决业务代码和业务规则分离的引擎。 Drools 规则是在 Java 应用程序上运行的,其要执行的步骤顺序由代码确定 ,为了实现这一点,Drools 规则引擎将业务规则转换成执行树。...
  • 规则引擎一:IBM规则引擎 ODM入门

    千次阅读 2016-09-01 09:57:46
    最近,因项目需要,研究使用IBM的规则引擎,但是网上相关资料甚少,只能查看IBM官网的相关文档,但大多是英文,所以学习过程相当痛苦,好在有IBM的技术支持人员帮助,在此,决定将自己对ODM的学习过程做成一个入门...
  • drools规则引擎实现动态配置规则

    万次阅读 2018-11-30 17:05:49
    先说下我的业务需求背景,最近公司要推出运营活动,根据用户行为送用户积分;比如用户注册送、首次消费送,...这两条规则是不能同时生效,但如果他们的时间是错开用户是可以针对这两条规则获取到奖励的 用户然后运...
  • 规则引擎替换代码

    千次阅读 2005-02-02 09:15:00
    作者: 何仁杰 梁冰业务规则管理系统的基本原理是:用一个或多个规则引擎替换以程序代码"固化"在应用系统中的业务逻辑。一个完善的BRMS可以对业务规则的整个生命周期实现全程管理。 业务规则的全生命周期管理如图1所...
  • 规则引擎概述

    万次阅读 多人点赞 2017-08-13 13:09:26
    我是阿里巴巴做规则引擎相关工作多年的java工程师一枚,本文只讲一些个人对“规则引擎”的看法,欢迎大家一起探讨。 1、“规则引擎”的实际用途和价值 2、“规则引擎”的一般实现方式 3、“规则引擎”发展的一些坎坷
  • 规则引擎需求

    千次阅读 2019-04-04 09:19:48
    在尝试捕捉和编码复杂业务规则时,这一点尤为明显。 业务规则有多种定义方法,但通常最好的思考方法是将其视为业务流程中的决策点。业务规则是根据 “if-then-else”类型的逻辑描述的,其中if...
  • 旗正规则引擎规则编辑指南

    千次阅读 2017-08-07 15:38:54
    看到有人问,旗正规则引擎定位就是规则逻辑实现简易,业务员也可以执行,可是试用的时候,突然发现还是有些凌乱,规则编辑感觉还是有点繁琐啊。那我说,方法还是没对路,接下来,我来献上指南。 规则包开发 通过...

空空如也

1 2 3 4 5 ... 20
收藏数 2,364,656
精华内容 945,862
关键字:

规则