我有一个需要打印的徽标列表(最多4种颜色)。每个标志需要一个设置时间来混合该标志所需的油漆。如果我能对数据进行排序,使使用相同颜色的两个徽标背对背,那么我们就不必混合那么多颜色,从而节省金钱和时间。油漆混合后的使用寿命有限。
我在看这样的数据集…
红色(其他颜色)
红|黑
(其他颜色)|黑色
它必须以这样的顺序结束这是唯一一个允许我做一个红色和一个黑色的订单。我试过一些方法,比如给每种常见颜色赋值,但不管怎样,我似乎都不能正确排序。
我使用了下面的SQL过程,这是有人根据TSP问题编写的(http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=172154
使用下面的测试数据,我收到了正确的输出
从路由中删除
从城市删除
插入城市值(“黑色|红色”)
插入城市值(“红色”)
插入城市值(“蓝色”)
插入城市值(“黑色”)
插入城市值(“蓝色红色”)
--数值是不匹配的颜色
插入路由值('black red','red',3)
插入路由值('black red','black',3)
插入路由值(“红色”、“黑色”,4)
插入路由值(“蓝色红色”、“红色”,3)
插入路由值(“蓝色|红色”、“黑色”,4)
插入路由值(“蓝色”、“红色”,4)
插入路由值(“蓝色”、“黑色”、“红色”,4)
插入路由值(“蓝色”、“黑色”,4)
插入路由值(“蓝色”、“蓝色|红色”,3)
“黑色”的执行官
结果:
黑->黑红->红->蓝红->蓝->黑
唯一的问题是回到原来的“城市”(开始和结束都返回黑色),我必须选择一个“开始城市”。如果选择了错误的城市,我不会得到最优化的路线。

最佳答案

它看起来像travelling salesman problem (TSP)。让我解释一下。
首先,考虑一个例子,其中有一个包含四个城市ABCD的地图(我在示例中使用了4,但它与颜色的数量无关)你想在两个城市之间找到一条路线,这样你(1)只访问一次每个城市,(2)这条路线是最短的[D,C,A,B]可能比[B,A,D,C]短,您需要最短的一个。
现在,你有四个标志而不是城市。你想找到这样一个排序的标志,这就产生了最低成本的颜色混合。如果你想象你的每一个标志都是一个点(城市),而标志之间的距离是在一个颜色集和另一个颜色集之间切换的“成本”,那么你需要找到点之间最短的“路线”。一旦你有了这个最短的路线,它告诉你应该如何订购的标志两个标志l1和l2之间的“距离”可以定义为,例如,l2中不在l1中的许多颜色。
TSP是一个众所周知的算法问题这很难(实际上,NP-hard)。
如果你的投入很小,你可以找到最好的解决方案。如果有4个徽标,则有24个可能的组合对于10个徽标,您有360万个组合,对于20个徽标,您有243290200817664万个组合(如何阅读?)因此,对于大于10-15的输入,你需要使用一些启发式算法来找到一个近似解,我确信这对你来说已经足够了。
我要做的是,我将创建一个彩色混合成本的图表,并把它喂给一些TSP solver
编辑:
澄清。不是每个标志都是一个单独的点,但标志中的每一组颜色都是一个点。也就是说:如果你有两个标识有相同的颜色,你认为他们是一个单一的点,因为他们将被打印在一起。红色、蓝色、黑色的标志在点上,红色、绿色的标志在点上。
它是Hamiltonian path problem而不是tsp(您不需要以与开始时相同的颜色集结束),但变化不大
如果您的徽标中可能没有匹配项,则首先将徽标拆分为不相交的组,这些组之间没有匹配项,然后分别考虑每个组如果您的任何徽标之间没有匹配项,则您不能执行太多操作:)
实际上,我会使用python和networkx库将问题建模为图,然后将其传递给TSP求解器只要格式化输入,让其他程序做所有的肮脏工作。

10-08 15:35