这个Riddler问题是关于选举权的问题。如何重新划定边界以这种或那种方式影响投票。
以下是科罗拉多州选民偏好的大致近似值,基于2012年总统选举的县级结果,以14乘10的网格表示。科罗拉多州有七个选区,因此每个选区都有20名选民。在每个选区,得票最多的政党都会获胜。区域必须是不重叠和连续的(即,一个区域中的每个广场必须与该区域中的至少一个其他广场共享一个边缘)。红党能赢得的最多地区是什么?蓝色派对怎么样?(假设一个地区内的关系被认为是你选择的政党的胜利。)
提供两个板,一个测试5×5网格和较大的14×10网格:
以下是第一个解决方案,使用一些简单的逻辑和直觉:
[显示解决方案]
基本思想是使用鸽子洞原理为红色或蓝色构建“最佳方案”。让我们从小表格开始。有9张蓝色选票和16张红色选票,我们必须获得5个地区,每个地区5张选票。
- 红色赢得每个包含至少3张红色选票的选区。总共有16张红色选票,如果我们能分配给他们3+3+3+3+4,那么红色将赢得每个选区。很明显,瑞德做不到比这更好的了!
- 蓝色赢得每个至少有3张蓝色选票的选区。总共有9张蓝色选票,我们最多可以赢得3个选区,如果我们分配选票3+3+3+0+0,就会出现这种情况。
下一个问题是:使用连续分区是否可以实现这些最佳情况?事实证明他们是!以下是实现最可能的红色胜利和最可能的蓝色胜利的分区:
同样,我们可以检查更大的案例并以类似的方式进行。这一次,有51张蓝票和89张红票,我们必须获得7个区的20票。
- 红色赢得每个至少有10张红色选票的选区。总共有89张红色选票,足够在7个选区各投10票,还有很多剩余的选票。如果我们能做到这一点,那么Red将赢得所有7个选区。
- 蓝色赢得每个至少有10张蓝色选票的选区。只有51张蓝色选票,我们最多可以赢得5个选区,剩下一张蓝色选票。
事实证明,在这种情况下,实现这些最佳方案的分区确实存在,并且使用“试错法”相对容易找到。以下是获胜分区的示例(单击放大):
下面是一种使用整数编程的计算方法:
[显示解决方案]
用数值方法解决此问题的一种方法是将其表示为整数规划问题。好处是最终总会找到最佳解决方案,但缺点是可能需要一段时间。我的代码在几秒钟内解决了5乘5的情况,但14乘10的情况计算了12个多小时没有解决,所以我放弃了。当然,使用这种方法可能解决更大的问题,但这需要更高效的模型或更快的计算机!
其思想是将网格单元视为有向图的节点。如果单元相邻,我们在两个节点(每个方向一个)之间放置一条边。对单元格$1,2、\点、C$进行编号,并对边缘$1,2,\点、E$进行编号。定义邻接矩阵$A\ in \{0,1\}^{C\ times C}$、关联矩阵$B\ in \}0,1\{C\ times E}$和向量$v\in \{01\}^C$,如下所示:
\开始{align}
A_{ij}&=\开始{case}
1&\text{如果从单元格}到单元格}j有一条边\\
0&\text{否则}
\结束{箱}\\[2mm]
B_{ij}&=\开始{cases}
1&\text{if-edge}j\text{从单元格}i开始\\
-1&\text{if edge}j\text{结束于单元格}i\\
0&\text{否则}
\结束{箱}\\[2mm]
v_i&=\开始{cases}
1&\text{if单元格}i\text{为蓝色}\\
0&\text{ifcell}i\text{为红色}
\结束{cases}
\结束{align}假设我们的地区编号为$1,2,\点,D$。我们模型中的第一组变量是$x\in\{0,1\}^{C\timesD}$和$w\in\}0,1\{D$,它们表示:
\开始{align}
x_{ij}&=\开始{case}
1&\text{if单元格}i\text{属于区域}j\\
0&\text{否则}
\结束{箱}\\[2mm]
w_j&=\开始{cases}
1&\text{if地区}j\text{获胜}\\
0&\text{否则}
\结束{cases}
\结束{对齐}我们然后有几个直观的约束,我们可以将其代数编码为模型的线性约束:
- 每个单元格正好属于一个区域:
\[\sum_{j=1}^Dx_{ij}=1\quad\text{表示}i=1,\dots,C\]
- 每个地区正好包含$S$单元格:
\[\sum_{i=1}^Cx_{ij}=S\quad\text{for}j=1,\dots,D\]
- 只有在至少有$W$票的情况下,地区才能获胜:
\[W W_j\le\sum_{i=1}^C x_{ij}v_i\le(S+1)W_j+(W-1)\quad\text{表示}j=1,\dots,D\]
不幸的是,仅凭这些限制并不能迫使这些地区相互毗邻。为此,我们必须利用图结构。其想法是将其设置为流问题。想象一下两个新节点,一个通用源节点和一个通用汇节点。从源到每个单元都有边,从每个单元到汇都有边。然后想象一个沿着边缘传播的流。源提供$S$个流量单位(每个源边缘最多一个流量单位),汇必须接受$S$的流量单位(并且必须全部发生在单个汇边缘上),并且图中的每个单元格都保持流量。这些组合约束确保所选单元格在图形中是路径连接的,这意味着它们在网格中是连续的。我们将使用的变量是$f\in\mathbb{Z}^{E\times D}$和$f^\text{out}\in\{0,1\}^{C\times D}$,定义如下:
\开始{align}
f_{ij}&=\开始{cases}
1&\text{if edge}i\text{用于区}j的流\\
0&\text{否则}
\结束{箱}\\[2mm]
f^\text{出}_{ij}&=\开始{cases}
1&\text{if cell}i\text{包含到区域}j的汇点的流\\
0&\text{否则}
\结束{cases}
\结束{对齐}我们然后有约束条件:
- 每个边缘的流量为$S$:
\[
0\le f_{kj}\le S\quad\text{表示}k=1,\dots,E\text{和}j=1,\ dots,D
\]
- 最多使用一个汇边返回流:
\[
\sum_{i=1}^Cf^\text{出}_{ij}=1\quad\text{表示}j=1,\点,D
\]
- 每个细胞的流量是守恒的(包括源和汇的流量)
\[
\sum_{k=1}^E B_{ik}f_{kj}+Sf_{ij}=x_{ij}\quad\text{表示}i=1,\dots,C\text{和}j=1,\ dots,D
\]
- 如果使用边,则必须选择关联的单元格
\[
x_{ij}\ge\alpha\sum_{k=1}^E|B_{ik}|f_{kj}\quad\text{表示}i=1,\dots,C\text{和}j=1,\ dots,D
\]
在最后一个约束中,$\alpha$是一个常数,对于任何流量,必须选择足够小的常数,使其小于1。由于最多有6条活动边(4条内部边、1条源边、1个汇边),因此选择$\alpha<\frac{1}{5S+1}$就足够了。
最后,我们的目标函数是最小化(或最大化)获胜地区的总数。换句话说,$w_1+\dots+w_D$。就这样!
我用过伊朱莉娅,JuMP公司、和古罗比为了解整数程序,在我的笔记本电脑上,5×5的情况需要几秒钟的时间。不幸的是,这起14×10的病例持续了12个多小时,没有终止。因此,对于这个问题的大型版本,我的方法似乎不可行。我的代码为5×5找到的解决方案是:
如果您有兴趣查看我的代码的全部细节,可以查看/下载笔记本在这里.