繁体   English   中英

解决基础,行为异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM