簡體   English   中英

獲取 MiniZinc 中變量的附加約束數

[英]Get number of attached constraints on a variable in MiniZinc

我的 Minizinc 程序中有兩組變量。 第一組中的每個變量都必然有幾個約束,但第二組中的變量僅通過它們與第一組中的變量的交互而受到隱式約束。 這意味着第二組中的每個變量可能具有從 0 到 ~8 的任何約束,具體取決於第一組中的變量所取的值。

我看到有一種方法可以通過dom_w_deg搜索注釋在搜索時引用放置在變量上的約束數量,但我想知道是否有任何方法可以在運行時訪問這些信息? 我想這樣做是因為我想指定與已經放置在變量上的約束數量相關的附加約束。

我意識到這是一個奇怪的問題,我可能以錯誤的方式處理整個事情,但我一直在努力解決這個問題一段時間,所以我想我會問。

作為一般規則,我認為您正在錯誤地處理您的問題。 我可以識別出導致這種情況的方法中有幾個誤解:

  • 不同的求解器后端對 model 及其解決方式可能會做非常不同的事情
  • “約束”對於求解器來說不是一個有意義的概念。 單個約束可能是后端求解器中的多個傳播器,單個傳播器,甚至只是覆蓋多個約束的傳播器的一部分(假設它是基於傳播器的后端)。
  • 約束模型具有單調行為,因此您無法根據連接到變量的約束數量以明確且有意義的方式更改 model。
  • 鑒於約束映射到單個傳播器,它可能仍然具有非常不同的傳播強度,這意味着它可能在求解過程的早期或非常晚期完成。

在不知道您實際嘗試實現什么的情況下,作為一種通用技術,您可能對使用具體化感興趣,其中約束的真實性反映到二進制 Boolean 變量上。 一般來說,最好的做法是盡可能少地進行具體化,因為它不會傳播太多,但有時需要它。

作為使用具體化的一個非常簡單的示例,這是一個(可能不是很好)model,它試圖最大化滿足的約束數量。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM