Nasıl 100 hareketli hedefler arasında en kısa yol bulabilirim? (Demo dahil canlı.)
Arka plan
Bu resim sorunu göstermektedir:
Kırmızı daire kontrol edebilirim. Hedef mavi üçgenler vardır. Siyah oklar hedefleri hangi yöne hareket edeceğini gösteriyor.
Adımları en az sayıda tüm hedefleri toplamak istiyorum.
1 Adım ya da hareket etmeliyim her dönüşte yukarı ya da Aşağı/Sol/Sağ.
Her hedefleri de bu yönde tablosu gösterildiği göre 1 Adım hareket edecek çevirin.
Demo
Sorun here on Google appengine oynanabilir bir demo hazırladım.
Eğer herkes bu benim şimdiki algoritma vasatın altında olduğunu gösteriyor gibi hedef puanı yendi olursa çok sevinirim. (Tebrik mesajı eğer bunu başarırsanız basılı olmalıdır!)
Sorun
Benim şimdiki algoritma çok kötü hedefleri sayısı ile ölçekler. Zaman katlanarak artar ve 16 balık için zaten birkaç saniye.
32*32 ve 100 hareketli hedef tahtası boyutları için cevap hesaplamak istiyorum.
Soru
Verimli bir algoritma (ideal Javascript) tüm hedefleri toplamak için gereken adımları en az sayıda bilgisayar için nedir?
Denedim
Benim şimdiki yaklaşım memoisation dayanır ama çok yavaş ve her zaman en iyi çözüm üretecektir olup olmadığını bilmiyorum.
Ben subproblem çözmek "hedefler, belirli bir dizi toplamak ve belirli bir hedefe bitirmek için gerekli adımları en az sayıda nedir?".
Bu subproblem önceki hedef için her tercih etti inceleyerek yinelemeli olarak çözülür. Sanırım bu her zaman en iyi toplamak için önceki alt hedefi mümkün olduğunca hızlı bir şekilde ve daha sonra hareket konumunu sona erdi mevcut hedef mümkün olduğunca hızlı bir şekilde (her ne kadar ben bilmiyorum olsun bu geçerli bir varsayım).
Bu*2^n hesaplanacak Birleşik Devletleri hızla büyüyen n olur.
Geçerli kod aşağıda gösterilmiştir:
var DX=[1,0,-1,0];
var DY=[0,1,0,-1];
// Return the location of the given fish at time t
function getPt(fish,t) {
var i;
var x=pts[fish][0];
var y=pts[fish][1];
for(i=0;i<t;i ) {
var b=board[x][y];
x =DX[b];
y =DY[b];
}
return [x,y];
}
// Return the number of steps to track down the given fish
// Work by iterating and selecting first time when Manhattan distance matches time
function fastest_route(peng,dest) {
var myx=peng[0];
var myy=peng[1];
var x=dest[0];
var y=dest[1];
var t=0;
while ((Math.abs(x-myx) Math.abs(y-myy))!=t) {
var b=board[x][y];
x =DX[b];
y =DY[b];
t =1;
}
return t;
}
// Try to compute the shortest path to reach each fish and a certain subset of the others
// key is current fish followed by N bits of bitmask
// value is shortest time
function computeTarget(start_x,start_y) {
cache={};
// Compute the shortest steps to have visited all fish in bitmask
// and with the last visit being to the fish with index equal to last
function go(bitmask,last) {
var i;
var best=100000000;
var key=(last<<num_fish) bitmask;
if (key in cache) {
return cache[key];
}
// Consider all previous positions
bitmask -= 1<<last;
if (bitmask==0) {
best = fastest_route([start_x,start_y],pts[last]);
} else {
for(i=0;i<pts.length;i ) {
var bit = 1<<i;
if (bitmask&bit) {
var s = go(bitmask,i); // least cost if our previous fish was i
s =fastest_route(getPt(i,s),getPt(last,s));
if (s<best) best=s;
}
}
}
cache[key]=best;
return best;
}
var t = 100000000;
for(var i=0;i<pts.length;i ) {
t = Math.min(t,go((1<<pts.length)-1,i));
}
return t;
}
Kabul ettik ne
Merak ettiğim bazı seçenekler şunlardır:
Ara sonuçları önbelleğe alma. Mesafe hesaplama, simülasyon ve ara sonuçlar çok önbelleğe alınmış olabilir tekrarlar.
Ancak, bu üstel karmaşıklık olması onu durduracağını sanmıyorum.* Bir ara uygun bir buluşsal yöntem ne olacağını ve ne kadar etkili bu uygulamada olur açık olsa da algoritma.
Gezgin satıcı problemi için iyi algoritmalar araştıran ve eğer bu sorun için geçerli olmadığını görmek.
Bunun için uygun bir cevap aramaya problem NP-zor ve dolayısıyla da anlamsız olduğunu kanıtlamaya çalışıyor.
CEVAP
Literatür araştırıldı mı? Senin sorunun analiz görünüyor ki, bu kağıtları buldum:
"Hareketli hedefleri izleme ve durağan olmayan gezgin satıcı ": http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.85.9940 . sorun
"Hareket eden hedef gezgin satıcı problemi": http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.6403
GÜNCELLEME 1:
İki gazete yukarıdaki Öklid metrik doğrusal hareket konsantre görünüyor.
Gıt değişikliği nasıl bulabilirim aras...
Nasıl Sturm ile Waldo bulabilirim?...
Nasıl dosya adları iki iptalleri arası...
Nasıl `klon` da dahil olmak üzere alt ...
Nasıl C kaynak dosyaları arasında pay ...