![](/img/trans.png)
[英]Microsoft Solver Foundation UnsolvableModelException
[英]Solver foundation, strange behaviour
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SolverFoundation.Services;
namespace Test
{
class Program
{
static void Main(string[] args)
{
var context= SolverContext.GetContext();
var model = context.CreateModel();
var index = new Set(Domain.IntegerRange(0, 6), "index");
var x = new Decision(Domain.IntegerRange(0, 5), "x", index);
model.AddDecision(x);
// When I uncomment the following line, values ends
// up with only 3 elements instead of 7 as expected
// model.AddConstraint("constraint", x[0] + x[1] + x[2] == 2);
model.AddGoal("objective", GoalKind.Minimize, Model.Sum(Model.ForEach(index, i => Model.Power(x[i] - 2, 2))));
context.Solve();
var values = x.GetValues().ToArray();
}
}
}
如果我按原样运行此代码,Solver Foundation会正确计算出七个等于2的值。
当取消注释model.AddConstraint("constraint", x[0] + x[1] + x[2] == 2)
时,最后的值仅包含三个值:0、1和1。为什么不包含包含剩余值?
这是怎么回事?
当我使用主动约束运行示例时,它会给出0+1+1
作为解决方案,并省略x[3] .. x[6]
。 这看起来像个错误。 所有这些都应具有值2
。
添加以下行以显示结果:
foreach (object[] value in values)
{
Console.WriteLine("x[{0}] = {1}", value[1], value[0]);
}
也许, 内森·布里克修斯 ( Nathan Brixius)的博客可能会提供一些见解。
添加以下虚拟约束后,我又获得了完整的变量集:
model.AddConstraint("constraint2", (x[3] + x[4] + x[5] + x[6]) < 999);
或者 ,您可以转向MiniZinc并使用一个像这样的简单模型:
set of int: ix = 0..6;
array[ix] of var 0..5: x;
constraint
x[0] + x[1] + x[2] == 2;
solve minimize sum(i in ix)((x[i] - 2)*(x[i] - 2));
output
["\nx[" ++ show(i) ++ "] = " ++ show(x[i]) | i in ix] ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.