2009-09-09 46 views
2

我有以下簡單的問題,我想使用與[MS求解基金會]實驗[1]:微軟求解基礎服務聲明語法

我有10個插槽,我需要填寫在整數〜5的範圍1欲執行只有兩個限制:

  • 時隙[N] =時隙[N + 1]
  • 的所有時隙的總和應大於20

我可以簡單地創建了以下決定:

Decision s1 = new Decision(Domain.IntegerRange(1, 5), "slot1"); 
Decision s2 = new Decision(Domain.IntegerRange(1, 5), "slot2"); 
Decision s3 = new Decision(Domain.IntegerRange(1, 5), "slot3"); 
Decision s4 = new Decision(Domain.IntegerRange(1, 5), "slot4"); 
Decision s5 = new Decision(Domain.IntegerRange(1, 5), "slot5"); 
Decision s6 = new Decision(Domain.IntegerRange(1, 5), "slot6"); 
Decision s7 = new Decision(Domain.IntegerRange(1, 5), "slot7"); 
Decision s8 = new Decision(Domain.IntegerRange(1, 5), "slot8"); 
Decision s9 = new Decision(Domain.IntegerRange(1, 5), "slot9"); 
Decision s10 = new Decision(Domain.IntegerRange(1, 5), "slot10"); 

然後設置手動約束在

model.AddConstraints("neighbors not equal", 
       s1 != s2, s2 != s3, s3 != s4, s4 != s5, 
       s5 != s6, s6 != s7, s7!= s8, s8 != s9, s9 != s10 
       ); 

model.AddConstraint("sum", 
       s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 > 20); 

不過,我有想象,有一個更好的方式來做到這一點 - 希望的東西更像聲明式句法。

回答

2

的代碼。

SolverContext context = SolverContext.GetContext(); 
Model model = context.CreateModel(); 

Decision[] slot = new Decision[10]; 

for (int i = 0; i < slot.Length; i++) 
{ 
    slot[i] = new Decision(Domain.IntegerRange(1, 5), "slot" + i.ToString()); 
    model.AddDecision(slot[i]); 
    if (i > 0) model.AddConstraint("neighbors not equal", slot[i-1] != slot[i]); 
} 

model.AddConstraint("sum", Model.Sum(slot) > 20); 

Solution solution = context.Solve();