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