Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 GetPermutations(徽标) '对于每个排列 对于i As Integer=0到permutations.Count()-1 Dim排列=排列(i) Dim成本=0 '对于排列中的每个徽标 对于j作为整数=0的置换.Count()-1 尺寸标识=排列(j) '检查以前的徽标是否包含此徽标的一种或多种颜色 适用于徽标中的每种颜色 如果(j>0),则 如果不是排列(j-1)。包含(颜色)则 成本+=1 如果结束 其他的 成本+=1 如果结束 下一个 下一个 '保存最佳排列 如果(i=0或成本_Algorithm_List_Sorting - Fatal编程技术网

Algorithm GetPermutations(徽标) '对于每个排列 对于i As Integer=0到permutations.Count()-1 Dim排列=排列(i) Dim成本=0 '对于排列中的每个徽标 对于j作为整数=0的置换.Count()-1 尺寸标识=排列(j) '检查以前的徽标是否包含此徽标的一种或多种颜色 适用于徽标中的每种颜色 如果(j>0),则 如果不是排列(j-1)。包含(颜色)则 成本+=1 如果结束 其他的 成本+=1 如果结束 下一个 下一个 '保存最佳排列 如果(i=0或成本

Algorithm GetPermutations(徽标) '对于每个排列 对于i As Integer=0到permutations.Count()-1 Dim排列=排列(i) Dim成本=0 '对于排列中的每个徽标 对于j作为整数=0的置换.Count()-1 尺寸标识=排列(j) '检查以前的徽标是否包含此徽标的一种或多种颜色 适用于徽标中的每种颜色 如果(j>0),则 如果不是排列(j-1)。包含(颜色)则 成本+=1 如果结束 其他的 成本+=1 如果结束 下一个 下一个 '保存最佳排列 如果(i=0或成本,algorithm,list,sorting,Algorithm,List,Sorting,它看起来像。让我解释一下 首先,考虑一个例子,其中有四个城市的代码 A >代码> B >代码> C/和 d>代码>。(我在示例中使用4,但它与颜色的数量无关)。您希望在城市之间找到一条路线,以便(1)只访问每个城市一次,(2)路线尽可能最短[D,C,A,B]可能比[B,A,D,C]短,您需要最短的 现在,你有四个标志,而不是城市。您希望找到这样一种标识顺序,即在颜色混合方面产生最小成本。如果您设想每个徽标都是一个点(城市),并且徽标之间的距离是在一种颜色集与另一种颜色集之间切换的“成本”,那么您

它看起来像。让我解释一下

首先,考虑一个例子,其中有四个城市的代码<代码> A<代码> >代码> B<代码> >代码> C/<代码>和<代码> d>代码>。(我在示例中使用4,但它与颜色的数量无关)。您希望在城市之间找到一条路线,以便(1)只访问每个城市一次,(2)路线尽可能最短<代码>[D,C,A,B]可能比

[B,A,D,C]
短,您需要最短的

现在,你有四个标志,而不是城市。您希望找到这样一种标识顺序,即在颜色混合方面产生最小成本。如果您设想每个徽标都是一个点(城市),并且徽标之间的距离是在一种颜色集与另一种颜色集之间切换的“成本”,那么您需要找到点之间的最短“路线”。一旦你有了这条最短的路线,它会告诉你应该如何订购标识。例如,两个徽标L1和L2之间的“距离”可以定义为L2中不在L1中的许多颜色

TSP是一个众所周知的算法问题。这很难(实际上)。 如果你的投入很小,你可以找到最好的解决方案。如果有4个徽标,则有24个可能的组合。对于10个徽标,您有360万个组合,而对于20个徽标,您有2432902008176640000个组合(如何阅读?)。因此,对于大于10-15的输入,您需要使用一些启发式方法来找到近似的解决方案,我相信这对您来说已经足够了

我要做的是,我将创建一个颜色混合成本图,并将其提供给一些用户

编辑

  • 澄清。不是每个徽标都是一个单独的点,而是徽标中的每一组颜色都是一个点。也就是说,如果你有两个颜色相同的标志,你会把它们看成是一个单点,因为它们会被打印在一起。带有红色、蓝色、黑色的徽标在点上,带有红色、绿色的徽标在另一点上
  • 它不是TSP(您不需要使用与开始时相同的颜色集来结束),但变化不大
  • 如果您的徽标中没有匹配项,则首先将标识拆分为它们之间没有匹配的不相交组,然后分别考虑每个组。如果您的任何徽标之间都不匹配,那么您就无能为力:)
  • 实际上,我会使用python和maybe库将您的问题建模为图形,然后将其传递给某个TSP解算器。只需格式化输入,让其他程序完成所有的脏活
它看起来像是一个。让我解释一下

首先,考虑一个例子,其中有四个城市的代码<代码> A<代码> >代码> B<代码> >代码> C/<代码>和<代码> d>代码>。(我在示例中使用4,但它与颜色的数量无关)。您希望在城市之间找到一条路线,以便(1)只访问每个城市一次,(2)路线尽可能最短<代码>[D,C,A,B]可能比

[B,A,D,C]
短,您需要最短的

现在,你有四个标志,而不是城市。您希望找到这样一种标识顺序,即在颜色混合方面产生最小成本。如果您设想每个徽标都是一个点(城市),并且徽标之间的距离是在一种颜色集与另一种颜色集之间切换的“成本”,那么您需要找到点之间的最短“路线”。一旦你有了这条最短的路线,它会告诉你应该如何订购标识。例如,两个徽标L1和L2之间的“距离”可以定义为L2中不在L1中的许多颜色

TSP是一个众所周知的算法问题。这很难(实际上)。 如果你的投入很小,你可以找到最好的解决方案。如果有4个徽标,则有24个可能的组合。对于10个徽标,您有360万个组合,而对于20个徽标,您有2432902008176640000个组合(如何阅读?)。因此,对于大于10-15的输入,您需要使用一些启发式方法来找到近似的解决方案,我相信这对您来说已经足够了

我要做的是,我将创建一个颜色混合成本图,并将其反馈给so Red | (Other Color) Red | Black (Other Color) | Black delete from routes delete from cities insert into cities values ('Black|Red') insert into cities values ('Red') insert into cities values ('Blue') insert into cities values ('Black') insert into cities values ('Blue|Red') -- Numeric Value is Colors not Matching insert into routes values ('Black|Red', 'Red', 3) insert into routes values ('Black|Red', 'Black', 3) insert into routes values ('Red', 'Black', 4) insert into routes values ('Blue|Red', 'Red', 3) insert into routes values ('Blue|Red', 'Black', 4) insert into routes values ('Blue', 'Red', 4) insert into routes values ('Blue', 'Black|Red', 4) insert into routes values ('Blue', 'Black', 4) insert into routes values ('Blue', 'Blue|Red', 3) exec getTSPRoute 'Black' Results: Black->Black|Red->Red->Blue|Red->Blue->Black
foreach combination
    foreach print
        foreeach color 
            if not previous_print.contains(color)
                cost++

order combination by cost (ascending)
Private Sub GoGoGo()
    ' Adds some logos 
    ' This is where you add them from the database or text file or wherever
    Dim logos() =
    {
        New String() {"Black", "Magenta", "Orange"},
        New String() {"Red", "Green", "Blue"},
        New String() {"Orange", "Violet", "Pink"},
        New String() {"Blue", "Yellow", "Pink"}
    }

    ' Used to store the best combination
    Dim minimumPermutation
    Dim minimumCost = Integer.MaxValue

    ' Calculate all permutations of the logos
    Dim permutations = GetPermutations(logos)

    ' For each permutation
    For i As Integer = 0 To permutations.Count() - 1
        Dim permutation = permutations(i)
        Dim cost = 0

        ' For each logo in permutation
        For j As Integer = 0 To permutation.Count() - 1
            Dim logo = permutation(j)

            ' Check whether the previous logo contains one or more colors of this logo
            For Each color In logo
                If (j > 0) Then
                    If Not permutation(j - 1).Contains(color) Then
                        cost += 1
                    End If
                Else
                    cost += 1
                End If
            Next
        Next

        ' Save the best permutation
        If (i = 0 Or cost < minimumCost) Then
            minimumCost = cost
            minimumPermutation = permutation.Clone()
        End If
    Next

    ' Output the best permutation
    For Each logo In minimumPermutation
        Console.Write(logo(0) + " " + logo(1) + " " + logo(2))
    Next
End Sub

Public Shared Iterator Function GetPermutations(Of T)(values As T(), Optional fromInd As Integer = 0) As IEnumerable(Of T())
    If fromInd + 1 = values.Length Then
        Yield values
    Else
        For Each v In GetPermutations(values, fromInd + 1)
            Yield v
        Next

        For i = fromInd + 1 To values.Length - 1
            SwapValues(values, fromInd, i)
            For Each v In GetPermutations(values, fromInd + 1)
                Yield v
            Next
            SwapValues(values, fromInd, i)
        Next
    End If
End Function

Private Shared Sub SwapValues(Of T)(values As T(), pos1 As Integer, pos2 As Integer)
    If pos1 <> pos2 Then
        Dim tmp As T = values(pos1)
        values(pos1) = values(pos2)
        values(pos2) = tmp
    End If
End Sub