उन चक्रों को कैसे ढूंढें, जो एक साथ, एक निर्देशित ग्राफ़ में सबसे बड़ी संख्या में गैर-साझा किनारों को शामिल करते हैं?


26

मैं एक कंप्यूटर विज्ञान सिद्धांतकार नहीं हूँ, लेकिन लगता है कि यह वास्तविक दुनिया की समस्या यहाँ है।

समस्या

मेरी कंपनी की देश में कई इकाइयाँ हैं।

हमने कर्मचारियों को एक और इकाई पर काम करने की संभावना की पेशकश की। लेकिन एक शर्त है: एक इकाई पर श्रमिकों की कुल संख्या बदल नहीं सकती है।

इसका मतलब है: यदि कोई व्यक्ति अपनी जगह चाहता है, तो हम किसी कर्मचारी को उसकी इकाई छोड़ने की अनुमति देंगे।

उदाहरण (काल्पनिक) अनुरोध डेटा:

Name            Origin    Destination
Maria              1  ->  2
Marcos             2  ->  3
Jones              3  ->  4
Terry              4  ->  5
Joe                5  ->  6
Rodrigo            6  ->  1
Barbara            6  ->  1
Marylin            1  ->  4
Brown              4  ->  6
Benjamin           1  ->  3
Lucas              4  ->  1

ऊपर, प्लॉट किया गया: उपरोक्त डेटा का विज़ुअलाइज़ेशन

देखें कि हमें लाल, नीले या काले विकल्पों में से कैसे चुनना है?

वास्तविक समस्या थोड़ी अधिक जटिल है, क्योंकि हमारे पास 27 इकाइयाँ और 751 अनुरोध हैं। कृपया विज़ुअलाइज़ेशन पर एक नज़र डालें

लक्ष्य

सभी अनुरोधों को एकत्र करने के बाद, उनमें से अधिकांश को कैसे संतुष्ट किया जाए?

थ्योरी (?) एप्लीकेशन

G(V,E)VE

EV

प्रश्न

यदि इस समस्या को व्यक्त किया जाता है

"कैसे चक्रों को खोजने के लिए, जो एक साथ, एक निर्देशित ग्राफ में सबसे बड़ी संख्या में गैर-साझा किनारों को शामिल करते हैं"?

क्या हम अधिकांश अनुरोधकर्ताओं को संतुष्ट करेंगे?

यह सच है, चक्र के उस इष्टतम सेट को खोजने के लिए एक एल्गोरिथ्म है?

क्या यह ग्रेडी दृष्टिकोण समस्या का समाधान करेगा?

  1. G
  2. G
  3. G

क्या आप मेरी मदद कर सकते हैं?

क्या आप मूल समस्या का वर्णन करने का एक और तरीका जानते हैं (अधिकांश अनुरोधकर्ताओं को खुश करना)?

संपादित करें : समस्या का बेहतर वर्णन करने के लिए विभाग को इकाई में बदल दिया।


3
क्या आप वाकई एक से अधिक बार एक ही किनारे का उपयोग करने से बचना चाहते हैं ? आपके आवेदन के विवरण से, यह मुझे दिखता है कि आपको एक ही बार एक से अधिक वर्टेक्स का उपयोग करने से बचना चाहिए , जो एक मजबूत स्थिति है।
१२:५० पर त्सुयोशी इतो

3
@TsuyoshiIto: जैसा कि मैंने विवरण से समझा, शर्त यह है कि प्रत्येक शीर्ष पर indegree outdegree के बराबर होना चाहिए। तो, वर्टेक्स-डिसऑर्डर की जरूरत नहीं है।
योशियो ओकामोटो

7
वैसे, यदि मेरी समझ सही है, तो नेटवर्क प्रवाह के माध्यम से समस्या को बहुपद समय में हल किया जाना चाहिए। अर्थात्, यदि हम एक धार के साथ प्रवाह की एक इकाई के लिए लाभ की एक इकाई देते हैं, और हम प्रत्येक किनारे पर एक इकाई की क्षमता देते हैं, तो समस्या यह है कि अधिकतम लाभ का संचलन मिल जाए।
योशियो ओकामोटो

3
इस पोस्ट में आपकी समस्या के सामान्यीकरण पर चर्चा की गई है okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html (प्रत्येक व्यक्ति को व्यापार करने के लिए एक वस्तु के रूप में सोचें, अर्थात् उनकी नौकरी की नियुक्ति)।
रादु GRIGore

4
विस्मयकारी प्रश्न, हमें यह महसूस कराता है कि हम जो करते हैं वह वास्तव में वास्तविक जीवन में उपयोग किया जा सकता है :)।
गोपी

