मेरे पास "अंक" का एक सेट है और यह "मान" है। मैं "अंक" के संयोजन से उच्चतम संभव "मूल्य" प्राप्त करना चाहता हूं।

उदाहरण:

मेरा लक्ष्य बिंदु: 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

मेरे कोड के साथ समस्या यह है कि यह सभी संभावित संयोजनों के माध्यम से पुनरावृत्त होता है जिसमें बहुत समय लगता है और थोड़ा परिणाम उत्पन्न होता है।

0
Ruchir Ranjan 18 जुलाई 2019, 20:58

1 उत्तर

सबसे बढ़िया उत्तर

"खरबों" कम करके आंकते हैं कि आपका कोड कितना काम करने की कोशिश कर रहा है। आपका कोड अंतरतम लूप से 1.94*10^21 बार गुजरेगा, जो प्रति सेकंड 10 मिलियन पास की दर से (अधिकतम VBA दे सकता है) में 6 मिलियन वर्ष से अधिक का समय लगेगा। इसके बजाय, बस पूर्णांक प्रोग्रामिंग को हल करने के लिए rel="nofollow noreferrer">सॉल्वर ऐड-इन समस्या.

अपनी स्प्रैडशीट कुछ इस तरह सेट करें:

enter image description here

आपका डेटा कॉलम 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 के कुल मूल्य के साथ है -- जो एक ऐसा मान होता है जिसे आप पहले ही पा चुके हैं , दिखा रहा है कि इस समस्या में एकाधिक ऑप्टिमा है।

यह संभव है लेकिन वीबीए में यह सब करना आसान नहीं है, क्योंकि सॉल्वर ऐड-इन को कोड में लागू किया जा सकता है। देखें यह एक बुनियादी परिचय के लिए।

0
John Coleman 19 जुलाई 2019, 17:50