微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 AddMultiplicationEquality 添加约束?

如何解决如何使用 AddMultiplicationEquality 添加约束?

例如,我有下面的数字列表。并且约束条件是相邻的两个数的间隙既应该是正数也应该是负数,或者两个数中的一个为零,也就是说一正一负(例如3和-1)是不可接受的。

列表编号:[15,15,18,17,20,19,22,25,23,21,24,27,30]

数字间隔:[0,3,-1,-3,-2,3]

所以我尝试使用 AddMultiplicationEquality 添加约束

target=model.NewIntvar(-999999,999999,'target_%s_%s'%(i,i+1))
model.AddMultiplicationEquality(target,[gap[i],gap[i+1]])
model.Add(target>=0)

但是我得到了下面的结果。我该如何解决这个问题?提前致谢。

Not supported
*** Check failure stack trace: ***
@        0x10956c8ed  google::LogMessage::Fail()
@        0x10956b29e  google::LogMessage::SendToLog()
@        0x10956bebf  google::LogMessage::Flush()
@        0x109570c19  google::LogMessageFatal::~LogMessageFatal()
@        0x10956cf55  google::LogMessageFatal::~LogMessageFatal()
@        0x10a7948e4  _ZZN19operations_research3sat17ProductConstraintEN3gtl7IntTypeINS0_20IntegerVariable_tag_EiEES4_S4_ENKUlPNS0_5ModelEE_clES6_
@        0x10a787dfc  operations_research::sat::LoadIntProdConstraint()
@        0x10a7916da  operations_research::sat::LoadConstraint()
@        0x10a7c36e1  operations_research::sat::CpModelPresolver::Probe()
@        0x10a7ceba8  operations_research::sat::CpModelPresolver::Presolve()
@        0x10a7ce756  operations_research::sat::PresolveCpModel()
@        0x10a7e3f7a  operations_research::sat::SolveCpModel()

解决方法

如评论中所见,这是在 7.7 之后修复的

现在,如果不使用乘法的结果,则使用 AddMultiplicationEquality 效率很低。

对于每个间隙数,我会创建两个布尔变量。

is_gt_zero[i] = model.NewBoolVar('')
model.Add(gap[i] > 0).OnlyEnforceIf(is_gt_zero[i])
model.Add(gap[i] <= 0).OnlyEnforceIf(is_gt_zero[i].Not())
is_lt_zero[i] = model.NewBoolVar('')
model.Add(gap[i] < 0).OnlyEnforceIf(is_lt_zero[i])
model.Add(gap[i] >= 0).OnlyEnforceIf(is_lt_zero[i].Not())

然后强制兼容性。

model.AddImplication(is_gt_zero[i],is_lt_zero[i + 1].Not())
model.AddImplication(is_lt_zero[i],is_gt_zero[i + 1].Not())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。