2010-02-09 126 views
0

我想用流利NHibernate來建模Markov chain。它基本上是一組不同狀態之間的轉換概率。流利NHibernate:模型馬爾可夫鏈

我想將轉換概率映射爲MarkovState.TransitionProbabilities作爲Dictionary。我想用下一個狀態作爲密鑰(使用MarkovState或INT爲重點),讓我可以像查詢:

float probability = currentState.TransitionProbabilities[nextState.Id].Probability; 

我的數據庫模型:

CREATE TABLE MarkovState 
(
    Id int IDENTITY(1,1) NOT NULL, 
    StateContent varchar(10) NOT NULL 
); 

CREATE TABLE TransitionProbability 
(  
    Id int IDENTITY(1,1) NOT NULL, 
    CurrentState_Id int NOT NULL, 
    NextState_Id int NOT NULL, 
    Probability float NOT NULL 
); 

我的類:

public class MarkovState 
{ 
    public virtual int Id { get; private set; } 
    public virtual string StateContent { get; set; } 
    public virtual IDictionary<int, TransitionProbability> TransitionProbabilities { get; set; } 
} 

public class TransitionProbability 
{ 
    public virtual int Id { get; private set; } 
    public virtual MarkovState CurrentState { get; set; } 
    public virtual MarkovState NextState { get; set; } 
    public virtual float Probability { get; set; } 
} 

我的地圖:

class MarkovStateMap : ClassMap<MarkovState> 
{ 
    public MarkovStateMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.StateContent); 
     HasMany<TransitionProbability>(x => x.TransitionProbabilities) 
      .AsMap(x => x.NextState.Id) 
      .KeyColumn("CurrentState_Id") 
      .Not.LazyLoad() 
      .Inverse();    
    } 
} 

class TransitionProbabilityMap : ClassMap<TransitionProbability> 
{ 
    public TransitionProbabilityMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Probability); 
     References(x => x.CurrentState); 
     References(x => x.NextState); 
    } 
} 

但是,此映射似乎使用CurrentState作爲關鍵字,而不是NextState。我甚至不知道這種模式是否可行。如果您認爲此模型無效,請提出替代方案。

+0

我不禁想你應該保存這是一個簡單的矩陣,並使用專爲這些類型的數學問題(例如Math.NET)工具。 – Tristan 2010-02-10 19:02:52

+0

@Tristan:借調,除非有充分的理由使用數據庫。 @Francois Botha:你爲什麼要使用數據庫?你的數據來自哪裏? – 2010-06-30 23:20:59

+0

轉換概率將由管理員用戶(精算師)管理,因此我們將其存儲在數據庫中。州的數量也可能發生變化,儘管這種情況不會經常發生。 – 2010-07-06 08:44:07

回答

1

也許我誤解了這個問題,但是你的HasMany映射指向CurrentState_Id。我覺得你的映射看起來應該像:

class MarkovStateMap : ClassMap<MarkovState> 
{ 
    public MarkovStateMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.StateContent); 
     HasMany<TransitionProbability>(x => x.TransitionProbabilities) 
      .AsMap(x => x.NextState.Id) 
      .KeyColumn("NextState_Id") 
      .Not.LazyLoad() 
      .Inverse();    
    } 
} 

class TransitionProbabilityMap : ClassMap<TransitionProbability> 
{ 
    public TransitionProbabilityMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Probability); 
     References(x => x.CurrentState, "Id"); 
     References(x => x.NextState, "Id"); 
    } 
} 
+0

謝謝。但最後我放棄了地圖,並與一名正常的IList一起前往。 – 2010-07-06 08:51:44