簡體   English   中英

通過 pyscipopt 自定義傳播器

[英]custom propagator via pyscipopt

我正在嘗試為 SCIP 編寫自定義值傳播器。 我有一些復雜的邏輯可以檢測到附加值,只要一個或多個固定(通過分支機制),這些值也可以固定。 我有下面的代碼顯然使一切都不可行(這是不正確的)。 我的問題:

  1. 價值傳播者是否適合這樣做? 或者我應該使用約束處理程序的傳播機制(約束處理程序中沒有其他內容)?
  2. getCurrentNode 在值傳播器中工作? 我用freq = 1注冊了它。
  3. 我應該在 getVars 調用中使用transformed=True 嗎? 我的 check_constraints 函數是使用原始(未轉換)變量構建的。 我想我可以通過刪除名稱中的“t_”來關聯它們,但是原始變量在這種情況下是否同樣有效?
  4. getVars 甚至是特定於節點的嗎? 有沒有更好的方法來獲取已作為預求解器和分支的一部分修復的變量?
    class MyPropagator(scip.Prop):
        def propexec(self, proptiming):
            vars = self.model.getVars(transformed=False)
            hit_some = False
            node = self.model.getCurrentNode()
            for var in vars:
                if self.model.isFeasEQ(var.getLbLocal(), var.getUbLocal()):  # is fixed in subtree?
                    impossible, wants_fix = self.check_constraints(var.name)
                    if impossible:
                        return {"result": scip.scip.PY_SCIP_RESULT.CUTOFF}
                    for key_var, value in wants_fix:  # fix each of these in the subtree
                        self.model.chgVarLbNode(node, key_var, value)
                        self.model.chgVarUbNode(node, key_var, value)
                        hit_some = True
    
            if hit_some:
                return {"result": scip.scip.PY_SCIP_RESULT.REDUCEDDOM}
            return {"result": scip.scip.PY_SCIP_RESULT.DIDNOTFIND}
  1. 是的,不需要為此使用約束處理程序
  2. 它有效,但您不需要它。 您應該使用chgVarLb而不是chgVarLbNoode 它將自動將綁定更改正確地添加為當前節點的本地更改。
  3. 您應該使用轉換后的變量在樹內進行所有操作。 使用原始的可能沒有錯,但效率很低。 (SCIP 無論如何都會在你做的所有事情中改變它們,因為你在這里處於解決階段)
  4. getVars很好,只要你使用轉換后的。

暫無
暫無

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

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