2009-03-23 23 views
11

मैं कुछ चीजों के साथ खेल रहा हूं और Kevin Bacon संख्याओं को समझने का प्रयास करने का विचार सोचा। मेरे पास एक साइट के लिए डेटा है कि इस उद्देश्य के लिए हम एक सोशल नेटवर्क पर विचार कर सकते हैं। आइए दिखाएं कि यह फेसबुक है (चर्चा के सरलीकरण के लिए)। मेरे पास लोग हैं और मेरे पास उनके दोस्तों की एक सूची है, इसलिए मेरे बीच कनेक्शन हैं। मैं एक व्यक्ति से दूसरी दूरी की दूरी की गणना कैसे कर सकता हूं (मूल रूप से, केविन बेकन संख्या)?"केविन बेकन" संख्याओं की गणना

मेरा सबसे अच्छा विचार Bidirectional search है, गहराई सीमा (कम्प्यूटेशनल जटिलता को सीमित करने और उन लोगों की समस्या से बचने के लिए जो ग्राफ में कनेक्ट नहीं हो सकते हैं), लेकिन मुझे एहसास है कि यह बल्कि बलवान बल है।

क्या छोटे उप-ग्राफ (फेसबुक पर समूहों के बराबर कुछ कहने के लिए) बेहतर हो सकता है, उनके बीच की छोटी दूरी (शायद समय से पहले) की गणना करें और फिर लिंक खोजने के लिए उनका उपयोग करने का प्रयास करें? हालांकि इसे पूर्व-गणना की आवश्यकता है, यह कई कम नोड्स को खोजना संभव कर सकता है (नोड्स व्यक्तियों के बजाय समूह हो सकते हैं, जिससे ग्राफ बहुत छोटा हो सकता है)। हालांकि यह अभी भी एक द्विपक्षीय खोज होगी।

मैं "लोकप्रिय" लोगों के लिए नोड्स की खोज करने वाले लोगों की संख्या की पूर्व-गणना भी कर सकता हूं क्योंकि उन्हें दिए गए गंतव्य व्यक्ति से जुड़ने का सबसे अच्छा मौका मिल सकता है। मुझे एहसास है कि यह संभवतः सबसे कम पथ के लिए गति का व्यापार-बंद होगा। मुझे लगता है कि मैं चौड़ाई की पहली खोज के बजाय गहराई से पहली खोज का उपयोग करना चाहता हूं, जिसे मैं अन्य मामलों में उपयोग करने की योजना बनाउंगा।

क्या कोई ऐसा करने का एक सरल/तेज़ तरीका सोच सकता है? मैं दो लोगों के बीच सबसे छोटी लंबाई खोजने में सक्षम होना चाहता हूं, इसलिए यह हमेशा एक ही अंत बिंदु (जैसे केविन बेकन समस्या में) के रूप में आसान नहीं है।

मुझे एहसास है कि ऐसी समस्याएं हैं जैसे मुझे 200 लोगों की श्रृंखला मिल सकती है, लेकिन यह मुझे हल करने के लिए तैयार की गई गहराई तक सीमित हो सकती है।

+0

बीटीडब्ल्यू, चूंकि यह फिल्मों के बारे में नहीं है, इसलिए इसे अधिक परिचित (कुछ ;-)) Erdős संख्या के बजाय केविन बेकन नंबर पर कॉल करने के लिए कोई अनिवार्य कारण नहीं है: http://en.wikipedia.org/wiki/Erdos_number – ShreevatsaR

+0

मैंने कुछ शोध करते समय उस शब्द को देखा, लेकिन इसे केविन बेकन नंबर पर कॉल करके हर कोई तुरंत जानता है कि मैं किस बारे में बात कर रहा हूं। मुझे लगा कि व्याख्या करने पर कटौती होगी। – MBCook

+0

"अलगाव की डिग्री" भी समझ में आएगी –

उत्तर

17

यह एक मानक shortest path problem है। Dijkstra's algorithm और Bellman-Ford सहित कई समाधान हैं। आप विशेष रूप से A* algorithm को देखने में देख सकते हैं और देख सकते हैं कि यह किसी विशेष नोड की डिग्री के विपरीत के संबंध में लागत कार्य के साथ कैसे प्रदर्शन करेगा। विचार सबसे लोकप्रिय नोड्स (उच्च डिग्री वाले लोगों) पर जाना होगा।

+1

+1 जैसा कि मैंने कुछ मिनटों के लिए चीजों के बारे में सोचने के बाद उल्लेख किया है, डिजस्ट्रा और बेलमैन-फोर्ड दोनों एक साधारण चौड़ाई में पहली बार खोज करेंगे, जब किनारे के वजन सभी होते हैं 1. ए * एक लायक है, क्योंकि यह ह्युरिस्टिक । सीमित गहराई के साथ, यह सबसे अच्छा हो सकता है जो आप प्राप्त कर सकते हैं। –

