2010-11-24 14 views
7

मेरे पास एक बाउंडिंग बॉक्स है, और इसके अंदर कई बिंदु हैं। मैं एक और बिंदु जोड़ना चाहता हूं जिसका स्थान पहले से जोड़े गए बिंदुओं से दूर है, साथ ही बॉक्स के किनारों से बहुत दूर है।किसी दिए गए सेट और उसके बाउंडिंग बॉक्स से सबसे दूर बिंदु को कैसे ढूंढें

क्या इस तरह की चीज के लिए कोई आम समाधान है? धन्यवाद!

+1

2 डी, 3 डी? ...... –

+1

क्या आप आवश्यकताओं पर अधिक विस्तार कर सकते हैं? बस कितना दूर? निश्चित रूप से, आप सिर्फ एक यादृच्छिक बिंदु पर 1e6,1e6 (, 1e6) जोड़ना नहीं चाहते हैं? इसके अलावा, अंक और किनारों की जांच क्यों करें? चूंकि अंक बॉक्स के अंदर हैं, क्यों न केवल किनारों का उपयोग करें? – EboMike

+0

यह समस्या अस्पष्ट है। "बॉक्स के किनारों से बहुत दूर" के बारे में कोई जानकारी नहीं है कि "किसी भी पहले जोड़े गए बिंदुओं से दूर से दूर" के खिलाफ मापा जाता है। क्या कोई ऐसा कार्य है जिसे आप कम करने के लिए लिख सकते हैं? – lijie

उत्तर

10

यहां थोड़ा Mathematica प्रोग्राम है।

हालांकि यह कोड की केवल दो पंक्तियां हैं (!) आपको शायद एक पारंपरिक भाषा में और साथ ही गणित पुस्तकालय में अधिकतम कार्यों को खोजने में सक्षम होना चाहिए।

मुझे लगता है कि आप गणित में धाराप्रवाह नहीं हैं, इसलिए मैं रेखा से लाइन समझाऊंगा और टिप्पणी करूंगा।

सबसे पहले हम {0,1} x {0,1} में 10 यादृच्छिक बिंदुओं के साथ एक टेबल बनाते हैं, और इसे पी नाम दें।

p = Table[{RandomReal[], RandomReal[]}, {10}]; 

अब हम अधिकतम करने के लिए एक समारोह बनाने के लिए:

