SORU
18 Mart 2013, PAZARTESİ


Nasıl 100 hareketli hedefler arasında en kısa yol bulabilirim? (Demo dahil canlı.)

Arka plan

Bu resim sorunu göstermektedir: square_grid_with_arrows_giving_directions

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:

  1. 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.

  2. * Bir ara uygun bir buluşsal yöntem ne olacağını ve ne kadar etkili bu uygulamada olur açık olsa da algoritma.

  3. Gezgin satıcı problemi için iyi algoritmalar araştıran ve eğer bu sorun için geçerli olmadığını görmek.

  4. Bunun için uygun bir cevap aramaya problem NP-zor ve dolayısıyla da anlamsız olduğunu kanıtlamaya çalışıyor.

CEVAP
18 Mart 2013, PAZARTESİ


Literatür araştırıldı mı? Senin sorunun analiz görünüyor ki, bu kağıtları buldum:

GÜNCELLEME 1:

İki gazete yukarıdaki Öklid metrik doğrusal hareket konsantre görünüyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • Android Authority

    Android Auth

    3 NİSAN 2011
  • Tutorials Junction

    Tutorials Ju

    1 Ocak 2014