मैं एनपी-पूर्ण संसाधन शेड्यूलिंग समस्या को हल करने के लिए simulated annealing का उपयोग कर रहा हूं। प्रत्येक उम्मीदवार के कार्यों के आदेश के लिए मैं कई अलग-अलग लागत (या ऊर्जा मूल्य) की गणना करता हूं। कुछ उदाहरण हैं (हालांकि बारीकियों शायद सवाल के लिए अप्रासंगिक हैं):एकाधिक विशिष्ट लागतों के साथ अनुरूपित एनीलिंग के लिए स्वीकृति संभावना फ़ंक्शन कैसे डिज़ाइन करें?
global_finish_time
: दिन है कि अनुसूची स्पैन की कुल संख्या।split_cost
: अन्य कार्यों द्वारा बाधाओं के कारण प्रत्येक कार्य में देरी होने की संख्या (यह एक बार शुरू होने के बाद किसी कार्य के बाधा को हतोत्साहित करने के लिए है)।deadline_cost
: दिनों की स्क्वायर संख्या की राशि जिसके द्वारा प्रत्येक चूक की समयसीमा अतिदेय है।
पारंपरिक स्वीकृति संभावना समारोह इस (अजगर में) की तरह दिखता है:
def acceptance_probability(old_cost, new_cost, temperature):
if new_cost < old_cost:
return 1.0
else:
return math.exp((old_cost - new_cost)/temperature)
अब तक मैं बस, उन्हें जोड़ने इतना है कि मैं में परिणाम फ़ीड कर सकते हैं द्वारा एक में मेरी पहली दो लागत संयुक्त है acceptance_probability
। लेकिन मैं वास्तव में deadline_cost
के लिए global_finish_time
से अधिक प्राथमिकता लेने के लिए पर split_cost
पर प्राथमिकता लेने के लिए वास्तव में चाहता हूं।
तो स्टैक ओवरफ़्लो पर मेरा प्रश्न यह है कि: मैं एक स्वीकृति संभावना फ़ंक्शन कैसे डिज़ाइन कर सकता हूं जो एकाधिक ऊर्जा को ध्यान में रखता है लेकिन हमेशा दूसरी ऊर्जा की तुलना में पहली ऊर्जा को अधिक महत्वपूर्ण मानता है, और इसी तरह? दूसरे शब्दों में, मैं old_cost
और new_cost
में कई लागतों के tuples के रूप में पास करना और एक समझदार मूल्य वापस करना चाहते हैं।
संपादित करें:, प्रस्तावित समाधान मैं यह निष्कर्ष निकाला है कि एक ही रास्ता है कि मेरे लिए काफी अच्छी तरह से काम करता है माइक Dunlavey के सुझाव है के साथ प्रयोग भले ही यह विभिन्न इकाइयों है कि लागत घटकों के साथ कई अन्य कठिनाइयों बनाता है के कुछ दिनों के बाद । मैं संतरे सेब से तुलना करने के लिए व्यावहारिक रूप से मजबूर हूँ।
तो, मैंने मानों को "सामान्यीकृत" करने में कुछ प्रयास किया। सबसे पहले, deadline_cost
वर्गों का योग है, इसलिए यह अन्य घटकों को रैखिक रूप से बढ़ते समय तेजी से बढ़ता है। इसे संबोधित करने के लिए मैं समान विकास दर प्राप्त करने के लिए वर्ग रूट का उपयोग करता हूं। दूसरा, मैंने एक ऐसा फ़ंक्शन विकसित किया जो लागत के रैखिक संयोजन की गणना करता है, लेकिन अब तक देखे गए उच्चतम लागत वाले घटक के अनुसार गुणांक को स्वत: समायोजित करता है।
उदाहरण के लिए, यदि उच्चतम लागत का ट्यूपल (ए, बी, सी) है और इनपुट लागत वेक्टर (x, y, z) है, तो रैखिक संयोजन बीसीएक्स + सी + जेड है। इस तरह, इससे कोई फर्क नहीं पड़ता कि यह कितना उच्च जेड प्राप्त करता है, यह 1 मान के x मान से अधिक महत्वपूर्ण नहीं होगा।
यह लागत कार्य में "जागियों" बनाता है क्योंकि नई अधिकतम लागतें खोजी जाती हैं। उदाहरण के लिए, यदि सी ऊपर जाता है तो बीसीएक्स और साइ दोनों एक दिए गए (एक्स, वाई, जेड) इनपुट के लिए अधिक होंगे और इसलिए लागत के बीच अंतर होंगे। एक उच्च लागत अंतर का मतलब है कि स्वीकृति संभावना कम हो जाएगी, जैसे कि तापमान अचानक एक अतिरिक्त कदम कम हो गया था। अभ्यास में हालांकि यह कोई समस्या नहीं है क्योंकि अधिकतम लागत शुरुआत में केवल कुछ ही बार अपडेट की जाती है और बाद में नहीं बदलती है। मेरा मानना है कि यह सैद्धांतिक रूप से एक सही परिणाम में अभिसरण साबित हो सकता है क्योंकि हम जानते हैं कि लागत कम मूल्य की ओर बढ़ जाएगी।
एक चीज जो अभी भी मुझे कुछ उलझन में रखती है वह तब होता है जब अधिकतम लागत 1.0 और उससे कम होती है, 0.5 कहें। अधिकतम वेक्टर (0.5, 0.5, 0.5) के साथ यह रैखिक संयोजन 0.5 * 0.5 * x + 0.5 * y + z, i.e.प्राथमिकता का क्रम अचानक उलट दिया गया है। मुझे लगता है कि इससे निपटने का सबसे अच्छा तरीका अधिकतम वेक्टर का उपयोग सभी मानों को दिए गए श्रेणियों को स्केल करने के लिए करना है, ताकि गुणांक हमेशा एक जैसा हो (कहें, 100x + 10y + z)। लेकिन मैंने अभी तक कोशिश नहीं की है।
मुझे यह जानने में दिलचस्पी होगी कि यह एक उद्योग या अकादमिक समस्या है या नहीं। सादर –
यह अकादमिक नहीं है। मैं इसे एमएस प्रोजेक्ट के विकल्प के रूप में उपयोग कर रहा हूं। कार्यक्रम का मुख्य लक्ष्य इस सवाल का जवाब देना आसान बनाता है कि "आपकी टीम हमारे सॉफ़्टवेयर में फीचर एक्स कब जोड़ सकती है?" – flodin
मुझे पता है कि यह प्रश्न साल पुराना है, लेकिन किसी और के लिए जो इस पृष्ठ पर Google के माध्यम से ठोकर खा रहा है ... अस्पष्ट तर्क में भारित योग तार्किक-या के बराबर है, इसलिए आप प्रभावी ढंग से कह रहे हैं "अगर स्थिति ए * या * शर्त बी आदि "। आप वास्तव में क्या चाहते हैं ए * और * बी * और * सी, और ऐसा करने के लिए आप गुणा का उपयोग करते हैं। कुछ चेतावनी हैं (उदाहरण के लिए आपके वजन अब शक्तियों की आवश्यकता है) लेकिन यह उस गड़बड़ी से कहीं बेहतर है जो आप विशेष मामले की कोशिश कर रहे हैं। अधिक जानकारी के लिए विकी "भारित योग मॉडल" और "भारित उत्पाद मॉडल"। –