Algorithm 座位安排算法
因此,让我描述一下我的项目模块的问题: 我有一间50人的房间 10行5列 我有6种不同的口味,每种口味都有无限量的元素 我需要制定一个座位计划,这样就不会有同样风格的人坐在附近(前-后-对角线) 我能用什么样的算法来解决这个问题Algorithm 座位安排算法,algorithm,Algorithm,因此,让我描述一下我的项目模块的问题: 我有一间50人的房间 10行5列 我有6种不同的口味,每种口味都有无限量的元素 我需要制定一个座位计划,这样就不会有同样风格的人坐在附近(前-后-对角线) 我能用什么样的算法来解决这个问题 如果可能,请描述算法的步骤。算法 对于这个特定的例子,您可以使用贪婪算法。在行和列上迭代,并在每个座位上设置与已就座的口味不冲突的任何口味 证明 xxxxxxxxxx xxxxxxxxxx xxxo...... .......... .......... x - al
如果可能,请描述算法的步骤。算法 对于这个特定的例子,您可以使用贪婪算法。在行和列上迭代,并在每个座位上设置与已就座的口味不冲突的任何口味 证明
xxxxxxxxxx
xxxxxxxxxx
xxxo......
..........
..........
x - already seated
o - currently seating
. - empty
假设我们以从左到右的方式逐行迭代。当我们制作新座位时,这个地方最多有4个已经就座的邻居(请看上图)。因为我们有6种口味,所以总会有一种口味,这与所有其他口味不同。因为这是真实的每一个座位,我们可以填补所有50个空间
泛化
对于一般的值,这个问题可能相当棘手,我敢说甚至是NP难。有一套好的算法,特别是顶点着色算法。您需要将椅子视为与所有相邻椅子具有边的顶点。给定的问题是一个问题。特别是(使用所用术语):
C1:=(X[0,0]!=X[0,1]);C2:=(X[0,0]!=X[1,0]);C3:=(X[0,0]!=X[1,1])
等等initialize_domains_for_each_variable; // set the 6 available flavours
for(int i = 0; i < 10; i++){
for(int j = 0; j < 5; j++){
seats[i,j].flavour = seats[i,j].possible_flavours[0];
// look ahead and eliminate possible conflicts
remove_this_flavour_from_surrounding_seats_possible_flavours;
}
}
有两项。在矩阵的边框中,您将有更多可用的风格,因为它可能与之冲突的项目是2(在左边框的情况下)、3(在右边框不在第一行的情况下)或1(在右上元素的情况下,第一行的右边框)
请注意,使用上述算法只能使用5种口味(最低限度)。如果你有必要使用6种口味,你必须调整算法。需要更多关于输入的信息:每种口味有多少种?对于给定的输入是否保证有一个解决方案?您在这里没有定义“最佳”,但我假设您的目标是最小化彼此相邻的口味数?因为您将其标记为遗传算法。。。我认为这对于遗传算法来说是一个可怕的问题:/应该去掉标签,但不知道为什么会出现标签。每种味道有无限量吗?或者说每一个都有一个具体的总数达到50?我也想过,但有一个问题。在安排最后一个座位时,实际上很可能会发生冲突。即使当你对口味进行优先排序时,剩下的“元素”也会出现这种情况。这是不应该发生的。对于最后一个座位,你应该有3个选择。似乎有一半的答案假设每种口味的量是无限的,而你的座位是50个。如果这是真的,你是对的。另一半人假设有50种元素可以入座,分为6种口味。如果这是真的,你错了。OP不清楚哪一个是准确的,所以我删除了我的反对票。但是50不能被6整除,所以我认为不可能。整除性是不相关的。可能有六种口味A、B、C、D、E和F,还有30种A、12种Bs、4种Cs、3种Ds和一种E。Oto OP已经澄清了你的解释确实是正确的。所以+1。这听起来不像是图形着色。让人们就座意味着你不能选择人们必须坐的座位,相反,不同“口味”的供应有限。如果每种口味都有任何数量,那么这是一个微不足道的图形着色问题(奇数行为ABABA,偶数行为CDCDC)。要求没有说明每种口味的限量。该要求仅适用于两种口味不相邻(水平、垂直或对角)的座位计划。在这种情况下,我认为图形着色更合适(不过这只是我的观点)。
seat[i,j].available_flavours = available_flavours - seat[i-1,j+1].flavour - seat[i-1,j].flavour - seat[i-1,j-1].flavour - seat[i,j-1].flavour