The other day I realized there was something missing in my life, so I set out to find a solution. Online dating is in vogue, which makes sense. The Internet already has no small part in satisfying most of my other needs. I was pleased to learn that the latest popular dating app, Tinder, now has an Android client. Besides forcing me to reactivate my Facebook account, it seems simple enough. Unfortunately, I quickly realized that this was going to turn in to a massive time sink. Perhaps, I thought, I could optimize it?
I did some simple man in the middle packet sniffing to reverse engineer the Tinder API. It's pretty simple. Send your location, grab a handful of images and user ids, and tell the server which ones you liked. I wrote a minimal Python client in Ubuntu and began designing an algorithm to speed up the process a bit. The algorithm first segments the main image by finding all of the faces via OpenCV. If none are found the candidate is discarded. If multiple faces are found the end score will be the average of all of them. This seems to work since people tend to associate with those of similar levels of attractiveness. Facial attractiveness is surprisingly uncomplicated to quantify. Essentially, evolution has us seeking partners that are as "normal" as possible. Anything that is unusually big or small, any ratio that differs from \phi, or about 1.618, hurts the score. After the face(s) are identified in the image, a mask of 25 anthropometric proportion indices is overlaid and mean compliance is measured. This is also done with a custom OpenCV routine.
The client also has messaging capabilities. After a match is identified the algorithm sends a simple message "Can I have a dance?" inspired by Mos Def's success with "Ms. Fat Booty." If no response is received the candidate is discarded. If any response is received, it is ignored and a follow up message is sent "Haha okay then how about we go to a fancy seafood restaurant?" -- inspired by the classic meat-for-sex exchange that is common in the animal kingdom as well as among humans. The client uses NLTK to judge an affirmative or negative response. From here an Odesk virtual assistant coordinates dates. This also handles rescheduling but conflicts are not an issue as you will soon see.
Come date night, a Double Robot loaded with over 10 hours of pre-recorded content of me rolls up to a restaurant automatically chosen from Yelp based on reviews, distance, cost, and whether or not another double of me has a date there at the time (awkward). Reservations are made via OpenTable's API. Everything from witty, non-offensive stories to mildly embarrassing personal traits to compliments are recorded. According to the logs, candidates are often taken aback at a robot showing up, but a sincere recording complimenting their shoes immediately puts them at ease. Mostly, though, it asks questions and listens. The algorithm aims for a 4:1 ratio of listening to presenting. Based on tone of voice computed by DSP, the system knows which topics to go deeper on and which to avoid, organized in a tree structure in memory. If things are going poorly the emergency "tell me about your cat" routine is run and the microphone is muted to prevent the Speech to Text processor from running useless cycles.
The check is paid via E La Carte and a car is called with Uber's API. If the algorithm has not been meeting its heuristics the candidate is driven home and the robot self-destructs after uploading its data to the cloud so future iterations can learn from its mistakes. If it has been going well an AirBnB room is insta-booked and the Uber drives there. Once in the room a music playlist is algorithmically generated with Spotify and the candidate's musical taste gleaned from their Facebook likes. At this moment an Instacart driver should be arriving with a $10 bottle of wine and fresh strawberries and an Exec delivers a NeuroSky Mindwave 3 and a Vibease Smart Vibrator.
Both devices connect to the Double's iPad via Bluetooth wirelessly and to the female directly. The female's brainwaves are fed in to a Learning Vector Quantization Artificial Neural Network (FABIO). At first FABIO adjusts the parameters of the Vibease mostly at random, but partially based on previous experience. Based on feedback generated by the headset the system learns and adaptively adjusts the output parameters in order to maximize EEG amplitude. Unfortunately, the complex mathematical operations required by FABIO typically exhaust the Double's battery in around 01:57-02:03 minutes, depending on the female. At this point the Double gruffly requests the female retrieve his charger. The robot records the candidate's experience with a Go Pro 3 and securely uploads the video to a private Amazon S3 bucket.
At 09:07 in the morning an Uber is automatically called for the female and three days later she will receive a heartfelt e-card/receipt. The algorithm will also wish her happy birthday on Facebook and like the top 20 percent of her Instagram photos as they are posted and start getting a lot of other likes. This continues until her Facebook relationship status switches away from single.
Ahhh modern romance. Turing would be proud. Unfortunately I haven't found the time to watch any of the videos since I'm too busy optimizing the algorithm.
Visit Rob's website robrhinehart.com, where this post first appeared.