如何最小化列总和的最大值?

时间:2019-02-13 21:31:26

标签: z3 z3py

我要解决的问题很简单(我想是:)),但是因为我不熟悉z3,所以总是会遇到编译错误。

我的问题:

[ [var_0_1, var_0_2, var_0_3,...]
, [var_1_1, var_1_2, var_1_3,...]
, [var_2_1, var_2_2, var_2_3,...]
]

我的目标是对各列的值求和,然后发现所有总和的最大值,然后将其最小化,然后再次进行该操作,直到不可能再使所有各列的总和的最大值最小化为止。

我希望你能理解我的问题,因为我的英语不太好:)

谢谢!

2 个答案:

答案 0 :(得分:2)

起初,我认为您正在尝试解决一些minmax()问题,因为您表示要解决

  

minimize(max(sum(var01,Var11,Var21),sum(var02,Var12,Var22), etc...))

在评论中。但是,进一步的需求启发明确表明它不可能是minmax()的实例,所以我放弃了这个想法,也不再考虑了。


现在,您的自发布解决方案是maxmin()的变相实例。我不确定这是否真的可以解决您的最初问题。但是,如果是这种情况,那么我建议您尝试使用以下编码,而不是基于ite的解决方案[引用:tacas15tacas15_extended]。

enter image description here

(注意:cost应该是与cost_i类型相同的新变量,为解决maxmin()目标而声明。 cost_i从目标降为简单术语)

我相信这种方法比其他方法有更好的表现。


编辑:带有a = 0的源代码示例:

goal = Real("cost")
for y in zip(*time):
    s.add(sum(y) <= goal)
result = s.minimize(goal)

如果您要复制a = 50的情况,

goal = Real("cost")
for y in zip(*time):
    s.add(sum(y) <= goal)
s.add(50 <= goal)
result = s.minimize(goal)

答案 1 :(得分:1)

函数min(max()):

def maxi(a,b):
  return If(a>=b,a,b)

a = 0
for y in zip(*time): #time is a list with many rows and columns
  z = sum(y)         #z receives the sum of the columns
  a = maxi(a,z)     

o.minimize(a)
相关问题