给定一个大小为m * n的矩阵,以这样的方式安排k学生,以便最大限度地减少考试作弊。
我的方法: 考虑m * n矩阵,将第一个学生放在X处(X =给定矩阵中的任何单元格)。对于下一个学生,为每个空单元格做一个BFS,计算它的远程度(R)。对于R,我们可以从值t = max(m,n)开始,并且在BFS中我们遇到的每个下一个单元处,我们添加t级。如果R是最小的,那么存储这个单元格。最后将下一个学生放在具有最小R值的单元格中。对所有学生重复这个(k)。
优化:如果我们到达的R的单元格大于现在的R,请忽略它。
我们如何优化它?
有没有更好的算法来做到这一点?
我的起始单元格X与最终答案有关吗?
例如,如果它的5x5垫,我把第一个学生放在0x0或者如果我从2x2开始,哪一个对于广义k更好? (显然,对于k = 2,0x0会更好!)
修改 这里最大限度地减少作弊意味着为所有学生计算的Rs总和应该最小化。
答案 0 :(得分:1)
所以基本上你想在一个m乘n的平面上打包k个圆圈?为什么不简单地使用六边形包装?也许请查看https://en.wikipedia.org/wiki/Circle_packing及相关文章。
答案 1 :(得分:0)
我想到了一些东西,但没有使用矩阵。也许它没用,但它很有趣。
所以这是算法:
从有界平面中的一组随机点开始。
对于每个点P计算段QR包含两个最接近的点Q和R到P。
同时沿着QR轴移动每个点P,步长为“s”,与距离P的最近点成1 /距离(根据方向,它可以是零或零)。
再次执行此操作,直到您选择的某个功能得到优化(它可以是平均距离或距离 最近点)或再做n次。
多次重复整个过程,这样你就不太可能陷入局部最低限度。
所以这是我的尝试。我不向你保证它肯定会奏效。但我从来没有见过任何算法来做到这一点。我很有趣地学习CS,所以我绝对不是专家。
答案 2 :(得分:0)
我们如何优化它?
我们无法优化您的方法,因为它没有充分指定,特别是您如何计算所谓的远程(R)。由于指令“对于R,我们可以从值t = max(m,n)开始,并且在我们在BFS中的相同级别遇到的每个下一个单元格中,我们添加t级”不要考虑到遇到的单元格是否已被占用,这可能无法正常工作。 此外,名称 remoteness 似乎有误导性,因为您试图将其最小化。
要理解这个问题,让我们考虑m = n = k = 5的情况,其中前4个学生(*
)已经被放置在矩阵的角落(这是最优的,我想你'同意):
*...* ..... ..... ..... *...*
空单元格(.
)的R值是多少?
有更好的算法吗?
为了回答这个问题,我们需要一个更好的定义最小化作弊而不是(有点反身)“为所有学生计算的Rs总和应该最小化”。 Niklas B已经提出了一些建议(成对距离的总和是最小的?或相邻学生之间的距离? - 但我认为他的意思是最大)和user46910( 它可以是平均距离或最近点的距离)。我们考虑选择其中一个。
我的起始单元格X是否与最终答案有关?
这也取决于最小化作弊的关键定义,但我认为我们可以假设每个合理的定义和k>如图1所示,在最佳放置中,矩阵的至少一个角将被占用,而中间将不总是(参见例如上述k = 4的矩阵)。因此,最好从占用矩阵 0,0 开始,而不是矩阵 2,2 。