viernes, 29 de marzo de 2019

16 Highest Paying URL Shortener to Earn Money Online 2019

  1. Clk.sh: Clk.sh is a newly launched trusted link shortener network, it is a sister site of shrinkearn.com. I like ClkSh because it accepts multiple views from same visitors. If any one searching for Top and best url shortener service then i recommend this url shortener to our users. Clk.sh accepts advertisers and publishers from all over the world. It offers an opportunity to all its publishers to earn money and advertisers will get their targeted audience for cheapest rate. While writing ClkSh was offering up to $8 per 1000 visits and its minimum cpm rate is $1.4. Like Shrinkearn, Shorte.st url shorteners Clk.sh also offers some best features to all its users, including Good customer support, multiple views counting, decent cpm rates, good referral rate, multiple tools, quick payments etc. ClkSh offers 30% referral commission to its publishers. It uses 6 payment methods to all its users.
    • Payout for 1000 Views: Upto $8
    • Minimum Withdrawal: $5
    • Referral Commission: 30%
    • Payment Methods: PayPal, Payza, Skrill etc.
    • Payment Time: Daily

  2. Shrinkearn.com: Shrinkearn.com is one of the best and most trusted sites from our 30 highest paying URL shortener list.It is also one of the old URL shortener sites.You just have to sign up in the shrinkearn.com website. Then you can shorten your URL and can put that URL to your website, blog or any other social networking sites.
    Whenever any visitor will click your shortener URL link you will get some amount for that click.The payout rates from Shrinkearn.com is very high.You can earn $20 for 1000 views.Visitor has to stay only for 5 seconds on the publisher site and then can click on skip button to go to the requesting site.
    • The payout for 1000 views- up to $20
    • Minimum payout-$1
    • Referral commission-25%
    • Payment methods-PayPal
    • Payment date-10th day of every month

  3. Linkrex.net: Linkrex.net is one of the new URL shortener sites.You can trust it.It is paying and is a legit site.It offers high CPM rate.You can earn money by sing up to linkrex and shorten your URL link and paste it anywhere.You can paste it in your website or blog.You can paste it into social media networking sites like facebook, twitter or google plus etc.
    You will be paid whenever anyone will click on that shorten a link.You can earn more than $15 for 1000 views.You can withdraw your amount when it reaches $5.Another way of earning from this site is to refer other people.You can earn 25% as a referral commission.
    • The payout for 1000 views-$14
    • Minimum payout-$5
    • Referral commission-25%
    • Payment Options-Paypal,Bitcoin,Skrill and Paytm,etc
    • Payment time-daily

  4. Linkbucks: Linkbucks is another best and one of the most popular sites for shortening URLs and earning money. It boasts of high Google Page Rank as well as very high Alexa rankings. Linkbucks is paying $0.5 to $7 per 1000 views, and it depends on country to country.
    The minimum payout is $10, and payment method is PayPal. It also provides the opportunity of referral earnings wherein you can earn 20% commission for a lifetime. Linkbucks runs advertising programs as well.
    • The payout for 1000 views-$3-9
    • Minimum payout-$10
    • Referral commission-20%
    • Payment options-PayPal,Payza,and Payoneer
    • Payment-on the daily basis

  5. Adf.ly: Adf.ly is the oldest and one of the most trusted URL Shortener Service for making money by shrinking your links. Adf.ly provides you an opportunity to earn up to $5 per 1000 views. However, the earnings depend upon the demographics of users who go on to click the shortened link by Adf.ly.
    It offers a very comprehensive reporting system for tracking the performance of your each shortened URL. The minimum payout is kept low, and it is $5. It pays on 10th of every month. You can receive your earnings via PayPal, Payza, or AlertPay. Adf.ly also runs a referral program wherein you can earn a flat 20% commission for each referral for a lifetime.
  6. Wi.cr: Wi.cr is also one of the 30 highest paying URL sites.You can earn through shortening links.When someone will click on your link.You will be paid.They offer $7 for 1000 views.Minimum payout is $5.
    You can earn through its referral program.When someone will open the account through your link you will get 10% commission.Payment option is PayPal.
    • Payout for 1000 views-$7
    • Minimum payout-$5
    • Referral commission-10%
    • Payout method-Paypal
    • Payout time-daily

  7. Cut-win: Cut-win is a new URL shortener website.It is paying at the time and you can trust it.You just have to sign up for an account and then you can shorten your URL and put that URL anywhere.You can paste it into your site, blog or even social media networking sites.It pays high CPM rate.
    You can earn $10 for 1000 views.You can earn 22% commission through the referral system.The most important thing is that you can withdraw your amount when it reaches $1.
    • The payout for 1000 views-$10
    • Minimum payout-$1
    • Referral commission-22%
    • Payment methods-PayPal, Payza, Bitcoin, Skrill, Western Union and Moneygram etc.
    • Payment time-daily

  8. Ouo.io: Ouo.io is one of the fastest growing URL Shortener Service. Its pretty domain name is helpful in generating more clicks than other URL Shortener Services, and so you get a good opportunity for earning more money out of your shortened link. Ouo.io comes with several advanced features as well as customization options.
    With Ouo.io you can earn up to $8 per 1000 views. It also counts multiple views from same IP or person. With Ouo.io is becomes easy to earn money using its URL Shortener Service. The minimum payout is $5. Your earnings are automatically credited to your PayPal or Payoneer account on 1st or 15th of the month.
    • Payout for every 1000 views-$5
    • Minimum payout-$5
    • Referral commission-20%
    • Payout time-1st and 15th date of the month
    • Payout options-PayPal and Payza

  9. LINK.TL: LINK.TL is one of the best and highest URL shortener website.It pays up to $16 for every 1000 views.You just have to sign up for free.You can earn by shortening your long URL into short and you can paste that URL into your website, blogs or social media networking sites, like facebook, twitter, and google plus etc.
    One of the best thing about this site is its referral system.They offer 10% referral commission.You can withdraw your amount when it reaches $5.
    • Payout for 1000 views-$16
    • Minimum payout-$5
    • Referral commission-10%
    • Payout methods-Paypal, Payza, and Skrill
    • Payment time-daily basis

  10. Bc.vc: Bc.vc is another great URL Shortener Site. It provides you an opportunity to earn $4 to $10 per 1000 visits on your Shortened URL. The minimum withdrawal is $10, and the payment method used PayPal or Payoneer.
    Payments are made automatically on every seven days for earnings higher than $10.00. It also runs a referral system wherein the rate of referral earning is 10%.
    • The payout for 1000 views-$10
    • Minimum payout -$10
    • Referral commission-10%
    • Payment method -Paypal
    • Payment time-daily

  11. Oke.io: Oke.io provides you an opportunity to earn money online by shortening URLs. Oke.io is a very friendly URL Shortener Service as it enables you to earn money by shortening and sharing URLs easily.
    Oke.io can pay you anywhere from $5 to $10 for your US, UK, and Canada visitors, whereas for the rest of the world the CPM will not be less than $2. You can sign up by using your email. The minimum payout is $5, and the payment is made via PayPal.
    • The payout for 1000 views-$7
    • Minimum payout-$5
    • Referral commission-20%
    • Payout options-PayPal, Payza, Bitcoin and Skrill
    • Payment time-daily

  12. Short.pe: Short.pe is one of the most trusted sites from our top 30 highest paying URL shorteners.It pays on time.intrusting thing is that same visitor can click on your shorten link multiple times.You can earn by sign up and shorten your long URL.You just have to paste that URL to somewhere.
    You can paste it into your website, blog, or social media networking sites.They offer $5 for every 1000 views.You can also earn 20% referral commission from this site.Their minimum payout amount is only $1.You can withdraw from Paypal, Payza, and Payoneer.
    • The payout for 1000 views-$5
    • Minimum payout-$1
    • Referral commission-20% for lifetime
    • Payment methods-Paypal, Payza, and Payoneer
    • Payment time-on daily basis

  13. Fas.li: Although Fas.li is relatively new URL Shortener Service, it has made its name and is regarded as one of the most trusted URL Shortener Company. It provides a wonderful opportunity for earning money online without spending even a single $. You can expect to earn up to $15 per 1000 views through Fas.li.
    You can start by registering a free account on Fas.li, shrink your important URLs, and share it with your fans and friends in blogs, forums, social media, etc. The minimum payout is $5, and the payment is made through PayPal or Payza on 1st or 15th of each month.
    Fas.li also run a referral program wherein you can earn a flat commission of 20% by referring for a lifetime. Moreover, Fas.li is not banned in anywhere so you can earn from those places where other URL Shortening Services are banned.
  14. BIT-URL: It is a new URL shortener website.Its CPM rate is good.You can sign up for free and shorten your URL and that shortener URL can be paste on your websites, blogs or social media networking sites.bit-url.com pays $8.10 for 1000 views.
    You can withdraw your amount when it reaches $3.bit-url.com offers 20% commission for your referral link.Payment methods are PayPal, Payza, Payeer, and Flexy etc.
    • The payout for 1000 views-$8.10
    • Minimum payout-$3
    • Referral commission-20%
    • Payment methods- Paypal, Payza, and Payeer
    • Payment time-daily

  15. CPMlink: CPMlink is one of the most legit URL shortener sites.You can sign up for free.It works like other shortener sites.You just have to shorten your link and paste that link into the internet.When someone will click on your link.
    You will get some amount of that click.It pays around $5 for every 1000 views.They offer 10% commission as the referral program.You can withdraw your amount when it reaches $5.The payment is then sent to your PayPal, Payza or Skrill account daily after requesting it.
    • The payout for 1000 views-$5
    • Minimum payout-$5
    • Referral commission-10%
    • Payment methods-Paypal, Payza, and Skrill
    • Payment time-daily

  16. Short.am: Short.am provides a big opportunity for earning money by shortening links. It is a rapidly growing URL Shortening Service. You simply need to sign up and start shrinking links. You can share the shortened links across the web, on your webpage, Twitter, Facebook, and more. Short.am provides detailed statistics and easy-to-use API.
    It even provides add-ons and plugins so that you can monetize your WordPress site. The minimum payout is $5 before you will be paid. It pays users via PayPal or Payoneer. It has the best market payout rates, offering unparalleled revenue. Short.am also run a referral program wherein you can earn 20% extra commission for life.

