4.5. DMN 模型示例
以下是一个实际的 DMN 模型示例,它演示了如何使用决策建模,根据输入数据、情况和公司指南来获得决策。在这种情况下,一个从 San Diego 到 New York 的航班被取消,需要受影响的航空公司为其不便见的乘客找到备选安排。
首先,桥接将收集必要的信息,以确定从差到其目的地的最佳方法:
- 输入数据
- flights 列表
- 乘客列表
- 决策
- 排列新班上的乘客的乘客
- 确定将提供哪些乘客
- 商业知识模型
- 决定乘客优先级的公司进程
- 任何有可用空间的机
- 用于确定如何分配不便传递传递者的公司规则
然后,在以下决策要求图(DRD)以确定最佳重新预订解决方案时,使用 DMN 标准对决策流程建模:
图 4.19. 用于飞行的 DRD

与流图类似,DRD 使用形成表示进程中的不同元素。OVAL 包含两个必要输入数据,rerectangles 包含模型中的决策点,通过调控基(业务知识模型)包含可重复调用的可重复使用的逻辑。
每个元素的 DRD draws 逻辑来自 box 表达式,使用 FEEL 表达式或数据类型值提供变量定义。
某些已选箱的表达式是基本的,例如建立优先级等待列表的以下决策:
图 4.20. 框式上下文表达式示例显示优先级等待列表

某些方框的表达式比更详细的和计算更为复杂,例如以下商业知识模型用于重新分配下一个延迟乘客:
图 4.21. 用于乘客重新分配的 boxed 功能表达式

