如何在tools 1-D数组(python或tools)中找到大于0的最小值

如何在tools 1-D数组(python或tools)中找到大于0的最小值,python,or-tools,Python,Or Tools,我有一个或tools的1-D整数数组,这个数组的值是不确定的,我想找到大于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)

我有一个或tools的1-D整数数组,这个数组的值是不确定的,我想找到大于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))

为什么不扫描整数列表并记住最小的非负整数呢

根据您的描述,简单线性算法不需要NP难解算器

如果数组x是整数变量数组。如果M是最大值, 创建域为[1..M+1]的变量的第二个并行数组y

对于每个变量席,将它与彝联系起来,用下面的代码:

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数组的最小值。

做你不使用计算机时会做的事情。嗨,@jsotola,对不起,我的英语,我的意思是我有一个或工具1-D整数数组,这个数组的值是不确定的,我想找出大于0的最小值。嗨,@Laurent Perron,对不起,我的英语,我的意思是我有一个1-D整数数组,这个数组的值是不确定的,我想找出大于0的最小值。