Пример #1
0
    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);
    }
Пример #2
0
    /// <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;
    }
Пример #3
0
 /// <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;
 }
Пример #4
0
    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;
    }
Пример #5
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);
     }
 }
Пример #6
0
 //添加结果链表
 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));
     }
 }
Пример #7
0
    /// <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);
    }
Пример #8
0
    /// <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);
        }
    }
Пример #9
0
    /// <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;
    }
Пример #10
0
    /// <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);
        }
    }
Пример #11
0
    /// <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);
    }
Пример #12
0
    /// <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++;
    }
Пример #13
0
    /// <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);
    }
Пример #14
0
    /// <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;
    }
Пример #15
0
 public void AddSuccessor(LLinkedList <LTerm> lstResult)
 {
     m_listSuccessor.Add(new Successor(lstResult));
 }
Пример #16
0
    /// <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;   //当前链表的节点数与置换链表的节点数相同
    }
Пример #17
0
 /// <summary>
 /// 往空链表(当前链表)插入一个链表
 /// </summary>
 /// <param name="list">待插入的链表</param>
 private void InsertListToEmptyList(LLinkedList <T> list)
 {
     m_head  = list.First;
     m_count = list.Count;
 }
Пример #18
0
    /// <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);
    }
Пример #19
0
 public void AddSuccessor(float probability, LLinkedList <LTerm> lstResult)
 {
     m_listSuccessor.Add(new Successor(probability, lstResult));
 }
Пример #20
0
 public Successor(LLinkedList <LTerm> listSuccessor)
 {
     this.m_fProbability = 1.0f;
     this.m_listResult   = listSuccessor;
     m_boolDefault       = true; //无概率参数输入,因此为默认
 }
Пример #21
0
 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));
 }
Пример #22
0
 public LRule(LTerm stTerm, LLinkedList <LTerm> lstResult)
 {
     m_Predecessor        = new Predecessor(stTerm);
     this.m_listSuccessor = new List <Successor>();
     m_listSuccessor.Add(new Successor(lstResult));
 }
Пример #23
0
 public Successor(float?fProbability, LLinkedList <LTerm> listSuccessor)
 {
     this.m_fProbability = fProbability;
     this.m_listResult   = listSuccessor;
     m_boolDefault       = false; //有概率参数输入,该后续不为默认
 }