给定点列表,找到访问所有点并返回起点的最短路径。
该旅行商问题是在计算机科学领域的知名,因为有很多方法来计算/近似它。它已经解决了非常多的问题,但是其中一些最大的问题需要很多CPU年才能完成。
不要被土豆烧死。
Hot Potato游戏是2位以上的玩家在播放音乐的同时绕过一个“土豆”的游戏。目的是将其快速传递给下一个玩家。如果在音乐停止播放时握住马铃薯,那就出门了。
Hot Potato Salesman的对象是:
给定一组100个唯一点,请以更好的顺序返回这些点(较短的总距离(进一步定义)。这会将问题“传递”给下一个玩家。他们必须对其进行改进,然后再传递给下一个,依此类推。如果一个玩家无法对其进行改进,则他们将退出比赛并继续比赛,直到剩下一名玩家为止。
为了避免这种竞争成为“暴力之路”竞赛,有以下规定:
您传递马铃薯的时间不能超过一分钟。如果一分钟后还没有找到并通过一个较短的解决方案,那么您就出局了。
您不能更改超过25点的位置。确切地说,
>= 75
分数必须与收到分数的位置相同。决定更改哪些内容与您更改的金额无关紧要。
当只剩下一名球员时,他就是那场比赛的获胜者,并获得一分。锦标赛由5*n
游戏组成n
,玩家人数在哪里。每场比赛,起始玩家将被轮换,其余的玩家顺序将被洗牌。最后得分最高的玩家是比赛的获胜者。如果比赛以并列第一名结束,则只有那些参赛者才能参加新的比赛。这将一直持续到没有平局为止。
每个游戏的起始玩家将收到一组伪随机选择的点,顺序不特定。
点定义为x,y
笛卡尔网格上的一对整数坐标。距离使用测量曼哈顿距离,|x1-x2| + |y1-y2|
。所有坐标都将在[0..199]
范围内。
输入项
输入带有单个字符串参数。它将由201个逗号分隔的整数组成,这些整数代表当前玩家(m
)的数量和100分:
m,x0,y0,x1,y1,x2,y2,...,x99,y99
这些点的顺序是当前路径。总距离是通过将每个点到下一个(dist(0,1) + dist(1,2) + ... + dist(99,0)
)的距离相加得出的。计算总距离时,不要忘记返回开始!
请注意,m
是不是的球员在比赛开始的数字,它是仍处于数量。
输出量
输出与输入减负的方式相同m
;单个字符串,其中包含用逗号分隔的整数,这些整数表示其新顺序的点。
x0,y0,x1,y1,x2,y2,...,x99,y99
控制程序将仅等待一分钟的输出。收到输出后,它将验证:
- 输出格式正确
- 输出包括仅与所有的100个点中的输入呈现
>=75
点位于其原始位置- 路径长度小于上一个路径
如果这些检查中的任何一项失败(或没有输出),则说明您退出比赛了,游戏将继续进行到下一位玩家。
控制程序
您可以在此链接中找到控制程序。控制程序本身是确定性的,并带有一个虚拟种子1
。计分过程中使用的种子会有所不同,因此不要费心尝试分析它吐出的转弯顺序/点列表。
主要的课程是Tourney
。运行该程序将进行完整的锦标赛,并以参赛者作为参数。它吐出每场比赛的获胜者,并在末尾统计。具有两个SwapBots的示例Tourney看起来像:
Starting tournament with seed 1
(0) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 3
(0) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 4
(1) SwapBot wins a game! Current score: 5
(1) SwapBot wins a game! Current score: 6
(1) SwapBot wins a game! Current score: 7
(1) SwapBot wins a game! Current score: 8
Final Results:
Wins Contestant
2 (0) SwapBot
8 (1) SwapBot
如果您想一次只测试一个游戏,则可以运行Game
该类。这将按照给定参数的顺序与玩家进行一场比赛。默认情况下,它还将打印逐个播放的内容,显示当前播放器和路径长度。
此外,还包括一些测试玩家:SwapBot
,BlockPermuter
,和TwoSwapBot
。前两个不会包含在评分运行中,因此可以在测试过程中随意使用和滥用它们。TwoSwapBot
将包括在评选中,而且他也没有懈怠,因此请带上您的A游戏。
杂记
您无法保存状态信息,并且每个回合都是程序的单独运行。每回合您将获得的唯一信息是积分集。
您不能使用外部资源。这包括网络呼叫和文件访问。
您不能使用旨在解决/协助TSP问题或其变体的库函数。
您不能以任何方式操纵或干扰其他玩家。
您不能以任何方式操纵或干扰控制程序或任何包含的类或文件。
允许多线程。
每个用户一个提交。如果您提交多个条目,我将仅输入第一个提交的条目。如果要更改提交,请编辑/删除原始文件。
比赛将在Ubuntu 13.04上,具有i7-3770K CPU和16GB RAM 的计算机上运行。它不会在VM中运行。我认为是恶意的任何内容都会立即取消您提交的当前和将来条目的资格。
所有条目都必须可以使用免费软件(如Beer)从命令行运行。如果我在编译/运行您的条目时遇到问题,我将在评论中寻求帮助。如果您没有回应,或者我最终无法使它运行,它将被取消参赛资格。
结果(2014年5月22日)
有新结果!UntangleBot击败了竞争对手。TwoSwapBot取得了7场胜利,SANNbot也获得了胜利。这是一个计分板,以及指向原始输出的链接:
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
就目前而言,UntangleBot赢得了选中标记。但是,请不要阻止您参加比赛,因为随着更多参赛者出现,我将举办比赛,并相应地更改已接受的答案。