簡體   English   中英

如何在 or-tools 一維數組(python,or-tools)中找到大於 0 的最小值

[英]How to find the smallest value greater than 0 in a or-tools 1-D array (python , or-tools )

我有一個or-tools的一維integer數組,這個數組的值不確定,想找一個大於0的最小值,比如[2,0,3,5,0,6,8,9]我想找到最小值 2 我該怎么做?

from ortools.sat.python import cp_model
model = cp_model.CpModel()
solver = cp_model.CpSolver()


work={}

for i in range(8):
    work[i]=model.NewIntVar(0, 9, "work(%i)" % (i))

model.Add(work[0]==2)
model.Add(work[1]==0)
model.Add(work[2]==3)
model.Add(work[3]==5)
model.Add(work[4]==0)
model.Add(work[5]==6)
model.Add(work[6]==8)
model.Add(work[7]==9)


min_value = model.NewIntVar(0, 9, "")

#this code only found 0, but did not find the 2 I wanted
model.AddMinEquality(min_value, [work[i] for i in range(8)])

status = solver.Solve(model)
print("status:",status)  

print("min value:",solver.Value(min_value))

為什么不直接掃描整數列表並記住最小的非負數 integer。

根據您的描述,簡單的線性算法不需要 NP-hard 求解器。

如果您的數組 x 是 integer 變量的數組。 假設 M 是最大值,則創建第二個變量的並行數組 y,其域 [1..M + 1]

對於每個變量 xi,使用以下代碼將其鏈接到 yi:

lit = model.NewBoolVar('')
model.Add(xi > 0).OnlyEnforceIf(lit)
model.Add(xi == 0).OnlyEnforceIf(lit.Not())
model.Add(yi == xi).OnlyEnforceIf(lit)
model.Add(yi == M + 1).OnlyEnforceIf(lit.Not())

那么你想要的是 y 數組的最小值。

暫無
暫無

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

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