Seu trabalho é substituir as baterias em muitos dispositivos flutuantes de rastreamento de peixes no menor tempo possível. Você deve deixar sua base no helicóptero da base e visitar cada rastreador uma vez e depois retornar à base.
É difícil encontrar a rota ideal, mas há uma dificuldade adicional! Cada rastreador tem uma velocidade de desvio (que será assumida como uma constante para o dia).
Esse é o problema padrão do vendedor ambulante com o desafio adicional de mover nós. Deve ser fácil encontrar um passeio válido. O principal desafio está no desenvolvimento de um algoritmo para encontrar um tour quase ideal. Prevejo que não será possível encontrar um passeio perfeito com o atual N = 300 (mas eu adoraria provar que estou errado).
Regras
Seu programa será fornecido com uma sequência de dados do rastreador no STDIN ou através de um argumento de linha de comando. Você deve encontrar uma rota que visite cada rastreador exatamente uma vez e retorne à base. A saída deve ser uma lista separada por espaços em branco de ID do rastreador: pares de tempo.
- A posição é dada em centímetros (cm).
- O tempo é medido em segundos, começando com t = 0.
- A velocidade é dada em cm / s.
- Cada ID de rastreador é de 1 a 8 letras maiúsculas.
- A base com o ID "BASE" está localizada em
(0,0)
. - Todos os valores numéricos para entrada e saída usam números inteiros assinados.
- A entrada é um ou mais espaços em branco ou rastreadores separados por barras.
- Cada rastreador terá
ID:x,y,vx,vy
formato (por exemploA:566,-344,-5,11
:) - No momento t, um rastreador estará em
(x+vx*t, y+vy*t)
. - O helicóptero nunca deve exceder a velocidade de 5000 cm / s (180 km / h).
- A saída deve ser visitas separadas por espaços em branco na ordem do tempo.
- Cada visita deve estar no formato ID: hora (por exemplo
A:5723
:) - A última visita em sua saída deve ser a base (por exemplo
BASE:6120
:) - Se mais de um rastreador estiver na mesma posição, levará tempo zero para se mover entre eles.
- As brechas padrão são proibidas.
Conjunto de dados de exemplo
A:77000,88000,-120,80 B:52000,-12000,0,-230 C:-140000,-23000,-270,110
Exemplo de solução não ideal:
A:30 B:60 C:120 BASE:160
Observe que isso A:30 B:60 C:120 BASE:130
seria inválido porque o helicóptero teria que voar a 17268 cm / s para voltar à base em 10 segundos.
Conjunto de dados de teste
AA:-164247,-378265,182,113
AB:-1494514,-385520,-25,80
AC:-744551,832058,-13,-123
AD:-930133,1598806,97,177
AE:-280777,-904936,-48,305
AF:-855362,-10456,-21,-89
AG:880990,154342,175,-100
AH:-319708,-623098,172,-17
AI:620018,-626908,-19,-164
AJ:-990505,164998,18,-120
AK:379998,310955,191,59
AL:-977441,-130531,107,-234
AM:-766893,14659,162,-198
AN:-502564,-95651,261,306
AO:661306,-98839,231,263
AP:-788211,254598,24,-249
AQ:851834,-1004246,-45,75
AR:698289,-965536,-8,-134
AS:-128295,701701,180,-241
AT:1423336,1359408,-6,173
AU:445274,-527619,231,319
AV:358132,-781522,26,-132
AW:736129,807327,0,-137
AX:-174581,-337407,133,180
AY:-1533760,-215500,144,-111
AZ:-383050,82658,221,-14
BA:-1650492,548674,89,-63
BB:54477,-906358,440,181
BC:891003,623700,326,102
BD:-393270,1732108,155,-97
BE:411090,-859170,93,163
BF:554962,-298575,480,-100
BG:-695530,475438,244,283
BH:93622,-958266,153,-127
BI:-403222,389691,323,329
BJ:1585132,98244,-156,71
BK:713912,484912,158,97
BL:-1612876,317391,-5,-131
BM:-725126,-320766,30,-105
BN:-76091,-381451,-172,95
BO:-483752,970905,16,-170
BP:1585890,91873,-173,-19
BQ:-815696,-342359,-64,-121
BR:-129530,-606673,-66,-94
BS:-339974,-561442,-35,271
BT:1277427,1258031,13,-5
BU:1246036,-743826,144,-200
BV:494745,-522944,211,309
BW:776786,586255,6,-146
BX:-847071,-792238,-142,-199
BY:748038,863976,6,-109
BZ:-667112,634959,221,-174
CA:888093,900097,-107,-56
CB:113938,-1031815,-167,134
CC:-626804,504649,2,-151
CD:866724,941177,311,221
CE:-1632084,-1957347,38,116
CF:774874,804277,-4,-152
CG:468675,-239063,437,-141
CH:-1352217,-388519,-86,70
CI:-1006,921538,-6,-179
CJ:-1866469,68979,-1,133
CK:-1036883,1962287,124,-62
CL:760226,858123,478,56
CM:764838,493113,-27,-155
CN:-642231,-387271,48,198
CO:430643,646456,8,-138
CP:268900,-82440,294,-114
CQ:-1518402,-1782748,123,62
CR:5487,980492,-30,-151
CS:-749712,494682,-1,-113
CT:-1144956,124994,84,120
CU:-1855045,-612779,30,-35
CV:416593,-57062,-67,-140
CW:-1970914,-1984034,-27,153
CX:-606767,629298,-49,-144
CY:-792900,-696850,0,-123
CZ:1561820,-450390,37,21
DA:579688,355017,-186,-153
DB:1178674,1247470,-86,-54
DC:483389,-837780,321,27
DD:468021,-992185,20,253
DE:-38126,-386917,270,250
DF:707678,189200,-59,-179
DG:-1428781,1326135,-29,-148
DH:-1943667,1645387,22,140
DI:-399820,626361,29,-132
DJ:-2657,170549,94,-169
DK:-331601,917405,104,157
DL:1965031,350999,158,-114
DM:902640,986090,-66,-140
DN:540679,-544126,15,-121
DO:-524120,411839,-48,-120
DP:-134995,-876166,191,-128
DQ:359872,-991469,-164,-186
DR:-186713,-309507,14,-86
DS:1846879,-585704,133,64
DT:169904,945363,298,70
DU:-218003,-1001110,-70,109
DV:316261,266341,-63,-89
DW:551059,55754,-4,-94
DX:-514965,305796,304,-100
DY:162176,485230,-90,83
DZ:675592,-1508331,119,-20
EA:656886,38516,257,-111
EB:-201090,678936,5,-161
EC:-920170,-503904,-8,158
ED:-728819,-401134,-83,154
EE:-611398,-320235,-5,-102
EF:-612522,-259240,14,-154
EG:662225,-808256,478,165
EH:-468284,-720421,234,316
EI:-958544,-161691,-12,-97
EJ:839898,-631917,-25,-159
EK:745130,598504,-72,132
EL:412250,-456628,13,-104
EM:-737096,374111,172,35
EN:726052,-385153,-45,31
EO:-888906,-495174,24,-170
EP:-518672,-685753,-14,-102
EQ:440153,-211801,-46,-180
ER:464493,-1637507,-3,154
ES:701248,-512422,-33,-83
ET:-795959,426838,-29,-117
EU:307451,978526,445,124
EV:800833,66796,15,-176
EW:-623452,299065,-30,-117
EX:15142,-363812,445,245
EY:-701669,-556515,-8,-136
EZ:-1772225,890097,-140,-104
FA:-948887,-882723,-11,-157
FB:387256,-128751,151,7
FC:1066595,-641933,31,-23
FD:-823274,-812209,-67,-172
FE:923612,536985,21,-123
FF:-886616,-808114,-26,-153
FG:411924,-518931,-7,-138
FH:945677,-1038311,174,-59
FI:913968,81871,-5,-139
FJ:625167,708120,-44,-90
FK:-405348,893926,-10,-93
FL:-58670,415334,170,-155
FM:326285,671439,426,-237
FN:-775332,-81583,4,-164
FO:280520,360899,2,-150
FP:-406095,133747,26,170
FQ:-990214,-342198,30,-112
FR:938869,801354,397,198
FS:-7527,36870,-23,-111
FT:999332,-956212,143,16
FU:-86215,792355,-49,-87
FV:144427,378536,-4,-136
FW:-786438,638084,28,-77
FX:903809,903424,-102,-132
FY:-36812,-126503,16,-159
FZ:-1083903,1001142,-29,-110
GA:857943,-120746,135,-3
GB:545227,-151166,239,127
GC:-356823,674293,106,90
GD:977846,1003667,-53,106
GE:-866551,180253,-1,-170
GF:-688577,289359,-24,-161
GG:-256928,-481626,169,109
GH:590910,829914,25,-170
GI:568114,735446,-34,-172
GJ:1756516,-655660,140,138
GK:-1683894,-1417741,-163,-84
GL:-201976,-703352,201,217
GM:-271187,-836075,-24,-141
GN:809929,793308,70,324
GO:-403617,58364,432,-191
GP:-94316,227063,148,28
GQ:-930345,1587220,-129,-142
GR:-433897,58058,-75,255
GS:-780984,114024,-12,-160
GT:-403102,-1425166,158,-84
GU:-449829,-414404,-27,-125
GV:556480,72387,-34,306
GW:-959629,326929,327,-91
GX:250741,-992373,94,-121
GY:702250,1612852,-41,38
GZ:853191,857773,-62,-105
HA:674500,-225890,7,-152
HB:-1890026,-179534,-23,49
HC:398363,681200,31,-26
HD:-1896372,113239,-51,25
HE:599213,137473,10,-31
HF:-34537,750768,-18,-179
HG:-959544,-430584,-33,-117
HH:1283773,1606578,-8,-80
HI:-866804,108513,180,-74
HJ:765654,115993,23,-22
HK:554000,130015,18,-32
HL:-470089,-407430,38,191
HM:366977,556677,18,-134
HN:175829,545309,29,-146
HO:-263163,-235953,3,-169
HP:727495,567716,6,-135
HQ:121304,-9150,81,-157
HR:-1789095,-471348,-73,-9
HS:-799974,819873,51,-64
HT:-985175,1774422,70,-10
HU:516368,-227142,-33,-117
HV:655503,350605,-6,-92
HW:733506,-1967066,197,-62
HX:1339705,-1227657,-195,44
HY:-384466,-1932882,7,-93
HZ:-394466,-459287,132,95
IA:120512,-1673367,28,-167
IB:1294647,-1112204,35,133
IC:883230,734086,144,54
ID:-95269,435577,30,148
IE:-378105,-1147004,-6,190
IF:366040,-132989,339,-61
IG:-397775,-410802,-1,-84
IH:849353,-181194,-98,45
II:774834,-56456,-177,21
IJ:-441667,576716,-51,-82
IK:-309799,-673582,-34,-99
IL:605784,-903045,-179,103
IM:-379218,-958590,-6,262
IN:982984,947942,212,-28
IO:-477749,-472771,474,44
IP:-1381284,-1273520,131,139
IQ:672901,1298275,-116,150
IR:-816582,-693425,121,-265
IS:809060,-66216,-45,-165
IT:655913,723612,6,-102
IU:70578,-546308,496,219
IV:558122,41452,-20,-103
IW:237612,-1605017,154,170
IX:-1120980,-471873,-181,-134
IY:-1385384,36137,-14,15
IZ:1401932,-1692315,103,115
JA:1339559,1534224,123,46
JB:-963572,-554932,-13,-153
JC:1422496,-213462,-97,-63
JD:-74743,-909157,277,273
JE:-1364398,911720,185,-19
JF:831273,-645419,-61,-147
JG:-308025,-297948,-59,-107
JH:-737466,-424236,419,219
JI:234767,971704,375,89
JJ:-715682,-871436,395,-54
JK:-296198,-466457,11,227
JL:277311,-661418,27,-124
JM:113477,-763303,-61,-142
JN:198929,881316,358,67
JO:864028,-1735917,-168,-162
JP:193352,-46636,12,-171
JQ:-374301,967915,-27,-98
JR:-900576,1585161,-14,-154
JS:-855414,-201048,24,-150
JT:473630,412948,-80,68
JU:-358039,-730839,-18,47
JV:677652,-670825,-63,-146
JW:536063,-734897,-86,57
JX:344532,-594945,143,230
JY:218390,42085,406,-154
JZ:222495,-933383,440,-29
KA:993576,490730,448,13
KB:1383947,-1637102,-146,-175
KC:181730,-314093,-20,47
KD:1400934,502742,-77,-126
KE:1239862,1152873,144,102
KF:-156867,290487,5,-92
KG:947301,958346,-12,-124
KH:-1873578,815339,194,167
KI:1181091,882850,89,-122
KJ:-825910,-452543,369,9
KK:548963,-358292,390,117
KL:-940596,-200000,125,296
KM:463530,905548,-70,-95
KN:-7507,263613,-7,-145
KO:172069,-457358,-40,-113
KP:-206484,-214043,172,-4
KQ:620049,1844897,-158,192
KR:-988657,612294,452,-125
KS:-802234,611144,-34,-178
KT:231136,-858200,123,129
KU:1557166,943150,105,114
KV:-229389,-440910,-71,123
KW:-135216,1346978,15,136
KX:-43852,521638,-38,279
KY:112655,441642,-8,-105
KZ:525746,-216262,8,-124
LA:-985825,-345745,33,187
LB:-839408,-319328,-6,-136
LC:-12208,1899312,-168,149
LD:156476,-902318,69,325
LE:976731,-427696,310,165
LF:-809002,-255961,312,235
LG:-899084,484167,5,57
LH:-748701,426117,256,-21
LI:-711992,148901,-49,24
LJ:-519051,-440262,22,-105
LK:-310550,283589,88,151
LL:244046,-1751273,5,29
LM:1350149,-1524193,-96,-158
LN:-706211,-585853,-63,-122
Verificador
Um programa semelhante ao verificador a seguir será usado para verificar as respostas. Você pode usar este programa para verificar suas respostas antes de postar.
# PPCG: Visiting each drifting tracker
# Answer verifier for Python 2.7
# Usage: python verify.py infile outfile [-v]
# Infile has the given input string. Outfile has the solution string.
# v1.0 First release.
import sys, re
VERBOSE = ('-v' in sys.argv)
fi, fo = sys.argv[1:3]
def error(*msg):
print ' '.join(str(m) for m in ('ERROR at:',) + msg)
sys.exit()
indata = open(fi).read().strip()
trackdata = [re.split('[:,]', node) for node in re.split('[ /]', indata)]
trackers = dict((node.pop(0), map(int, node)) for node in trackdata)
shouldvisit = set(trackers.keys() + ['BASE'])
visittexts = open(fo).read().split()
visitpairs = [node.split(':') for node in visittexts]
visits = [(label, int(time)) for label,time in visitpairs]
fmt = '%10s '*5
if VERBOSE:
print fmt % tuple('ID Time Dist Tdiff Speed'.split())
prevpos = (0, 0)
prevtime = 0
visited = set()
for ID, time in visits:
if ID in visited:
error(ID, 'Already visited!')
tdiff = time - prevtime
if tdiff < 0:
error(ID, 'Time should move forward!')
if ID == 'BASE':
newpos = (0, 0)
else:
if ID not in trackers:
error(ID, 'No such tracker')
x, y, vx, vy = trackers[ID]
newpos = (x+vx*time, y+vy*time)
if newpos == prevpos:
dist = speed = 0
else:
dist = ((newpos[0]-prevpos[0])**2 + (newpos[1]-prevpos[1])**2) ** 0.5
if tdiff == 0:
error(ID, 'Helicopters shouldn\'t teleport')
speed = dist / tdiff
if speed > 5000:
error(ID, 'Helicopter can\'t fly at', speed)
if VERBOSE:
print fmt % (ID, time, int(dist), tdiff, int(speed))
visited.add(ID)
prevpos = newpos
prevtime = time
if ID != 'BASE':
error(ID, 'Must finish at the BASE')
if visited != shouldvisit:
error((shouldvisit - visited), 'Not visited')
print 'Successful tour in %u seconds.' % time
Pontuação
Sua pontuação será sua última vez em segundos. Menor é melhor. O vencedor será a resposta com o tempo mais rápido no conjunto de dados de teste após o retorno à base. No resultado de um empate, a entrada mais antiga vencerá.
Poste soluções com o título "Idioma, Pontuação: NNN", o código e a string da solução de saída (com várias visitas por linha preferida).
fonte
Respostas:
Python, Pontuação:
2061717461Não tenho muita experiência com esses tipos de problemas e realmente não sei quais são os métodos mais conhecidos, mas usei um método com o qual tive um sucesso moderado no passado e estou interessado em ver como ele se compara para outras respostas.
Em primeiro lugar, observe que isso sempre tenta maximizar a velocidade entre os nós, chegando tão perto de 5000 cm / s quanto um valor integral permite. Não sei se isso é necessariamente ideal, mas remover um certo grau de liberdade obviamente torna as coisas muito mais simples.
O passo inicial é criar um caminho simplesmente escolhendo um destino após o outro. Nesta decisão, cada alvo é ponderado negativamente pela distância que o alvo está da posição atual e ponderado positivamente pela distância média do alvo a todos os demais nós possíveis. Dessa forma, ele tenta buscar destinos mais próximos a ele em relação a outros nós.
Depois de criar um caminho inicial, ele passa por ele, pegando todos os
b
nós consecutivos e testando o novo tempo do caminho para cada permutação desses nós. * Repete esse processo até que isso não faça nenhuma alteração no caminho.* O valor padrão de
b
é4
, no entanto, o valor fornecido como minha pontuação é o meu resultado para executá-lob=6
. Posso executá-lo com valores mais altos e atualizar minha pontuação posteriormente.Editar:
Fiz uma pequena modificação no processo de decisão do caminho inicial, que agora considera os alvos mais rápidos como prioridade mais alta. Isso parece ser uma melhoria muito significativa.
Para executá-lo, basta usar
(Eu também sugeriria usar
pypy
algo assim, pois leva algum tempo para ser executado)Exemplo de saída:
fonte
Python 3, pontuação = 21553
O programa usa uma abordagem ingênua e gananciosa. Ele sempre calcula onde deve pegar um rastreador (qualquer um deles) no menor tempo possível. É executado em alguns segundos.
Rota:
fonte