【问题标题】:Get number of attached constraints on a variable in MiniZinc获取 MiniZinc 中变量的附加约束数
【发布时间】:2022-01-17 17:28:24
【问题描述】:

我的 Minizinc 程序中有两组变量。第一组中的每个变量都必然有几个约束,但第二组中的变量仅通过它们与第一组中的变量的交互而受到隐式约束。这意味着第二组中的每个变量都可能有 0 到 ~8 个约束,具体取决于第一组中的变量所取的值。

我看到有一种方法可以通过 dom_w_deg 搜索注释在搜索时引用放置在变量上的约束数量,但我想知道是否有任何方法可以在运行时访问此信息?我想这样做是因为我想指定与已放置在变量上的约束数量相关的其他约束。

我意识到这是一个奇怪的问题,而且我可能以错误的方式处理整个事情,但我一直在努力解决这个问题一段时间,所以我想问一下。

【问题讨论】:

    标签: optimization constraint-programming minizinc discrete-optimization


    【解决方案1】:

    作为一般规则,我认为您正在错误地处理您的问题。我可以识别出导致这种情况的方法中有几个误解:

    • 不同的求解器后端对模型及其求解方式可能非常不同
    • “约束”对于求解器来说不是一个有意义的概念。单个约束可能是后端求解器中的多个传播器、单个传播器,甚至只是覆盖多个约束的传播器的一部分(假设它是基于传播器的后端)。
    • 约束模型具有单调行为,因此您无法根据与变量相关的约束数量以明确且有意义的方式更改模型。
    • 鉴于约束映射到单个传播器,它可能仍然具有非常不同的传播强度,这意味着它可能在求解过程的早期或非常晚期完成。

    在不知道您实际尝试实现什么的情况下,作为一种通用技术,您可能对使用具体化感兴趣,其中约束的真实性反映在二进制布尔变量上。一般来说,尽可能少地进行具体化是一种很好的做法,因为它不会传播太多,但有时是需要的。

    作为使用具体化的一个非常简单的示例,这是一个(可能不是很好)模型,它试图最大化满足的约束数量。

    set of int: Domain = 1..10;
    var Domain: x;
    var Domain: y;
    var Domain: z;
    array[1..3] of var bool: holds;
    constraint holds[1] <-> x < y;
    constraint holds[2] <-> y < z;
    constraint holds[3] <-> z < x;
    var int: goal;
    constraint goal = sum(holds);
    solve maximize goal;
    

    【讨论】:

    • 哦,哇,这是一个非常酷的技巧,谢谢。你是对的,我解决问题的一般方式可能是错误的。我打算以一种有目的的迂回方式来处理它,因为直接方式需要引入大量额外的变量和约束,这会大大减慢程序的速度。
    • 我认为您需要考虑您描述的方法不是不起作用的优化,它实际上没有任何定义的含义。写一个关于你的实际问题以及如何建模的问题可能会更好。
    • 是的,我同意向专家寻求有关如何执行优化的提示是更好的策略,我会这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多