我想生成一些二进制数组来控制没有控制器的 LED 的亮度。我不会在微控制器上生成脉冲宽度(这会占用本应用于其他事情的指令周期),而是将它们硬编码为查找表,并一遍又一遍地循环通过二进制数组,设置LED 在该指令下打开或关闭。
假设我的数组长度为 4,我将有 5 个亮度级别:
{{ 0, 0, 0, 0 },
{ 1, 0, 0, 0 },
{ 1, 0, 1, 0 },
{ 1, 1, 1, 0 },
{ 1, 1, 1, 1 }}
请注意,我已尝试将 1 尽可能均匀地分布在整个阵列中,这并不总是可能的,但人眼不应该看到小的异常。
假设我的数组长度为 8,我想要 5/8 的亮度:
{ 1, 0, 1, 1, 0, 1, 1, 0 };
这似乎是一个很好的传播,但我也可以使用:
{ 1, 0, 1, 1, 1, 0, 1, 0 };
哪个更好?当然,平均亮度是相同的。从一种状态到另一种状态的变化次数也是相同的。标准差是一样的。但是,查看运行时,第一个示例的运行长度方差要低得多,这意味着它更均匀,因此更好。
反正。我需要一种算法来为给定的长度和亮度生成这些数组。如果可能,算法应该找到一个最佳数组——一个尽可能统一的数组。
这并不像听起来那么简单。老实说,我很想写一个蛮力算法来比较所有可能性并返回最好的。
我什至考虑将一个整数编程模型放在一起,但这对于这个问题来说似乎有点过分了。
除非有人有更好的主意?
编辑:
事实证明 与{ 1, 1, 1, 1, 0, 0, 0, 0 }
具有相同的运行方差,{ 1, 0, 1, 0, 1, 0, 1, 0 }
因此度量需要稍微复杂一些,因为第二个示例明显优于第一个示例。(对于更长的阵列长度,可能会看到一些 LED 闪烁,因为 1 会聚在一起)。