मेरे पास "अंक" का एक सेट है और यह "मान" है। मैं "अंक" के संयोजन से उच्चतम संभव "मूल्य" प्राप्त करना चाहता हूं।
उदाहरण:
मेरा लक्ष्य बिंदु: 100
Point Value
1 111
2 222
3 333
4 444
5 555
6 666
7 777
8 888
9 999
10 1110
11 1221
12 1332
13 1443
14 1554
15 1665
16 1776
17 1887
18 1998
19 2109
20 2220
संयोजन के TRILIONS हो सकते हैं लेकिन मुझे केवल उन "माई टारगेट पॉइंट" तक के संयोजनों की आवश्यकता है जो उच्चतम "मूल्य" प्रदान करते हैं।
संभावित उत्तर:
<मजबूत>1. (प्वाइंट 16)*2 + (प्वाइंट 17)*4 = 100
(मान 1776)*2 + (मान 1887)*4 = 11100
<मजबूत>2. (बिंदु १)*१०० = १००
(मान १११)*१०० = १११००
और इसी तरह.....
तो अंत में मुझे उच्चतम मूल्य के साथ केवल एक (कोई भी) संयोजन चाहिए।
amt2 = 0
For i20 = 0 To 5 ' (Max multiple -> 100/20 = 5)
For i19 = 0 To 5 ' (Max multiple -> 100/19 = 5)
For i18 = 0 To 5
For i17 = 0 To 5
For i16 = 0 To 6
For i15 = 0 To 6
For i14 = 0 To 7
For i13 = 0 To 7
For i12 = 0 To 8
For i11 = 0 To 9
For i10 = 0 To 10
For i9 = 0 To 11
For i8 = 0 To 12
For i7 = 0 To 14
For i6 = 0 To 16
For i5 = 0 To 20
For i4 = 0 To 25
For i3 = 0 To 33
For i2 = 0 To 50
For i1 = 0 To 100 ' (Max multiple -> 100/1 = 1)
point1 = (1 * i1) + (2 * i2) + (3 * i3) + (4 * i4) + (5 * i5) + (6 * i6) + (7 * i7) + (8 * i8) + (9 * i9) + (10 * i10) + (11 * i11) + (12 * i12) + (13 * i13) + (14 * i14) + (15 * i15) + (16 * i16) + (17 * i17) + (18 * i18) + (19 * i19) + (20 * i20))
If point1 <= 100 Then
amt1 = (111 * i1) + (222 * i2) + (333 * i3) + (444 * i4) + (555 * i5) + (666 * i6) + (777 * i7) + (888 * i8) + (999 * i9) + (1110 * i1 + (1221 * i11) + (1332 * i12) + (1443 * i13) + (1554 * i14) + (1665 * i15) + (1776 * i16) + (1887 * i17) + (1998 * i18) + (2109 * i19) + (2220 * i20)
If amt2 < amt1 Then
amt2 = amt1
<Save Combination Details>
End If
End If
Next i1
Next i2
Next i3
Next i4
Next i5
Next i6
Next i7
Next i8
Next i9
Next i10
Next i11
Next i12
Next i13
Next i14
Next i15
Next i16
Next i17
Next i18
Next i19
Next i20
मेरे कोड के साथ समस्या यह है कि यह सभी संभावित संयोजनों के माध्यम से पुनरावृत्त होता है जिसमें बहुत समय लगता है और थोड़ा परिणाम उत्पन्न होता है।
1 उत्तर
"खरबों" कम करके आंकते हैं कि आपका कोड कितना काम करने की कोशिश कर रहा है। आपका कोड अंतरतम लूप से 1.94*10^21 बार गुजरेगा, जो प्रति सेकंड 10 मिलियन पास की दर से (अधिकतम VBA दे सकता है) में 6 मिलियन वर्ष से अधिक का समय लगेगा। इसके बजाय, बस पूर्णांक प्रोग्रामिंग को हल करने के लिए rel="nofollow noreferrer">सॉल्वर ऐड-इन समस्या.
अपनी स्प्रैडशीट कुछ इस तरह सेट करें:
आपका डेटा कॉलम A:B
में है, मैंने निर्णय चर का एक नया कॉलम, D2
में एक बाधा सेल और E2
में एक उद्देश्य फ़ंक्शन जोड़ा है।
D2
में सूत्र है:
=SUMPRODUCT(A2:A21,C2:C21)
और E2
में यह है:
=SUMPRODUCT(B2:B21,C2:C21)
फिर मैं सॉल्वर से कहता हूं कि C2:C21
कोशिकाओं को बदलकर अधिकतम सेल E2
खोजने के लिए कहें, दो बाधाओं के अधीन कि D2 <= 100
और वह C2:C21
पूर्णांक हैं। मैं डिफ़ॉल्ट सेटिंग रखता हूं कि चर को गैर-ऋणात्मक माना जाता है, और सॉल्वर को सिम्प्लेक्स विधि का उपयोग करने के लिए कहता है (जो हुड के तहत इस आईएलपी को हल करने के लिए शाखा-और-बाध्य का उपयोग करेगा)। सॉल्वर के अनुसार इष्टतम समाधान (६ मिलियन वर्षों के विपरीत एक सेकंड से भी कम समय में पाया जाता है) 10*Point1 + 6*Point15
11100
के कुल मूल्य के साथ है -- जो एक ऐसा मान होता है जिसे आप पहले ही पा चुके हैं , दिखा रहा है कि इस समस्या में एकाधिक ऑप्टिमा है।
यह संभव है लेकिन वीबीए में यह सब करना आसान नहीं है, क्योंकि सॉल्वर ऐड-इन को कोड में लागू किया जा सकता है। देखें यह ए> एक बुनियादी परिचय के लिए।
संबंधित सवाल
नए सवाल
excel
केवल एक्सेल ऑब्जेक्ट्स या फ़ाइलों, या जटिल फॉर्मूला विकास के खिलाफ प्रोग्रामिंग पर प्रश्नों के लिए। यदि आप लागू हो तो आप Excel टैग को VBA, VSTO, C #, VB.NET, PowerShell, OLE स्वचालन और अन्य प्रोग्रामिंग संबंधी टैग और प्रश्नों के साथ जोड़ सकते हैं। सुपर उपयोगकर्ता पर एकल कार्यपत्रक कार्यों के लिए एमएस एक्सेल के बारे में सामान्य सहायता उपलब्ध है।