微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OR-Tools Maximize 产生不同的结果

如何解决OR-Tools Maximize 产生不同的结果

我想了解最大化目标的行为。这个简单的示例旨在填充受各种约束的矩阵。目前的限制是每个值要么是 1,要么是 5。

public static void SolverStudy()
{
    Solver solver = new Solver("solver");
    int cols = 2;
    int rows = 4;

    Intvar[,] codes = solver.MakeIntvarMatrix(rows,cols,Enumerable.Range(0,12).ToArray(),"codes");
    Intvar[] codes_flat = codes.Flatten();

    for (int r = 0; r < rows; r++)
    {
        for (int c = 0; c < cols; c++)
        {
            Constraint ca = solver.MakeEquality(codes[r,c],1);
            Constraint cb = solver.MakeEquality(codes[r,5);

           solver.Add(solver.MakeMax(ca,cb) == 1); // item is either 1 or 5
        }
    }

    Intvar total_cost = (from r in Enumerable.Range(0,rows) from c in Enumerable.Range(0,cols) select (codes[r,c])).ToArray().Sum().Var();
    OptimizeVar objective = total_cost.Maximize(1);
    DecisionBuilder db = solver.MakePhase(codes_flat,Solver.INT_VAR_DEFAULT,Solver.INT_VALUE_DEFAULT);
    solver.NewSearch(db,objective);

    while (solver.NextSolution())
    {
        for (int r = 0; r < rows; r++)
        {
           for (int c = 0; c < cols; c++)
               Console.Write(codes[r,c].Value());

           Console.WriteLine("");
        }

        Console.WriteLine("---");
    }
}

由于目标是最大化 codes 矩阵中所有项目的总和(通过 total_cost),我希望有一个解决方案,所有项目都设置为 5,但是,9 个解决方案是产生,第一个全是 1,最后一个全是 5,以及 1、5 的各种组合在其余解的行中。我错过了什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。