Return To Planet X Game For Android APK And OBB Link

Today Gaming Guruji has brought you, Return to Planet X, which is another premium action game for android and if you loved to play Slaughter 2 game than you are going to enjoy this action game too.
Return to planet x game Android

Game story is something like that you are all alone left in another planet at some secret military base, all your other teammates has been died and now you have to complete the mission all alone where you will face alien bugs who looks like spiders.

You will find weapons, medical kit and other stuff in safe. To open the Safe, just go near to it and when you see a wrench symbol on that just toch that.. That is how you interact with objects in the game.

Return to planet x game may be liked by those who love to play offline and less violent game, if you love to play offline first person shooting game and violence than you should try Modern combat 4 or Max payne on android device.

This game's sound create the game environment so scary and as there is not much light and you'll see Skeltons, dead alien bugs and some other stuff, you might not have seen in other games.

As far as armour you get in this game, Return to planet x, are Laser guns, grenades, explosives, machine gun and flamethrower.

I would say game is good and you can try it if you play offline games and you are kind of first person shooting game lovers as It is the first person shooting game.

Because of good graphics and different kind of Game story, you'll definitely enjoy it but what I found that game controls are bit different in the game which you can not customize except sensitivity but it's ok.

How to Install Return to planet x Game on Android :

  1. Go to settings ->Security.
  2. Go to Security menu and check Unknown Sources check box first.
  3. Get the RTPX data that are mostly in obb format. 
  4. Extract the Return to Planet X Game obb file by using any zip extractor.
  5. Now after extracting you have a folder with obb file(s). Put this folder or directly extract into the location internal memory/Android/obb/. 
    Note: Don't put the obb file without folder because you need to provide the correct path.
  6. Extract apk from zip file and Install APK. 
  7. Now run your game without any errors.