以下是这个决策模型的 DMN 源文件:
<dmn:definitions xmlns="https://www.drools.org/kie-dmn/Flight-rebooking" xmlns:dmn="http://www.omg.org/spec/DMN/20151101/dmn.xsd" xmlns:feel="http://www.omg.org/spec/FEEL/20140401" id="_0019_flight_rebooking" name="0019-flight-rebooking" namespace="https://www.drools.org/kie-dmn/Flight-rebooking"> <dmn:itemDefinition id="_tFlight" name="tFlight"> <dmn:itemComponent id="_tFlight_Flight" name="Flight Number"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tFlight_From" name="From"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tFlight_To" name="To"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tFlight_Dep" name="Departure"> <dmn:typeRef>feel:dateTime</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tFlight_Arr" name="Arrival"> <dmn:typeRef>feel:dateTime</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tFlight_Capacity" name="Capacity"> <dmn:typeRef>feel:number</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tFlight_Status" name="Status"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> </dmn:itemDefinition> <dmn:itemDefinition id="_tFlightTable" isCollection="true" name="tFlightTable"> <dmn:typeRef>tFlight</dmn:typeRef> </dmn:itemDefinition> <dmn:itemDefinition id="_tPassenger" name="tPassenger"> <dmn:itemComponent id="_tPassenger_Name" name="Name"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tPassenger_Status" name="Status"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tPassenger_Miles" name="Miles"> <dmn:typeRef>feel:number</dmn:typeRef> </dmn:itemComponent> <dmn:itemComponent id="_tPassenger_Flight" name="Flight Number"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemComponent> </dmn:itemDefinition> <dmn:itemDefinition id="_tPassengerTable" isCollection="true" name="tPassengerTable"> <dmn:typeRef>tPassenger</dmn:typeRef> </dmn:itemDefinition> <dmn:itemDefinition id="_tFlightNumberList" isCollection="true" name="tFlightNumberList"> <dmn:typeRef>feel:string</dmn:typeRef> </dmn:itemDefinition> <dmn:inputData id="i_Flight_List" name="Flight List"> <dmn:variable name="Flight List" typeRef="tFlightTable"/> </dmn:inputData> <dmn:inputData id="i_Passenger_List" name="Passenger List"> <dmn:variable name="Passenger List" typeRef="tPassengerTable"/> </dmn:inputData> <dmn:decision name="Prioritized Waiting List" id="d_PrioritizedWaitingList"> <dmn:variable name="Prioritized Waiting List" typeRef="tPassengerTable"/> <dmn:informationRequirement> <dmn:requiredInput href="#i_Passenger_List"/> </dmn:informationRequirement> <dmn:informationRequirement> <dmn:requiredInput href="#i_Flight_List"/> </dmn:informationRequirement> <dmn:knowledgeRequirement> <dmn:requiredKnowledge href="#b_PassengerPriority"/> </dmn:knowledgeRequirement> <dmn:context> <dmn:contextEntry> <dmn:variable name="Cancelled Flights" typeRef="tFlightNumberList"/> <dmn:literalExpression> <dmn:text>Flight List[ Status = "cancelled" ].Flight Number</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Waiting List" typeRef="tPassengerTable"/> <dmn:literalExpression> <dmn:text>Passenger List[ list contains( Cancelled Flights, Flight Number ) ]</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:literalExpression> <dmn:text>sort( Waiting List, passenger priority )</dmn:text> </dmn:literalExpression> </dmn:contextEntry> </dmn:context> </dmn:decision> <dmn:decision name="Rebooked Passengers" id="d_RebookedPassengers"> <dmn:variable name="Rebooked Passengers" typeRef="tPassengerTable"/> <dmn:informationRequirement> <dmn:requiredDecision href="#d_PrioritizedWaitingList"/> </dmn:informationRequirement> <dmn:informationRequirement> <dmn:requiredInput href="#i_Flight_List"/> </dmn:informationRequirement> <dmn:knowledgeRequirement> <dmn:requiredKnowledge href="#b_ReassignNextPassenger"/> </dmn:knowledgeRequirement> <dmn:invocation> <dmn:literalExpression> <dmn:text>reassign next passenger</dmn:text> </dmn:literalExpression> <dmn:binding> <dmn:parameter name="Waiting List"/> <dmn:literalExpression> <dmn:text>Prioritized Waiting List</dmn:text> </dmn:literalExpression> </dmn:binding> <dmn:binding> <dmn:parameter name="Reassigned Passengers List"/> <dmn:literalExpression> <dmn:text>[]</dmn:text> </dmn:literalExpression> </dmn:binding> <dmn:binding> <dmn:parameter name="Flights"/> <dmn:literalExpression> <dmn:text>Flight List</dmn:text> </dmn:literalExpression> </dmn:binding> </dmn:invocation> </dmn:decision> <dmn:businessKnowledgeModel id="b_PassengerPriority" name="passenger priority"> <dmn:encapsulatedLogic> <dmn:formalParameter name="Passenger1" typeRef="tPassenger"/> <dmn:formalParameter name="Passenger2" typeRef="tPassenger"/> <dmn:decisionTable hitPolicy="UNIQUE"> <dmn:input id="b_Passenger_Priority_dt_i_P1_Status" label="Passenger1.Status"> <dmn:inputExpression typeRef="feel:string"> <dmn:text>Passenger1.Status</dmn:text> </dmn:inputExpression> <dmn:inputValues> <dmn:text>"gold", "silver", "bronze"</dmn:text> </dmn:inputValues> </dmn:input> <dmn:input id="b_Passenger_Priority_dt_i_P2_Status" label="Passenger2.Status"> <dmn:inputExpression typeRef="feel:string"> <dmn:text>Passenger2.Status</dmn:text> </dmn:inputExpression> <dmn:inputValues> <dmn:text>"gold", "silver", "bronze"</dmn:text> </dmn:inputValues> </dmn:input> <dmn:input id="b_Passenger_Priority_dt_i_P1_Miles" label="Passenger1.Miles"> <dmn:inputExpression typeRef="feel:string"> <dmn:text>Passenger1.Miles</dmn:text> </dmn:inputExpression> </dmn:input> <dmn:output id="b_Status_Priority_dt_o" label="Passenger1 has priority"> <dmn:outputValues> <dmn:text>true, false</dmn:text> </dmn:outputValues> <dmn:defaultOutputEntry> <dmn:text>false</dmn:text> </dmn:defaultOutputEntry> </dmn:output> <dmn:rule id="b_Passenger_Priority_dt_r1"> <dmn:inputEntry id="b_Passenger_Priority_dt_r1_i1"> <dmn:text>"gold"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r1_i2"> <dmn:text>"gold"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r1_i3"> <dmn:text>>= Passenger2.Miles</dmn:text> </dmn:inputEntry> <dmn:outputEntry id="b_Passenger_Priority_dt_r1_o1"> <dmn:text>true</dmn:text> </dmn:outputEntry> </dmn:rule> <dmn:rule id="b_Passenger_Priority_dt_r2"> <dmn:inputEntry id="b_Passenger_Priority_dt_r2_i1"> <dmn:text>"gold"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r2_i2"> <dmn:text>"silver","bronze"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r2_i3"> <dmn:text>-</dmn:text> </dmn:inputEntry> <dmn:outputEntry id="b_Passenger_Priority_dt_r2_o1"> <dmn:text>true</dmn:text> </dmn:outputEntry> </dmn:rule> <dmn:rule id="b_Passenger_Priority_dt_r3"> <dmn:inputEntry id="b_Passenger_Priority_dt_r3_i1"> <dmn:text>"silver"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r3_i2"> <dmn:text>"silver"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r3_i3"> <dmn:text>>= Passenger2.Miles</dmn:text> </dmn:inputEntry> <dmn:outputEntry id="b_Passenger_Priority_dt_r3_o1"> <dmn:text>true</dmn:text> </dmn:outputEntry> </dmn:rule> <dmn:rule id="b_Passenger_Priority_dt_r4"> <dmn:inputEntry id="b_Passenger_Priority_dt_r4_i1"> <dmn:text>"silver"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r4_i2"> <dmn:text>"bronze"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r4_i3"> <dmn:text>-</dmn:text> </dmn:inputEntry> <dmn:outputEntry id="b_Passenger_Priority_dt_r4_o1"> <dmn:text>true</dmn:text> </dmn:outputEntry> </dmn:rule> <dmn:rule id="b_Passenger_Priority_dt_r5"> <dmn:inputEntry id="b_Passenger_Priority_dt_r5_i1"> <dmn:text>"bronze"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r5_i2"> <dmn:text>"bronze"</dmn:text> </dmn:inputEntry> <dmn:inputEntry id="b_Passenger_Priority_dt_r5_i3"> <dmn:text>>= Passenger2.Miles</dmn:text> </dmn:inputEntry> <dmn:outputEntry id="b_Passenger_Priority_dt_r5_o1"> <dmn:text>true</dmn:text> </dmn:outputEntry> </dmn:rule> </dmn:decisionTable> </dmn:encapsulatedLogic> <dmn:variable name="passenger priority" typeRef="feel:boolean"/> </dmn:businessKnowledgeModel> <dmn:businessKnowledgeModel id="b_ReassignNextPassenger" name="reassign next passenger"> <dmn:encapsulatedLogic> <dmn:formalParameter name="Waiting List" typeRef="tPassengerTable"/> <dmn:formalParameter name="Reassigned Passengers List" typeRef="tPassengerTable"/> <dmn:formalParameter name="Flights" typeRef="tFlightTable"/> <dmn:context> <dmn:contextEntry> <dmn:variable name="Next Passenger" typeRef="tPassenger"/> <dmn:literalExpression> <dmn:text>Waiting List[1]</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Original Flight" typeRef="tFlight"/> <dmn:literalExpression> <dmn:text>Flights[ Flight Number = Next Passenger.Flight Number ][1]</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Best Alternate Flight" typeRef="tFlight"/> <dmn:literalExpression> <dmn:text>Flights[ From = Original Flight.From and To = Original Flight.To and Departure > Original Flight.Departure and Status = "scheduled" and has capacity( item, Reassigned Passengers List ) ][1]</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Reassigned Passenger" typeRef="tPassenger"/> <dmn:context> <dmn:contextEntry> <dmn:variable name="Name" typeRef="feel:string"/> <dmn:literalExpression> <dmn:text>Next Passenger.Name</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Status" typeRef="feel:string"/> <dmn:literalExpression> <dmn:text>Next Passenger.Status</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Miles" typeRef="feel:number"/> <dmn:literalExpression> <dmn:text>Next Passenger.Miles</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Flight Number" typeRef="feel:string"/> <dmn:literalExpression> <dmn:text>Best Alternate Flight.Flight Number</dmn:text> </dmn:literalExpression> </dmn:contextEntry> </dmn:context> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Remaining Waiting List" typeRef="tPassengerTable"/> <dmn:literalExpression> <dmn:text>remove( Waiting List, 1 )</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:variable name="Updated Reassigned Passengers List" typeRef="tPassengerTable"/> <dmn:literalExpression> <dmn:text>append( Reassigned Passengers List, Reassigned Passenger )</dmn:text> </dmn:literalExpression> </dmn:contextEntry> <dmn:contextEntry> <dmn:literalExpression> <dmn:text>if count( Remaining Waiting List ) > 0 then reassign next passenger( Remaining Waiting List, Updated Reassigned Passengers List, Flights ) else Updated Reassigned Passengers List</dmn:text> </dmn:literalExpression> </dmn:contextEntry> </dmn:context> </dmn:encapsulatedLogic> <dmn:variable name="reassign next passenger" typeRef="tPassengerTable"/> <dmn:knowledgeRequirement> <dmn:requiredKnowledge href="#b_HasCapacity"/> </dmn:knowledgeRequirement> </dmn:businessKnowledgeModel> <dmn:businessKnowledgeModel id="b_HasCapacity" name="has capacity"> <dmn:encapsulatedLogic> <dmn:formalParameter name="flight" typeRef="tFlight"/> <dmn:formalParameter name="rebooked list" typeRef="tPassengerTable"/> <dmn:literalExpression> <dmn:text>flight.Capacity > count( rebooked list[ Flight Number = flight.Flight Number ] )</dmn:text> </dmn:literalExpression> </dmn:encapsulatedLogic> <dmn:variable name="has capacity" typeRef="feel:boolean"/> </dmn:businessKnowledgeModel> </dmn:definitions>