जवाबों:


9

ठीक है, मैं TradeMaximizer का कोड पढ़ता हूं और मेरा मानना ​​है कि यह निम्नलिखित, अधिक सामान्य समस्या को हल करता है।

समस्या: दिए गए एक निर्देशित ग्राफ हैं जिनकी आर्क्स की लागत है। शीर्ष-अव्यवस्थित चक्रों का एक सेट खोजें जो पहले कवर किए गए कोने की संख्या को अधिकतम करता है, और कुल लागत दूसरी को कम करता है।

xyxyyz

समाधान:

  1. xxLxRxLxRxyxLyR

  2. द्विदलीय ग्राफ में एक न्यूनतम लागत परिपूर्ण मिलान का पता लगाएं।

>1

(वास्तव में, TradeMaximizer उपरोक्त सभी दो मानदंडों के अनुसार, सबसे बड़े चक्र की लंबाई जैसे अन्य चीजों को अनुकूलित करने के लिए, सभी इष्टतम समाधानों पर निर्भर करता है। बड़े चक्र एक "सौदा" होने की संभावना को बढ़ाते हैं क्योंकि एक नहीं होता है। व्यक्ति अपना दिमाग बदल देता है।)

PS: लेखक, क्रिस ओकासाकी ने पुष्टि की कि यह वही है जो कोड करता है, वापस ब्लॉग पोस्ट पर


मैं TradeMaximizer का उपयोग करके मूल समस्या का समाधान खोजने में कामयाब रहा। मैं कल पोस्ट पोस्ट करूँगा।
motobói

@ motobói, लेकिन आपको बस इतना करना है कि मैंने दूसरे पैराग्राफ में क्या लिखा है ...
रादू ग्रिगोर

मुझे एल्गोरिथ्म के बारे में यह स्पष्टीकरण मिला: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

क्या आप इस बारे में स्पष्टीकरण दे सकते हैं या इस बात की व्याख्या कर सकते हैं कि स्ट्रांग कम्नेटेड कंपोनेंट्स के बीच आर्क्स को निकालना क्यों आवश्यक है?
motobói

@ motobói, यह एक अनुकूलन है (औसत मामले के लिए)। चरण (1) और (2) पर्याप्त होना चाहिए।
रादु GRIGore

22

11

क्योंकि सभी लागत और क्षमता स्थिरांक से बंधे होते हैं, एक सरल चक्र-निरूपण एल्गोरिथ्म बहुपद समय में आवश्यक संचलन का पता लगाएगा। यह लगभग स्पष्ट लालची एल्गोरिथ्म के समान है:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

O(VE)0EEO(VE2)

यह ज्ञात सबसे तेज़ एल्गोरिथम नहीं है।


लगता है कि यह तब तक काम करता है जब तक कोई व्यक्ति एक से अधिक "यूनिट" में काम नहीं करना चाहता है, है ना? मूल सवाल के phrasing का उपयोग करना। लेकिन अगर लोग एक से अधिक इकाइयों में काम करना चाहते हैं, तो संदेह है कि यह अमूर्तन टूट जाता है। ओपी ने केवल एक इकाई के संदर्भ में समस्या बताई, लेकिन यह मेरे लिए कृत्रिम रूप से बाधा बन रही है। [क्या मानव की केवल एक ही प्राथमिकता है ...?]
vzn

1
एक "व्यक्ति" और एक "इकाई" क्या है? यह ग्राफ़ के बारे में एक प्रश्न है।
जेफ

मैं हैरान हूँ: क्या मेरा उदाहरण इस एल्गोरिथ्म के लिए एक काउंटर उदाहरण नहीं है? C को चुनने के बाद, C_1 और C_2 के चक्र अब और चक्र नहीं हैं (क्योंकि प्रत्येक चक्र का एक उलटा किनारा होता है); सी का फिर से उपयोग नहीं किया जाएगा क्योंकि इसके किनारों को उलटने के बाद सकारात्मक लागत होती है और कोई नया चक्र शुरू नहीं होता है। क्या हम उसी समस्या के बारे में बात कर रहे हैं? समस्या का गणितीय सूत्रीकरण करना पसंद करेंगे।
FiB

3
CCC1C2CCC1C2C=C1+C2C

जाहिरा तौर पर एक "यूनिट" एक "विभाग" की तरह है और उपयोगकर्ता विभागों के बीच स्थानान्तरण के लिए अनुरोध दर्ज कर रहे हैं [विभागों में विशिष्ट पदों पर नहीं]? FIBs आरेख में इकाइयों और किनारों के रूप में इकाइयाँ होती हैं जैसा कि इकाइयों के बीच अनुरोध का अनुरोध करता है। FiB-- "समस्या का गणितीय सूत्रीकरण करना पसंद करेंगे" .. यह एक सटीक सूत्रीकरण प्रदान करने के लिए वास्तव में आप पर निर्भर है .. आप वहाँ आधे रास्ते में लगते हैं ..
vzn

