Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 座位安排算法_Algorithm - Fatal编程技术网

Algorithm 座位安排算法

Algorithm 座位安排算法,algorithm,Algorithm,因此,让我描述一下我的项目模块的问题: 我有一间50人的房间 10行5列 我有6种不同的口味,每种口味都有无限量的元素 我需要制定一个座位计划,这样就不会有同样风格的人坐在附近(前-后-对角线) 我能用什么样的算法来解决这个问题 如果可能,请描述算法的步骤。算法 对于这个特定的例子,您可以使用贪婪算法。在行和列上迭代,并在每个座位上设置与已就座的口味不冲突的任何口味 证明 xxxxxxxxxx xxxxxxxxxx xxxo...... .......... .......... x - al

因此,让我描述一下我的项目模块的问题:

我有一间50人的房间

10行5列

我有6种不同的口味,每种口味都有无限量的元素

我需要制定一个座位计划,这样就不会有同样风格的人坐在附近(前-后-对角线)

我能用什么样的算法来解决这个问题


如果可能,请描述算法的步骤。

算法

对于这个特定的例子,您可以使用贪婪算法。在行和列上迭代,并在每个座位上设置与已就座的口味不冲突的任何口味

证明

xxxxxxxxxx
xxxxxxxxxx
xxxo......
..........
..........

x - already seated
o - currently seating
. - empty
假设我们以从左到右的方式逐行迭代。当我们制作新座位时,这个地方最多有4个已经就座的邻居(请看上图)。因为我们有6种口味,所以总会有一种口味,这与所有其他口味不同。因为这是真实的每一个座位,我们可以填补所有50个空间

泛化


对于一般的值,这个问题可能相当棘手,我敢说甚至是NP难。

有一套好的算法,特别是顶点着色算法。您需要将椅子视为与所有相邻椅子具有边的顶点。

给定的问题是一个问题。特别是(使用所用术语):

  • 变量集X由座位组成(在您的情况下,我们有50个座位对应于一组50个变量,每个座位一个)
  • 域值集D是一组50个域(每个变量1个),每个域包含一组6个值(6种不同的味道)
  • 约束集是这样组成的
    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