使用或工具在约束空间中实现无偏随机化

Posted

技术标签:

【中文标题】使用或工具在约束空间中实现无偏随机化【英文标题】:achieving unbiased randomization in constraint space with or-tools 【发布时间】:2021-09-12 07:22:10 【问题描述】:

我有一个带有 or-tools 的简单代码,我尝试随机化 3 个变量,使它们的总和是一个常数。我还添加了随机提示,以便求解器每次都会给出不同的结果。但是,当我尝试查看不同值的频率时,只有第一个变量似乎是无偏的或遵循均匀分布,而所有其他变量都偏向于 0。

这里是代码

from ortools.sat.python import cp_model
import numpy as np
import matplotlib.pyplot as plt

model = cp_model.CpModel()

mx = 500
x = model.NewIntVar(0, mx, 'x')
y = model.NewIntVar(0, mx, 'y')
z = model.NewIntVar(0, mx, 'z')

freqX = [0] * (mx + 1)
freqY = [0] * (mx + 1)
freqZ = [0] * (mx + 1)

model.Add(x + y + z == mx)
solver = cp_model.CpSolver()
solver.parameters.cp_model_presolve = False

for i in range(10000):
    model.ClearAssumptions()
    model.ClearHints()
    model.AddHint(x, np.random.randint(0, mx))
    model.AddHint(y, np.random.randint(0, mx))
    model.AddHint(z, np.random.randint(0, mx))
    
    status = solver.Solve(model)
    
    freqX[solver.Value(x)] += 1
    freqY[solver.Value(y)] += 1
    freqZ[solver.Value(z)] += 1

plt.subplot(311)
plt.bar(range(mx+1), freqX, width=1.0)
plt.subplot(312)
plt.bar(range(mx+1), freqY, width=1.0)
plt.subplot(313)
plt.bar(range(mx+1), freqZ, width=1.0)
plt.savefig('foo.svg')

这是输出

使变量遵循均匀分布/无偏的最具可扩展性的方法是什么

PS:下面是我在 cmets 中建议的带有无效提示的分布。

【问题讨论】:

【参考方案1】:

提示的工作方式如下:

搜索按顺序获取提示,并尝试根据提示中的值进行分支。 如果该值当时不属于变量的域,则选择下一个变量 发生故障时,它会回溯并选择另一个值/变量。 10 次失败后,它逐渐恢复到默认启发式(最小域,最小值)。

所以:

如果问题简单,提示有效,分布良好 如果约束开始传播并使提示无效,由于变量的顺序,最后一个将偏向 (a) 有效部分和 (b) 启发式值。

结论:

尝试随机化提示中变量的顺序 :-)

【讨论】:

laurent-perron 如果我们应该给出有效的提示,它不会造成循环问题吗?我们需要解决约束以给出有效的提示,您的意思是仅对应变量范围内的有效值吗?我已经这样做了 我只是说如果你给出无效的提示。提示值出现在解中的概率沿顺序递减。因此,随机化序列的顺序应该会有所帮助。 laurent-perron,我刚试过,值无效,所有变量都有偏差。添加了一张新图片来显示

以上是关于使用或工具在约束空间中实现无偏随机化的主要内容,如果未能解决你的问题,请参考以下文章

算法:随机化亮度和对比度值,有约束

带约束的二部网络保度随机化

第六章:随机化

APP漏洞扫描器之未使用地址空间随机化

linux内存布局和地址空间布局随机化(ASLR)下的可分配地址空间

并行化随机森林