public LLinkedList <LTerm> GetResultListFrom(LLinkedListNode <LTerm> node) { LLinkedList <LTerm> resultList = null; //在产生式集合中寻找与该Term匹配的产生式(相同的符号和参数个数) List <LRule> matchingProductions = m_listProductionGroup.FindAll((rule) => rule.Predecessor.Symbol.Equals(node.Value.Symbol) /*****符号相同****/ && rule.Predecessor.Params.Count == node.Value.Params.Count /*****参数个数相同*****/ ); if (matchingProductions.Count > 0) //有匹配的产生式 { float[] paramsArray = node.Value.GetParamsArrayWithFloat(); //获取参数 for (int i = 0; i < matchingProductions.Count; i++) { resultList = matchingProductions[i].GetResultList(node, paramsArray); //获取结果链表 if (resultList != null) //当返回NULL则说明该产生式的条件不符合;返回链表则说明该产生式可行 { break; } } } return(resultList); }
/// <summary> /// 采用非多线程的方式迭代 /// </summary> private void ReplaceFinalList() { LLinkedListNode <LTerm> node = m_listFinal.First; //从头节点开始 LLinkedListNode <LTerm> head = m_listFinal.First; //头节点 LLinkedList <LTerm> FinalList = new LLinkedList <LTerm>(); do { LLinkedListNode <LTerm> NodeClone = new LLinkedListNode <LTerm>(node.Value); //防止替换后原先的Node出现错误 FinalList.Add(NodeClone); if (node.Value != null) { LLinkedList <LTerm> resultList = GetResultListFrom(node); if (resultList != null) { FinalList.Replace(NodeClone, resultList); } } node = node.Next; } while (node != head); m_listFinal = FinalList; }
/// <summary> /// 当不存在公理时,添加公理。 /// </summary> /// <param name="axiom">待添加的公理</param> public void AddAxiom(LLinkedList <LTerm> axiom) { if (m_listAxiom.Count > 0) { throw new InvalidOperationException("Axiom already exists!"); //公理已经存在 } m_listAxiom = axiom; }
private int m_iCurrentStep; //当前步骤 public LSTree() { m_listGlobalVariables = new List <VariableEntry>(); m_listAxiom = new LLinkedList <LTerm>(); m_listProductionGroup = new List <LRule>(); m_listFinal = new LLinkedList <LTerm>(); m_iCurrentStep = 0; }
/// <summary> /// 添加一个链表 /// </summary> /// <param name="list">待添加的链表</param> public void Add(LLinkedList <T> list) { if (m_head == null) { AddAfter(null, list); } else { AddAfter(m_head.Previous, list); } }
//添加结果链表 public void AddResult(LLinkedList <LTerm> lstResult) { if (m_listSuccessor[m_listSuccessor.Count - 1].Result == null) //如果最后一个后续不存在结果链表,则更改其结果链表 { m_listSuccessor[m_listSuccessor.Count - 1].Result = lstResult; } else //如果最后一个后续存在结果链表,则插入一个新的后续 { m_listSuccessor.Add(new Successor(lstResult)); } }
/// <summary> /// 根据字符串获取其链表 /// </summary> /// <param name="subRule">需要解析的字符串</param> /// <returns>通过字符串解析得到的链表</returns> private static LLinkedList <LTerm> GetTermList(string subRule) { LLinkedList <LTerm> result = new LLinkedList <LTerm>(); string[] termArray = SplitTerm(subRule); //将字符串分解成各个代表Term的字符串 for (int i = 0; i < termArray.Length; i++) { result.Add(new LTerm(termArray[i])); //逐个添加到链表中 } return(result); }
/// <summary> /// 将一个节点置换成另外一个链表 /// </summary> /// <param name="node">被置换的节点</param> /// <param name="list">置换的链表</param> public void Replace(LLinkedListNode <T> node, LLinkedList <T> list) { ValidateNode(node); if (m_count == 1) { ReplaceNodeWithListInSingleNodeList(node, list); } else { ReplaceNodeWithListInMultiNodesList(node, list); } }
/// <summary> /// 往一个节点之后插入一个链表 /// </summary> /// <param name="node">在该节点之后插入</param> /// <param name="list">待插入的节点</param> private void InsertListToListAfter(LLinkedListNode <T> node, LLinkedList <T> list) { LLinkedListNode <T> listHead = list.First; LLinkedListNode <T> listEnd = list.Last; //链表头尾变化 listHead.Previous = node; listEnd.Next = node.Next; node.Next.Previous = listEnd; node.Next = listHead; m_count += list.Count; }
/// <summary> /// 在一个节点之后添加一个链表 /// </summary> /// <param name="node">在该节点之后添加</param> /// <param name="list">待添加的链表</param> public void AddAfter(LLinkedListNode <T> node, LLinkedList <T> list) { ValidateNode(node); //对列表中的节点进行检查 LLinkedList <T> tempList = list.Clone(); if (m_count == 0) { InsertListToEmptyList(tempList); } else { InsertListToListAfter(node, tempList); } }
/// <summary> /// 将当前链表克隆 /// </summary> /// <returns></returns> public LLinkedList <T> Clone() { LLinkedList <T> resultList = new LLinkedList <T>(); LLinkedListNode <T> srcNode = m_head; //源节点从该链表的头结点开始 do { LLinkedListNode <T> destNode = new LLinkedListNode <T>(srcNode.Value); //复制源节点的值,不复制其前驱和后继 resultList.Add(destNode); //插入复制后的节点 srcNode = srcNode.Next; //移动到下一个节点 } while (srcNode != m_head); //当源节点重新回归到头结点时,停止复制 return(resultList); }
/// <summary> /// 进行一次迭代,并将结果存放在FinalList里面 /// </summary> public void NextStep() { if (m_listFinal == null || m_listFinal.Count == 0) //第一步 { //m_listAxiom.CopyTo(m_listFinal); m_listFinal = m_listAxiom.Clone(); //将公理复制到最终结果链表中 return; } //第二步开始 #if _UNMT ReplaceFinalList(); #else ReplaceFinalListFast(); #endif m_iCurrentStep++; }
/// <summary> /// 在多节点的链表中将一个节点置换成另外一个链表 /// </summary> /// <param name="node">被置换的节点</param> /// <param name="list">置换的链表</param> private void ReplaceNodeWithListInMultiNodesList(LLinkedListNode <T> node, LLinkedList <T> list) { LLinkedListNode <T> listHead = list.First; //首节点 LLinkedListNode <T> listEnd = list.Last; //尾节点 listHead.Previous = node.Previous; listEnd.Next = node.Next; node.Previous.Next = listHead; node.Next.Previous = listEnd; if (m_head == node) { m_head = listHead; } m_count += (list.Count - 1); }
/// <summary> /// 采用多线程的方式快速迭代 /// </summary> private void ReplaceFinalListFast() { LLinkedListNode <LTerm> node = m_listFinal.First; //从头节点开始 LLinkedListNode <LTerm> head = m_listFinal.First; //头节点 LLinkedListNode <LTerm>[] nodes = new LLinkedListNode <LTerm> [m_listFinal.Count]; LLinkedList <LTerm>[] resultLists = new LLinkedList <LTerm> [m_listFinal.Count]; for (int i = 0; i < m_listFinal.Count; i++) { nodes[i] = new LLinkedListNode <LTerm>(node.Value); node = node.Next; } Parallel.For(0, m_listFinal.Count, i => { resultLists[i] = GetResultListFrom(nodes[i]); }); LLinkedList <LTerm> FinalList = new LLinkedList <LTerm>(); for (int i = 0; i < resultLists.Length; i++) { if (resultLists[i] == null) { FinalList.Add(nodes[i]); } else { FinalList.Add(resultLists[i]); } } m_listFinal = FinalList; }
public void AddSuccessor(LLinkedList <LTerm> lstResult) { m_listSuccessor.Add(new Successor(lstResult)); }
/// <summary> /// 在单一节点的链表中将一个节点置换成另外一个链表 /// </summary> /// <param name="node">被置换的节点</param> /// <param name="list">置换的链表</param> private void ReplaceNodeWithListInSingleNodeList(LLinkedListNode <T> node, LLinkedList <T> list) { m_head = list.First; //当前链表的头节点与置换链表的头节点相同 m_count = list.Count; //当前链表的节点数与置换链表的节点数相同 }
/// <summary> /// 往空链表(当前链表)插入一个链表 /// </summary> /// <param name="list">待插入的链表</param> private void InsertListToEmptyList(LLinkedList <T> list) { m_head = list.First; m_count = list.Count; }
/// <summary> /// 根据输入的参数输出该产生式产生的结果链表。 /// 如该产生式为 F(length)-->F(length+1)A(length),输入的参数为1,则输出的结果为F(2)A(1) /// </summary> /// <param name="node">当前的节点,用于确定其上下文</param> /// <param name="inputParams">输入的参数,用于计算,且个数一定要与前驱中的形参的个数相同</param> /// <returns>返回最终产生的结果链表</returns> public LLinkedList <LTerm> GetResultList(LLinkedListNode <LTerm> node, params float[] inputParams) { Validate(); ValidateInputParams(inputParams); List <LTerm> FinalLeftContext, FinalRightLeftContext; if (!isContextual(node, out FinalLeftContext, out FinalRightLeftContext)) //不满足上下文的条件 { return(null); } LLinkedList <LTerm> result = new LLinkedList <LTerm>(); //存储最终产生的结果 DataTable table = new DataTable(); //用于计算各参数 参考代码:https://www.cnblogs.com/luther/p/3863274.html //添加形参及公式 table.BeginLoadData(); //添加全局变量形参 List <VariableEntry> GlobalVariablesList = m_RuleDataEntry.GlobalVariablesList; //获取全局变量的链表 for (int i = 0; i < GlobalVariablesList.Count; i++) { GlobalVariablesList[i].Validate(); //验证该全局变量是否可用 table.Columns.Add(GlobalVariablesList[i].Name, typeof(float)); //添加全局变量列 } table.Columns.Add("RANDOM", typeof(float)); //添加随机变量列 //添加Mesh形参 List <Mesh> Meshs = (m_RuleDataEntry.Belong).Meshes; //获取存放所有Mesh的链表 for (int i = 0; i < Meshs.Count; i++) { table.Columns.Add(Meshs[i].Name, typeof(int)); } //添加输入参数的形参 for (int i = 0; i < m_Predecessor.Term.Params.Count; i++) { table.Columns.Add(m_Predecessor.Term.Params[i], typeof(float)); //添加形参列 } //添加上下文参数的形参 foreach (LTerm term in m_Predecessor.LeftContext) //添加左侧上下文的形参 { for (int i = 0; i < term.Params.Count; i++) { table.Columns.Add(term.Params[i], typeof(float)); } } foreach (LTerm term in m_Predecessor.RightContext) //添加右侧上下文的形参 { for (int i = 0; i < term.Params.Count; i++) { table.Columns.Add(term.Params[i], typeof(float)); } } //添加公式列 table.Columns.Add("expression", typeof(float)); table.Columns["expression"].Expression = ""; //添加实参 DataRow row = table.Rows.Add(); for (int i = 0; i < GlobalVariablesList.Count; i++) { row[GlobalVariablesList[i].Name] = GlobalVariablesList[i].Value; //添加全局变量的实参 } for (int i = 0; i < Meshs.Count; i++) { row[Meshs[i].Name] = Meshs[i].NameValue; } for (int i = 0; i < m_Predecessor.Term.Params.Count; i++) { row[m_Predecessor.Term.Params[i]] = inputParams[i]; //添加输入参数的实参 } //添加上下文的实参 for (int i = 0; i < FinalLeftContext.Count; i++) { for (int j = 0; j < FinalLeftContext[i].Params.Count; j++) { row[m_Predecessor.LeftContext[i].Params[j]] = FinalLeftContext[i].Params[j]; } } for (int i = 0; i < FinalRightLeftContext.Count; i++) { for (int j = 0; j < FinalRightLeftContext[i].Params.Count; j++) { row[m_Predecessor.RightContext[i].Params[j]] = FinalRightLeftContext[i].Params[j]; } } //判断是否满足条件 if (!MeetTheConditions(table)) { return(null); } if (m_listSuccessor.Count > 1) //有多个不同概率的后续 { //根据概率选择一个后续 m_iSuccessorIndex = RandomlySelectResultList(); } //根据选择的后续,逐个计算term,输出单一的term,并添加到结果链表中 LLinkedListNode <LTerm> srcNode = m_listSuccessor[m_iSuccessorIndex].Result.First; do { LTerm destTerm = GetResultTerm(srcNode.Value, table); //获取最终的单个term result.Add(destTerm); //插入Term srcNode = srcNode.Next; //移动到下一个节点 } while (srcNode != m_listSuccessor[m_iSuccessorIndex].Result.First); table.EndLoadData(); table.Clear(); return(result); }
public void AddSuccessor(float probability, LLinkedList <LTerm> lstResult) { m_listSuccessor.Add(new Successor(probability, lstResult)); }
public Successor(LLinkedList <LTerm> listSuccessor) { this.m_fProbability = 1.0f; this.m_listResult = listSuccessor; m_boolDefault = true; //无概率参数输入,因此为默认 }
public LRule(LTerm stTerm, string strCondition, float fProbability, LLinkedList <LTerm> lstResult) { m_Predecessor = new Predecessor(stTerm, strCondition); this.m_listSuccessor = new List <Successor>(); m_listSuccessor.Add(new Successor(fProbability, lstResult)); }
public LRule(LTerm stTerm, LLinkedList <LTerm> lstResult) { m_Predecessor = new Predecessor(stTerm); this.m_listSuccessor = new List <Successor>(); m_listSuccessor.Add(new Successor(lstResult)); }
public Successor(float?fProbability, LLinkedList <LTerm> listSuccessor) { this.m_fProbability = fProbability; this.m_listResult = listSuccessor; m_boolDefault = false; //有概率参数输入,该后续不为默认 }