+0

ए * शायद इस प्रकार की खोज के लिए तीनों में से सबसे खराब है क्योंकि यह केवल ह्यूरिस्टिक के निकट नोड लौटाता है, जबकि डिजस्ट्रा के एल्गोरिदम निकटतम नोड्स में से किसी एक को लौटाता है (जिसे वह पाता है)। और इस प्रकार जल्द ही किया जा सकता है क्योंकि आप कुछ भी विशिष्ट नहीं ढूंढ रहे हैं। –

+1

@ जैस्पर - अंतर्ज्ञान यह होगा कि सबसे कम पथ अच्छी तरह से जुड़े नोड्स के माध्यम से जाते हैं - यह परीक्षण करने की परिकल्पना होगी। यदि सही है, तो ह्युरिस्टिक आपको जल्द से जल्द सबसे छोटा रास्ता देगा जिससे आप पहले (गैर-सबसे कम) संभावित मार्गों को समाप्त कर सकें। – tvanfosson

4

Dijkstra's algorithm के लिए नौकरी की तरह लगता है।

ईडी: एह, मुझे ट्रिगर इतनी तेजी से खींच नहीं लेना चाहिए था। वजन घटाने पर डिजस्ट्रा (और बेलमैन-फोर्ड) एक चौड़ाई की पहली खोज में कमी आती है, इसलिए यह बहुत उपयोगी नहीं है। ओह अच्छा।

A* algorithm, tvanfosson द्वारा उल्लिखित, इसके लिए आदर्श हो सकता है। विचार यह है कि पेड़ के प्रत्येक स्तर (आपके प्रारंभ-या अंत बिंदु पर रूट) के किसी भी क्रम में तत्व खोज और पुनरावर्ती करने के बजाय, आप यह निर्धारित करने के लिए कुछ ह्युरिस्टिक का उपयोग करते हैं कि आप किस तत्व को पहले करने जा रहे हैं। आपके मामले में एक अच्छी शर्त शायद नोड ("दोस्तों" की संख्या) की डिग्री होगी, लेकिन संभवतः आप किसी दिए गए व्यक्ति की डिग्री की कुछ मनमानी संख्या के भीतर लोगों की संख्या का उपयोग करना चाहेंगे (यानी, जिस व्यक्ति के पास है के तीन दोस्त हैं जिनके पास 100 दोस्तों के पास उस लड़के की तुलना में बेहतर नोड होने की संभावना है, जिसमें बाहरी लोगों को छेड़छाड़ में 20 दोस्त हैं)। ऐसी सभी चीजें हैं जिनका उपयोग आप एक ह्युरिस्टिक के रूप में कर सकते हैं (दोस्तों को 2 अंक मिलते हैं, दोस्तों के दोस्तों को 1 बिंदु मिलता है; जो कुछ भी प्रयोग होता है)।

इसे गहराई सीमा के साथ संयोजित करें (पृथक्करण के 6 डिग्री के बाद काट लें, या जो भी हो), और आप अपने औसत मामले में काफी सुधार कर सकते हैं (सबसे खराब मामला अभी भी मूल बीएफएस के समान है)।

+0

सहमत है, मैंने केविन बेकन समस्या को हल करने के लिए डिजस्ट्रा का उपयोग किया है। – sfossen

+0

बीएफएस के साथ क्या गलत है? मुझे संदेह है कि इसे तेजी से किया जा सकता है ... –

+0

इसमें कुछ भी गलत नहीं है। यदि आप गहराई को सीमित करना चाहते हैं, तो 6 डिग्री अलग होने का कहना है, हालांकि, यह निर्धारित करने के लिए कुछ प्रकार के ह्युरिस्टिक का उपयोग करना भी समझता है कि कौन सी नोड आपकी चौड़ाई-पहली खोज (यानी ए *) में आगे देखने के लिए है। –

0

दोनों दिशाओं (प्रत्येक समाप्ति बिंदु से) में एक चौड़ाई-पहले खोज चलाने के लिए और रोक जब आपके पास कोई कनेक्शन या अपने गहराई सीमा

+0

इस मामले में ए * से बेहतर एक अनुमान समारोह के रूप में उपलब्ध नहीं हो सकता है। – Joshua

0

तक पहुँचने यह एक बेहतर समग्र Floyd-Warshall सभी जोड़ों को कम से कम दूरी हो सकता है।

संबंधित मुद्दे