You can get Return to Planet X game from play store at $8 or ₹590 or check out the below links.

APK LINK




OBB LINK

The Dark Secret... / L'Oscuro Segreto...

ENGLISH
Halloween Knight 2 hides a dark secret: among its levels there are 3 that hide a secret passage. Each of them will let you discover a fragment of a mysterious password: type it at the title screen to reveal the arcane (be sure to enter it in uppecase).
Below you can find some clues that will help you in the search.

ITALIANO
Halloween Knight 2 nasconde un oscuro segreto: tra i suoi livelli ce ne sono 3 che celano un passaggio segreto, passaggio che vi porterà a scoprire ognuno un frammento di una parola chiave che, inserita alla schermata del titolo (scrivetela tutta in maiuscolo, mi raccomando) svelerà l'arcano...
Qui di seguito troverete qualche indizio che vi aiuterà nella ricerca.
1. Tu non puoi vedere ciò che il cavaliere vede.
1. You can't see what the Knight sees.













2. La pazienza è la virtù dei forti.
2. Patience is a great virtue.













3. Fare prima ciò che deve essere fatto dopo.
3. Do first what it must be done after.

Rise Of The Valiant


This is part of The Kingdoms storyline series. As it unfolds you will read how one marooned space captain's quest for revenge snowballs into a strong, proud Empire dedicated to upholding justice. Edge Valiant has suffered a mutiny aboard his previous ship the Indomitable and been stranded on an unknown planet. His only belongings are a broken matter manipulator attached to his wrist and the meager clothes on his back. Forced to survive on an alien world, Edge is determined to not only survive, but to rebuild and track down those who have wronged him.

