2009-09-09 5 views
2

J'ai le problème simple suivant que je voudrais utiliser pour expérimenter avec [MS Foundation Solver] [1]:Microsoft Solver Foundation Services de syntaxe déclarative

J'ai 10 emplacements que je dois remplir avec des nombres entiers la plage de 1 à 5. Je veux appliquer seulement deux contraintes:

    sous
  • [n] = fente [n + 1]
  • la somme de tous les logements devraient être plus de 20

Je pourrais il suffit de créer les décisions suivantes:

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"); 

Et puis des contraintes de configuration manuellement comme dans

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); 

Cependant, je dois imaginer qu'il ya une meilleure façon de le faire - je l'espère en quelque chose de plus proche de déclarative syntaxe.

Répondre

2

Le code.

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(); 
Questions connexes