f[x_, y_] = Min[ x^2, 
       y^2, 
       (1 - x)^2, 
       (1 - y)^2, 
       ((x - #[[1]])^2 + (y - #[[2]])^2) & /@ p]; 

हा! सिंटेक्स मुश्किल हो गया! आइए समझाएं:

फ़ंक्शन आपको उस बिंदु से {0,1} x {0,1} न्यूनतम दूरी किसी भी बिंदु के लिए हमारे सेट पी और किनारों पर देता है। पहले चार शब्द किनारों के लिए दूरी हैं और अंतिम (पढ़ने के लिए मुश्किल, मुझे पता है) एक सेट है जिसमें सभी बिंदुओं की दूरी होती है।

हम आगे क्या करेंगे को अधिकतम करने वाला यह कार्य, इसलिए हम उस बिंदु को प्राप्त करेंगे जहां अधिकतम हमारे लक्ष्यों के लिए न्यूनतम दूरी होगी।

लेकिन सबसे पहले f [] पर एक नज़र डालें। यदि आप इसे गंभीर रूप से देखते हैं, तो आप देखेंगे कि यह वास्तव में दूरी नहीं है, लेकिन दूरी वर्ग है। मैंने इसे परिभाषित किया, क्योंकि इस तरह फ़ंक्शन को अधिकतम करने के लिए बहुत आसान है और परिणाम समान हैं।

यह भी ध्यान दें कि f [] एक "सुंदर" फ़ंक्शन नहीं है।

alt text

कारण है कि आप एक अच्छा गणित पैकेज की आवश्यकता होगी अधिकतम ढूँढ़ी जा सकती है कि: यदि हम {0,1} में यह साजिश है, हम की तरह कुछ मिलता है।

मेथेमेटिका इस तरह के एक अच्छा पैकेज है, कि हम बात सीधा अधिकतम कर सकते हैं:

max = Maximize[{f[x, y], {0 <= x <= 1, 0 <= y <= 1}}, {x, y}]; 

और वह यह है। अधिकतम कार्य बिंदु को वापस करता है, और इसकी निकटतम सीमा/बिंदु तक वर्ग दूरी।

alt text

HTH! अगर आपको किसी अन्य भाषा में अनुवाद करने में मदद की ज़रूरत है, तो एक टिप्पणी छोड़ दें।

एक उम्मीदवार पैकेज DotNumerics

आप का पालन करना चाहिए है:

संपादित

हालांकि मैं एक सी # व्यक्ति नहीं हूँ, इसलिए और googling में संदर्भ के लिए देखने के बाद, इस के लिए आया था

file: \DotNumerics Samples\Samples\Optimization.cs 
Example header: 

    [Category("Constrained Minimization")] 
    [Title("Simplex method")] 
    [Description("The Nelder-Mead Simplex method. ")] 
    public void OptimizationSimplexConstrained() 

HTH: पैकेज में प्रदान की जाती उदाहरण का पालन करना!

+0

"सीमाओं से सबसे दूर दूर" का अर्थ है कि यदि एल्गोरिदम पहले से ही बॉक्स में कोई बिंदु नहीं चला है, तो यह पता होना चाहिए कि बॉक्स के केंद्र में एक बिंदु आदर्श बिंदु है, क्योंकि यह सबसे दूरगामी बिंदु है सीमाएं –

+2

@ जोश क्या आपके पास एल्गोरिदम का प्रयास करने के लिए एक परीक्षण केस है? –

+0

हाय बेलारियस - यहां आपके सहायक उत्तरों के लिए बहुत बहुत धन्यवाद।उपर्युक्त छवियां दिखती हैं कि वे मेरी समस्या का समाधान करते हैं, और मैं निश्चित रूप से उनके पीछे तर्क सीखना पसंद करूंगा। –

4

आपके द्वारा हल की जा रही समस्या का नाम the largest empty sphere problem है।

इसे आसानी से विमान में ओ (एन^4) समय में हल किया जा सकता है। बस बिंदुओं के सभी ओ (एन^3) ट्रिपल पर विचार करें और उनके circumcenter की गणना करें। इन बिंदुओं में से एक आपका वांछित बिंदु है। (ठीक है, आपके मामले में, आपको अपने तीन बिंदुओं में से एक के रूप में "एक पक्ष" पर भी विचार करना होगा, इसलिए आपको न केवल circumcenters बल्कि कुछ और सामान्य बिंदु मिलते हैं, जैसे दो बिंदुओं और एक तरफ से समतुल्य।)

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

+1

@A मदद चाहिए तो बस एक टिप्पणी छोड़ दें। रेक्स मैंने वोरोनोई आरेखों के आधार पर एक उत्तर पोस्ट किया और हटा दिया क्योंकि मैं किनारों के लिए सामान्यीकृत नहीं कर पाया था। क्या आप किनारों के लिए वोरोनोई डी एल्गोरिदम समाधान को सामान्यीकृत करने का वर्णन करने का प्रयास कर सकते हैं? –

+0

@ वंश: ज़रूर। अधिकतम त्रिज्या या तो डेलाउने त्रिकोण के circumradius से आता है, या उत्तल हूल और एक तरफ, या एक तरफ एक बिंदु या दो तरफ, या (यदि कोई अंक नहीं हैं) से वर्ग के किनारे के किनारे पर दो बिंदुओं से आता है। पहले के अलावा अन्य मामलों को कुछ चतुर्भुजों को हल करके कार्यान्वित करना आसान है। मुझे आपके वोरोनोई समाधान को देखने में दिलचस्पी होगी। मैं एक पूरा जवाब पोस्ट करना चाहता था, लेकिन मुझे वोरोनॉय को कोडिंग और सी # पुस्तकालयों को ढूंढने की तरह महसूस नहीं हुआ। –

+0

@ ए। रेक्स आपके उत्तर के लिए धन्यवाद। मैं वास्तव में वोरोनोई आरेख प्रस्ताव के साथ बहुत दूर नहीं आया, क्योंकि मुझे इस {{1, 15}, {15, 1}, {15, 15}, {1, 1}, {8, 8} जैसी कॉन्फ़िगरेशन मिली } {0,16} x {0,16} पर जिनके समाधान Voronoi अपघटन या Delaunay त्रिकोण के लिए आसानी से संबंधित नहीं हैं (या जो मुझे लगता है)। लेकिन हो सकता है कि आप सही हों और गहरी अन्वेषण के योग्य हों। बीटीडब्लू, मैंने इसके बारे में पोस्ट किया है, मेरे उत्तर के संपादन इतिहास में है (हालांकि, सुझाव से ज्यादा कुछ नहीं) –

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