Table of Contents

jueves, 28 de marzo de 2019

WWE 2K17 GAME ON ANDROID FOR FREE !

WWE 2K17 ON ANDROID FOR FREE !


ʜᴏᴡ ᴛᴏ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴᴅ ɪɴsᴛᴀʟʟ ɪɴ ʏᴏᴜ ᴀɴᴅʀᴏɪᴅ ᴅᴇᴠɪᴄᴇ

Download the wwe2k17 PSP by falcon arrow.

Download the save data file (Zipfile).

Then download the ppssp.in(Fix Data)

Download all three File Extract the second file ( save data ) copy that and go into your ppsspp emulator file paste in Savedata folder then copy the third file go to your ppsspp emulator folder paste it in the system folder.

Now open Emulator finds the folder where you download the first file you will wwe2k17 game open and Enjoy.

You'll Need ZArchiever App You Can Download It For Free From PlayStore.

PPSSPP GOLD DOWNLOAD PPSSPP GOLD

[DOWNLOAD ALL 3 FILES BELOW]


▪️ WWE 2K17 Iso: DOWNLOAD 2K17 ISO
▪️ WWE 2K17 SAVE DATA: DOWNLOAD 2K17 SAVE DATA
▪️ WWE 2K17 FIX DATA: DOWNLOAD 2K17 FIX DATA

➡️SUBSCRIBE OUR YOUTUBE CHANNEL

How To Download Prince Of Persia Shadow



Welcome to my channel. My name is Ashik.


Awesome screenshots in this game---








First you will download this apk
APK : https://oceanofapk.com/HereYouGo.php

Then you will install this apk. After installing you will click your apk and enjoy this game. So friends plzz
my channel 
               Tnx!!!! 

Explore Simple Game Algorithms With Color Walk: Part 8

We're continuing this ongoing saga of different game algorithms using the simple game Color Walk. In the last post we started exploring the fundamental graph search algorithms with breadth-first search (BFS), because after all, the full set of move choices and resulting board positions of any game can be arranged as a graph. After looking at BFS and finding that we can nominally improve the search for shortest number of moves, on average, it's time we look at the close sibling of BFS: depth-first search (DFS). We'll quickly run into performance issues just like we did for BFS, but let's see if we can come up with a reasonable way to limit DFS so that it can be a useful algorithm.

DFS in Theory


We saw in the last post that BFS searches a graph (or in the case of games like Color Walk, a tree of board positions generated from moves) one level at a time. All child nodes of the root are searched before any of the children's child nodes are searched, and so forth until the desired search criteria is met. In the case of DFS, the opposite is done. One branch of the tree is searched all the way down to its left-most leaf node, which in the case of game move trees is the end-of-game condition, and then the algorithm backs up and searches down the next branch. The process is repeated until the entire tree is searched, and then the optimal node or path to that node is returned as the result. The following picture illustrates how a tree of height 3 would be searched with DFS:

Tree searched with depth-first search

This move tree is drawn for Color Walk assuming there are three colors to pick from, and the numbers in each node show the order that each node is visited during the search. Comparing this to BFS, we'll notice that while BFS has the desirable property that the first node found satisfying the search criteria is also the node with the shortest sequence of moves to reach it, DFS does not have this property. If node 7 is an end-of-game position, but node 13 is also an end-of-game position (assuming nodes 14 and 15 are removed), then after finding node 7, we have to continue searching to be sure we find the best move sequence at node 13.