4

यह लालची दृष्टिकोण हमेशा सबसे अच्छा समाधान नहीं देगा।

Cn{(v1,v2),,(vn,v1)}C1C2n1C

CnC1C2

C1C22(n1)=2n2

n2


-3

इसे हल करने के लिए शायद एक ग्राफ सिद्धांत तरीका / सूत्रीकरण है, लेकिन यह समस्या मेरे लिए एक क्रमपरिवर्तन समस्या की तरह लगती है जहां सभी क्रमपरिवर्तन में से कुछ खारिज कर दिए जाते हैं और अन्य मान्य होते हैं। क्रमपरिवर्तन कर्मचारी हैं और पद कंपनी में "पद" हैं। यदि यह "व्यक्ति [x] स्थिति [y] चाहता है" की आवश्यकताओं के अनुरूप नहीं है, तो एक क्रमचय को अस्वीकार कर दिया जाता है। इकाइयों / डिपो / ऑर्गन सीमाओं का अंतर स्पष्ट रूप से इस मामले में समाधान के लिए कुछ हद तक बेहतर है।

बाधाओं के साथ इस प्रकार की क्रमपरिवर्तन समस्या को SAT (संतोषप्रद) समस्या के उदाहरण में आसानी से परिवर्तित किया जा सकता है। बूलियन चर असाइनमेंट कर्मचारियों का प्रतिनिधित्व करते हैं, और बाधा खंड "व्यक्ति [x] स्थिति [y]" बाधाओं का प्रतिनिधित्व करते हैं। इसके आस-पास के क्लासिक उदाहरण हैं, एक को आमतौर पर "डिनर टेबल" समस्या कहा जाता है जहां आपके पास बैठने की स्थिति और मेहमान हैं और सभी मेहमान एक-दूसरे के बगल में नहीं बैठना चाहते हैं (या इसी तरह कुछ मेहमान अन्य मेहमानों के बगल में बैठना चाहते हैं)।

और निश्चित रूप से पीसी पर, लगभग सैकड़ों चर और खंडों को शामिल करने वाले काफी बड़े उदाहरणों के लिए परिष्कृत सैट सॉल्वर्स हैं, और यदि हजारों में समस्या "कठिन" नहीं है।

एक पेशेवर संदर्भ के लिए उदाहरण [1] देखें और कक्षा अभ्यास के लिए [2]। वहाँ भी कुछ संरचनात्मक समानता है जो "कबूतर समस्याओं" के रूप में जाना जाता है जो कि एसएटी सर्कल में अच्छी तरह से अध्ययन किया जाता है जहां कबूतरों को कबूतरों को सौंपा जाता है और आपके पास कबूतरों की तुलना में अधिक या कम छेद होते हैं। उस मामले में हालांकि कबूतरों को आम तौर पर विनिमेय के रूप में देखा जाता है। दूसरे शब्दों में डिनर टेबल की समस्या कबूतर की समस्या की तरह है और मजबूत बाधाओं के साथ मेहमानों / कबूतरों को प्राथमिकताएं आवश्यक हैं।

पाठ्यक्रम का ध्यान रखें / ध्यान रखें कि इन प्रकार की समस्याओं के लिए, बाधाओं के आधार पर उत्तर "इस तरह की कोई विवशता मौजूद नहीं है" हो सकता है।

[१] डिनर टेबल एल्गोरिथ्म, क्रेटो द्वारा

[२] CS402 प्रिंसटन एचडब्ल्यू सैट

[३] संतुष्टि की समस्या, विकिपीडिया


मैंने ट्रेडमैक्सिमाइज़र का उपयोग करके क्रमचय की कोशिश की। एक कर्मचारी को एक उपयोगकर्ता के रूप में यूनिट Y के लिए अपनी यूनिट X का व्यापार करना चाहते हैं । लेकिन सॉफ्टवेयर एक से अधिक उपयोगकर्ता को एक ही वस्तु (उसकी इकाई) का व्यापार करने की अनुमति नहीं देगा। प्रत्येक आइटम अद्वितीय होना चाहिए। इसे समायोजित करने के लिए, मुझे कहना होगा, [(जोन्स) यूनिट-डी-लौरा या यूनिट-डी-सर्जियो या यूनिट-डी-मैरी के लिए यूनिट-सी-जेम्स का व्यापार करना चाहता है
motobói
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.