So why would we want to use DFS if it doesn't find the best node first, like BFS does? First of all, an application may not require the solution with the shortest path, only a solution with a reasonable path, and DFS may be able to find it faster than BFS. This doesn't apply in the case of Color Walk because we are interested in the shortest path, but even in this case we could be satisfied with a path shorter than any others that we've found by other methods.

Secondly, DFS uses less memory than BFS, especially as the tree grows to more and more levels. Searching the above binary tree with a height of 10 using BFS would require a queue with space for 1,024 nodes to hold all of the nodes at the 10th level. On the other hand, DFS keeps track of which path its on using a stack—normally the call stack if it's implemented recursively—and only requires space for 10 nodes to search the same tree. The divergence in memory requirements between the two methods is exponential.

Even though it uses significantly less memory, DFS runs into another problem with Color Walk that can be seen if you think about the extension of the above graph. What happens to that far left path of alternating blue and red moves in the actual game? After not too many moves, we will stop making forward progress in the game because no more blocks will be removed. All of the remaining blocks bordering the grey area would be yellow. We're avoiding choosing the same color multiple times in a row, but that is not enough to avoid searching down a path of infinite length. In fact, the very first path we'll take will be infinite! In addition to that, any path that never chooses one of the colors will go on forever. There are an infinite number of paths in this tree that are infinitely long. Yikes! We could be searching for a long time.

To avoid the problem of infinite paths, we'll have to be careful with implementing DFS for Color Walk. We'll need to either limit the number of moves that we'll search down the tree before giving up on that path, or cut off the search on a given path as soon as we try a move that doesn't remove any blocks, because such a move path can't possibly be optimal. It's likely beneficial to limit the search both ways.

While this problem may seem specific to Color Walk, it is in fact a common problem for DFS to get trapped in loops. Care must be taken to make sure loops are detected and the search of those paths terminated so that the algorithm doesn't run on forever.

DFS in Practice


With the general theory covered, we are ready to start implementing our DFS algorithm. We'll start with the tactic of limiting the search by the number of moves and terminating search paths when a move is encountered that doesn't remove any blocks. We also need to limit the total search time in some way because otherwise we'll be searching at least as long as the pure BFS algorithm, which was thousands of years. We'll limit the search time to a minute and see what a run on a single board can find. Then we can look at optimizations to search more of the tree in that time before doing a batch run of 100 boards.

The first thing we need to do is add a DFS algorithm to the list of algorithms:
  function Solver() {
// ...

this.init = function() {
// ...

$('#solver_type').change(function () {
switch (this.value) {
// ...
case 'dfs':
that.solverType = that.dfs;
that.metric = areaCount;
break;
default:
that.solverType = that.roundRobin;
break;
}

// ...
});

// ...
}
The normal heuristic that will be used is again areaCount() because we'll want to count blocks removed when checking if we should give up on a search path. We'll be able to call the endOfGame() check directly when we need to, but we'll get into that more in a bit. First, let's look at the high-level setup function of dfs():
    this.dfs = function() {
var state = {min_moves: 50, moves: null, stop_time: performance.now() + 60000};

_.each(controls, function(control) {
var matches = control.checkGameBoard(1, that.metric);
if (matches === 0) return;
state = dfsNext(2, control, matches, state);
});

markers = state.moves;
doMarkedMoves();
}
The first thing this algorithm does is initialize a state object that will hold some important information on the progress that's being made during the search. It contains the minimum number of moves found so far initialized to 50 moves, a copy of the match record of the board that led to that minimum number of moves, and a time that indicates when we should cut off the search. The match record is the same one used to keep track of sequences of moves in the BFS queue. The stop time doesn't necessarily need to be in this state object because it'll never change, but it's included for convenience.

Then the algorithm runs through each control, checking the board for matching blocks. If there are none, it skips to the next control. Otherwise, it calls the recursive function of DFS so that it can search deeper down that path. Each call to dfsNext() passes the state object and returns the state object so that it can be continually passed down to each searched node to be used to limit search depth and get updated as necessary. The current control and number of matches are also passed down to limit searches if the same control is used twice or no new matches are found in the child node.

The algorithm wraps up by copying the move markers from the minimum number of moves found during the search back into the markers array, and then calling doMarkedMoves() to run through those moves on the board. All of this stuff is fairly straightforward, so the real meat of the algorithm remains to be seen in dfsNext():
    function dfsNext(move, prev_control, prev_matches, state) {
if (performance.now() > state.stop_time) return state;

for (var i = 0; i < 5; i++) {
var control = controls[(i + move) % 5];
if (control === prev_control || move >= state.min_moves) continue;

var matches = control.checkGameBoard(move, that.metric);
if (matches === prev_matches) continue;

if (endOfGame()) {
state.min_moves = move;
state.moves = markers.slice();
continue;
}

state = dfsNext(move + 1, control, matches, state);
};

return state;
}
Half of this function is actually checks to limit the search so as to speed up the algorithm. The core of the algorithm is actually just eight lines of code (including closing braces). The function first checks if it should stop because it's over time. Once the stop time is reached, this line will quickly end all further searching on any leftover branches in the move tree.

If there's still time, we'll look at each of the five controls. I implemented this as a for loop instead of a _.each() because I wanted to rotate through the controls, starting with a different control each time, as the search went deeper into the tree. Otherwise, the same controls would always be searched first, giving a long search path and a huge tree to start with that would just waste time because the search wouldn't be making progress towards the end of the game fast enough. Selecting the next control with controls[(i + move} % 5] neatly produces this behavior of rotating through the controls with increasing search depth.

Then we start checking if we should terminate the current search path. If the control is the same as the last control or if this move has already reached the minimum number of moves found so far, we should bail right away. Similarly, if the current control doesn't remove any new blocks, the current path is a dud.

The last check is directly related to the DFS algorithm. If we've reached the end-of-game condition, then we can update the state object with a new minimum moves and the marker array containing the sequence of moves. How do we know for sure that the number of moves is a new minimum? Because if it wasn't, we would have already quit this search path. At this point we quit this search path anyway because we reached the end.

If all of those checks fail, then we drop down to the next level of the tree by calling dfsNext() again with the same parameters, except for incrementing the move number. This algorithm should look very familiar because we've used it extensively already. It has the exact same structure as the Greedy Look Ahead (GLA) algorithm with the only differences being that in GLA we parameterized the search depth so that the user could pick it, and we did a full DFS to that depth so that we could pick the path that maximized some heuristic. Here we're looking for a specific end condition instead of maximizing a metric.

The hope in using the DFS algorithm to its full depth is that the short-path solutions in the move tree are relatively evenly distributed and plentiful, so that even though we can't search the entire tree, we would expect to find a reasonably short solution without searching for too long. How does our algorithm perform in practice? Not too great. On the first board the GLA algorithm finds a solution in 34 moves when looking ahead 6 moves. Letting DFS run for a minute, which is longer than GLA-6 takes to find its solution, turns up a solution in 42 moves. Letting it run for a full 10 minutes doesn't find anything better than that.

DFS in Reality


As a sanity check for the performance of the algorithm, I decided to put in a counter to track how many nodes were visited during a run. It turns out that over a minute only about 550 nodes were checked, and after 10 minutes about 5,000 nodes were checked. That means it took over 100 milliseconds to check a node, which seems high, even for JavaScript. I put a stop watch in to see how long it was taking to check each node, and I found that when the move depth was shallow, checking a node for removed blocks was quite fast, but as the move depth increased, the time it took to check a node increased rapidly:
  • Move depth of 20: < 1 msec
  • Move depth of 30: 15 msec
  • Move depth of 40: 100 msec
  • Move depth of 47: 500+ msec
It appears as though function calls take a huge hit in performance as the call stack gets deeper. If I limited the move depth to 30 moves, DFS could search over 6,800 nodes in a minute. That's over an order of magnitude improvement! Of course, it didn't find any solutions, but it could not find a solution much faster.

Two important things that we've learned so far are that (1) short-path solutions are probably not as evenly distributed in the tree as we had hoped, and (2) those solutions are not as plentiful as we would like. We're going to have to set up DFS so that it will have a better chance of success. To get this algorithm to a point where it would actually be usable, we should try combining it with our good-old workhorse, GLA. We can even do the same thing as we did for BFS, and run with GLA for the first 18 moves before switching over to DFS. Then see if we can find a good solution in the next 30 moves so as to keep the call stack short and the searching fast.

This change is super easy to make, as almost everything we need is already available. All we have to do is add a few lines to dfs():
    this.dfs = function() {
if (moves < 18) {
this.greedyLookAhead();
return;
}

var state = {min_moves: 30, moves: null, stop_time: performance.now() + 60000};

_.each(controls, function(control) {
var matches = control.checkGameBoard(1, that.metric);
if (matches === 0) return;
state = dfsNext(2, control, matches, state);
});

markers = state.moves;
doMarkedMoves();
}
Now the algorithm will use GLA to whatever look-ahead depth the user specifies for the first 18 moves before switching to DFS for the last moves. It should be able to find a solution for every board by allowing a depth of 30 moves for the DFS phase because the maximum solution of moves found for GLA-5 was 41, and this setup allows for up to 48 moves. The batch run of 100 iterations is going to take over an hour and a half to finish, but I want to give DFS its best chance at success. How did it perform?

Color Walk with depth-first search for 100 iterations


We have an average shortest-path of 34.8 moves with a standard deviation of 3.85 moves. This run was decent—not quite as good as the BFS hybrid algorithm, but still pretty good. Here's how it stacks up against a selection of the rest of the algorithms:

AlgorithmMinMeanMaxStdev
RR with Skipping 37 46.9 59 4.1
Random with Skipping 43 53.1 64 4.5
Greedy 31 39.8 48 3.5
Greedy Look-Ahead-2 28 37.0 45 3.1
Greedy Look-Ahead-5 25 33.1 41 2.8
Max Perimeter 29 37.4 44 3.2
Max Perimeter Look-Ahead-2 27 35.0 44 2.8
Perimeter-Area Hybrid 31 39.0 49 3.8
Deep-Path 51 74.8 104 9.4
Path-Area Hybrid 35 44.2 54 3.5
Path-Area Hybrid Look-Ahead-4 32 38.7 45 2.7
BFS with Greedy Look-Ahead-5 26 32.7 40 2.8
DFS with Greedy Look-Ahead-5 25 34.8 43 3.9

We can see that DFS was able to find a minimum move sequence of 25 moves, just like GLA-5, but it didn't perform as well for the mean or maximum. It also had a wider distribution of results than either GLA-5 or BFS. The fact that DFS performs better when the shortest path is shorter and not as well when the shortest path is longer would be due to the DFS taking much longer to search for more optimal paths when the first path it finds is longer and the depth limit for searching the tree is correspondingly deeper. When the algorithm has to search to a depth of 30, it has to search a much larger tree to find a shorter path than if it can start searching to a depth of 15 or so. It may even be able to complete its search of the sub-tree if it finds a very short path early that can limit the depth of the search for the rest of the tree.

A couple ways to improve this hybrid DFS algorithm immediately come to mind. First, we could speed up the search implementation by creating our own stack instead of using JavaScript's call stack. This iterative approach would likely substantially outperform the recursive approach because it shouldn't slow down excessively for deeper search depths. That would allow for searching significantly more nodes in the same amount of time. Second, we could do a preliminary quick search to see how deep the paths are for a few seconds of searching, and then continue using GLA if the path found was too long so as to reduce the search tree height some more before running DFS for the full minute. This strategy would likely bring down the shortest paths for boards that have the longest shortest paths and tighten up the distribution more.

At some point an optimized DFS starts to perform a lot like BFS because it will fully search the section of the tree that it comes to after GLA, and it will end up finding the same shortest-path that BFS would. The advantage of DFS may come from being able to squeeze more performance out of it than BFS, and thus being able to search a larger section of the move tree in the same amount of time. Remember, a DFS algorithm only needs a stack with a size equal to the height of the tree, while BFS will need a queue with a size of at least 4height, making it much less efficient to search large sub-trees.

In either case the improvement of DFS would likely be only marginally better than GLA-5, so we'll move on from BFS and DFS to explore a new shortest-path algorithm next time: Dijkstra's Algorithm.


Article Index
Part 1: Introduction & Setup
Part 2: Tooling & Round-Robin
Part 3: Random & Skipping
Part 4: The Greedy Algorithm
Part 5: Greedy Look Ahead
Part 6: Heuristics & Hybrids
Part 7: Breadth-First Search
Part 8: Depth-First Search
Part 9: Dijkstra's Algorithm
Part 10: Dijkstra's Hybrids
Part 11: Priority Queues
Part 12: Summary