2010-07-07 14 views
7

के साथ सहायता चाहिए इसलिए मैं अटक गया हूं। मैं समाप्ति के साथ क्रेडिट सिस्टम पर काम कर रहा हूं। क्रेडिट कार्ड मील की तरह लेकिन बिल्कुल नहीं। जिस तरह से मुझे पुस्तक के लिए खेद है, लेकिन मुझे पूरी तस्वीर पाने में मदद के लिए पर्याप्त जानकारी जोड़ने की जरूरत है।क्रेडिट समाप्ति एल्गोरिदम

मुझे जो चाहिए वह एक ऐसी प्रणाली है जहां उपयोगकर्ता गतिविधियों को करने के लिए क्रेडिट जमा करता है। लेकिन वे इन क्रेडिट्स को गतिविधियों पर भी खर्च कर सकते हैं। यदि क्रेडिट का उपयोग नहीं किया जाता है तो क्रेडिट 30 दिनों के बाद समाप्त हो जाना चाहिए। मुझे लगता है कि हर रात दौड़ने वाले बैच में सटीक रूप से इसकी गणना कैसे करें। किसी भी भाषा में किसी भी विचार की बहुत सराहना की जाएगी क्योंकि मुझे लगता है कि मैं केवल एक मामूली विस्तार पर अटक गया हूं जिसे मैं चारों ओर नहीं ले सकता। ऊपर उपयोगकर्ता साइन
7/2 - 5:
7 उपयोगकर्ता खरीद गतिविधि -: - -3

7/1: यहाँ डेटा का एक उदाहरण है 5 उपयोगकर्ता प्रणाली
साथ सूचना का आदान 7/2/3: +5 - उपयोगकर्ता सिस्टम

इस बिंदु पर उपयोगकर्ता को 15 क्रेडिट प्राप्त हुए हैं और उन्होंने खर्च किया है 3. उन्हें कुल 12 क्रेडिट के साथ छोड़ दिया गया है। (कम से कम मुझे मूल गणित नीचे मिला: पी)

मुझे यह जोड़ना चाहिए कि वर्तमान में हम दो फ़ील्ड रखने के विचार के साथ खेल रहे हैं: आखिरी संसाधित, अगली संसाधित। तो यह सोचते हैं कि यह एक नए साइन अप था इस समय ये मान रहे हैं:

अंतिम प्रसंस्कृत दिनांक: 7/1
अगला प्रक्रिया दिनांक: 8/1

तो अब 8/1 के आसपास आता है। बैच शुरू होता है और 30 दिनों से अधिक पुराने सभी क्रेडिट देखता है। जो इस बिंदु पर 5.

यह वह जगह है जहां यह अस्पष्ट हो जाता है।

तब सिस्टम को उन सभी क्रेडिटों को देखना चाहिए जो पिछले 30 दिनों में खर्च किए गए हैं ताकि वे यह देख सकें कि वे किसी भी क्रेडिट का उपयोग कर रहे हैं या नहीं। क्योंकि उन्हें केवल तभी समाप्त होना चाहिए जब उनका उपयोग नहीं किया गया हो। तो 3 हैं। इसलिए मैं उपयोगकर्ता को 2 क्रेडिट काट देता हूं क्योंकि यह 30 दिनों से अधिक उम्र के क्रेडिट और जो खर्च किया गया है, उसका अंतर है। इसलिए मैं बैच को पूरा करता हूं और अगले दिन के अनुसार तिथियां निर्धारित करता हूं। अब यह मानते हुए कि उन्होंने अब और खर्च नहीं किया है, मैं 30 से अधिक उम्र के क्रेडिट अर्जित करने की गणना शुरू करता हूं, जो 5 है और क्रेडिट जो व्यय 3 है। लेकिन मैं स्पष्ट रूप से उन 3 क्रेडिटों पर विचार नहीं करना चाहता हूं जिन्हें मैंने कल माना था। उन 3 क्रेडिटों को फिर से विचार करने के लिए एक अच्छा दृष्टिकोण क्या है।

वह जगह है जहां मैं अटक गया हूं।

हम समाप्त हो चुके क्रेडिट के लिए डेबिट रिकॉर्ड लिखने के बारे में सोच रहे हैं ताकि हम उन्हें ट्रैक कर सकें लेकिन यह देखने में कठिनाई हो रही है कि मैं इस गणना में इसका उपयोग कैसे कर सकता हूं।

यदि आप इसे अभी तक पढ़ते हैं तो धन्यवाद। यदि आप उत्तर में कुछ भी प्रयास करते हैं तो मैं कम से कम प्रयास के लिए आपको वोट दूंगा।

संपादित करें:
ठीक @ ग्रेग ने कुछ ऐसा बताया जो मैं संबोधित करना भूल गया। माना जाता क्रेडिट पर झंडा डालने का विचार। एक वैध बिंदु लेकिन कोई भी नहीं जो निम्न परिदृश्य के कारण काम कर सकता है:

मान लें कि किसी विशेष दिन उपयोगकर्ता 10 क्रेडिट खर्च करता है। लेकिन समाप्त हो चुके क्रेडिट्स कि बैच केवल 5 तक जमा हो रहा है। वैसे ही उसे अभी भी समाप्त होने के लिए 5 और क्रेडिट शेष नहीं रहना चाहिए क्योंकि उन्होंने एक ही समय से अधिक समय व्यतीत किया था। तो ध्वज काम नहीं करेगा क्योंकि हम उन 5 अतिरिक्त क्रेडिट छोड़ देंगे। उम्मीद है कि समझ में आता है?

उत्तर

2

मान लें कि आप एक दैनिक आधार पर इस बैच चलाने निम्नलिखित मात्रा में होगा, आप एक मेज है कि सभी क्रेडिट वे अर्जित किया, और क्रेडिट वे इस्तेमाल (नकारात्मक क्रेडिट) का ट्रैक रखता है हो सकता है।

अगले महीने की शुरुआत में, आपका काम यह पता लगाने के लिए है कि पहले दिन अर्जित किए गए क्रेडिट किस महीने खर्च नहीं किए गए थे।

पहले दिन अर्जित क्रेडिट की संख्या - क्रेडिट जो उन्होंने पिछले महीने बिताए थे। यदि संख्या सकारात्मक है, तो उनके पास कुछ क्रेडिट हैं जिन्हें समाप्त होने की आवश्यकता है। नकारात्मक क्रेडिट के साथ तालिका में एक रिकॉर्ड इतना आसान जोड़ें।यह अप्रयुक्त क्रेडिट शून्य-आउट करेगा।

अगले दिन, यह देखते हुए प्रक्रिया को दोहराएं कि उन्होंने पिछले दिन अर्जित किए गए सभी क्रेडिटों के योग को कम से कम कितने क्रेडिट अर्जित किए हैं, जो आपके द्वारा पिछले दिन बनाए गए नकारात्मक क्रेडिट के रिकॉर्ड को ध्यान में रखते हुए ।

+0

मुझे लगता है कि यह वह दृष्टिकोण है जिसे मैं काम करने की कोशिश कर रहा हूं और यह काम नहीं कर रहा है। क्या आप इसका प्रदर्शन करने के लिए एक उदाहरण तैयार कर सकते हैं? – spinon

1

व्यय में ध्वज जोड़ने के बारे में कैसे? यदि ध्वज सेट नहीं है, तो यदि आवश्यक हो तो आप बैच में उस व्यय को शामिल कर सकते हैं। यदि आप व्यय का ऑफ़सेट समाप्त करने के लिए व्यय का उपयोग करते हैं, तो आप ध्वज सेट करते हैं। अगली बार, आप उस व्यय को अनदेखा करेंगे क्योंकि ध्वज सेट है।

+0

उल्लेख करने के लिए धन्यवाद कि मुझे लगता है कि मैंने अपनी पोस्ट से कुछ विवरण छोड़ा है। मुझे अब इसे जोड़ने दो। – spinon

3

मैं डेटा को संसाधित करने की कोशिश करने पर विचार नहीं करता। इसके बजाए, आपको ट्रैक रखना चाहिए कि उपयोगकर्ता के पास कितने क्रेडिट हैं, और जब वे समाप्त हो जाते हैं। इस तरह आप ट्रैक करते हैं कि खरीद के दौरान कौन से क्रेडिट का इस्तेमाल किया जाता था, इसके बाद इसे बाद में काम करने की कोशिश करने के बजाय।

तो उपयोगकर्ता के प्रवेश, वे जब:

2 credits expiring on 8/1 
5 credits expiring on 8/2 

और इसलिए:

5 credits expiring on 8/1 
5 credits expiring on 8/2 

कुछ खरीदने के बाद:

5 credits expiring on 8/1 

प्रणाली के साथ अगले दिन बातचीत के बाद पर।

+2

एक महान यूआई विचार है, लेकिन यह वास्तव में डेटा स्टोर करने का एक बुरा तरीका है; यदि आपके पास –

+1

@Heath को सही करने के लिए कोई बग है, तो आप एक ऑडिट ट्रेल चाहते हैं: वास्तव में, यह एक उचित लेनदेन लॉग के प्रतिस्थापन नहीं है। हालांकि, इस तरह की कुछ चीजों का उपयोग करके, और लेन-देन लॉग को मूल रूप से जोड़ना-केवल तभी जब तक कि कुछ सही नहीं है, आईएमओ, आगे बढ़ने का सबसे अच्छा तरीका है। –

+0

@ हेथ मुझे सहमत होना है। मैं उन रिकॉर्ड्स को छूना नहीं चाहता जो इंगित करता है कि कितने क्रेडिट अर्जित किए गए थे। मैंने इस विचार को माना है, लेकिन मुझे लगता है कि ऑडिट ट्रेल के संबंध में हीथ ने जो कुछ बताया है, उसके लिए मैं बस यह नहीं देख सकता कि मैं इसे स्टोरेज सिस्टम में साफ तरीके से कैसे कार्यान्वित कर सकता हूं। – spinon

1

सामान्य व्यय रिकॉर्ड करने के लिए डेबिट रिकॉर्ड का उपयोग करें। जब मासिक बैच नौकरी चलती है, तो वह कुल डेबिट की गणना कर सकती है जो कि समाप्त होने वाले क्रेडिट से कम या उसके बराबर होती है। यदि समाप्त होने के लिए क्रेडिट हैं, तो बस एक उपयुक्त डेबिट रिकॉर्ड डालें (उचित == आपके आवेदन में अतिरिक्त रद्द करने के लिए)। इस तरह, कोई भी 'रनिंग कुल' कोड जो केवल क्रेडिट और डेबिट की जांच करता है उसी बैलेंस तक पहुंच जाएगा जो आपके बैच कोड का इरादा रखता है।

+0

मैं सहमत हूं और मैंने इसका उल्लेख थोड़ा सा किया है। लेकिन वह अभी भी मेरी समस्या का समाधान नहीं करता है, कम से कम मैं अब नहीं देख सकता कि कैसे अगले दिन बैच में खर्च किए गए 3 क्रेडिटों पर विचार नहीं किया जाए। हालांकि मुझे लगता है कि इसके साथ कुछ है। इसके अलावा हम तालिका में डेबिट रिकॉर्ड लिख रहे हैं और हम इस जानकारी के साथ कुल कॉलम भी अपडेट कर रहे हैं। – spinon

3

प्रणाली के प्रत्येक उपयोगकर्ता के लिए एक सरणी रखने के लिए, कि अगले 30 दिनों से निरंतर

के लिए उपयोगकर्ता के लिए उपलब्ध क्रेडिट की राशि के बारे में जानकारी संग्रहीत करता है उदाहरण के लिए कुछ उपयोगकर्ता के लिए डेटा इस

कैसा लग सकता है
8 | 
7 | | 
6 | | | | 
5 | | | | | | | | | | | 
4 | | | | | | | | | | | | | | | | | 
3 | | | | | | | | | | | | | | | | | | | | | | | | 
2 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
    ------------------------------------------------------------- 
    | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
^^       ^   
    | \_       | 
    today tomorrow    in 15 days 

प्रत्येक बार उपयोगकर्ता कुछ क्रेडिट अर्जित करता है, तो आप अर्जित क्रेडिट की संख्या से सभी दिनों के लिए रकम बढ़ाते हैं। उदाहरण के लिए यदि उपयोगकर्ता 2 क्रेडिट अर्जित करता है तो टेबल परिवर्तन निम्नानुसार होता है। यह पूरे ग्राफ को बढ़ाने की तरह है।

10 | 
9 | | 
8 | | | | 
7 | | | | | | | | | | | 
6 | | | | | | | | | | | | | | | | | 
5 | | | | | | | | | | | | | | | | | | | | | | | | 
4 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
3 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
2 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
    ------------------------------------------------------------- 
    | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
^^       ^   
    | \_       | 
    today tomorrow    in 15 days 

उपयोगकर्ता आज x क्रेडिट है और y क्रेडिट खर्च करता है, तुम उसे करने के लिए उपलब्ध क्रेडिट की मात्रा में कमी करने के लिए एक्स - y, हर दिन वह एक्स से अधिक राशि का है के लिए - y। दिनों के लिए उसके पास एक्स-वाई से अधिक नहीं है, राशि वही रहती है। यह ग्राफ ऑफ के शीर्ष को काटने जैसा है। उदाहरण के लिए उपयोगकर्ता समाप्त हो रही क्रेडिट मॉडल करने के लिए

7 | | | | | | | | | | | 
6 | | | | | | | | | | | | | | | | | 
5 | | | | | | | | | | | | | | | | | | | | | | | | 
4 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
3 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
2 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
    ------------------------------------------------------------- 
    | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
^^       ^   
    | \_       | 
    today tomorrow    in 15 days 

हर दिन आप बाईं ओर ग्राफ शिफ्ट करने के लिए 3 क्रेडिट ग्राफ परिवर्तन खर्च करता है। उपयोगकर्ता कल

7 | | | | | | | | | | 
6 | | | | | | | | | | | | | | | | 
5 | | | | | | | | | | | | | | | | | | | | | | | 
4 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
3 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
2 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
    ------------------------------------------------------------- 
    | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 
^^       ^   
    | \_       | 
    today tomorrow    in 15 days 
+0

मैं आपको केवल उस प्रयास की मात्रा के लिए +1 दूंगा जो ऐसा लगता है जैसे आप इसे डालते हैं। मैंने जो कुछ कहा है उसे समझने के लिए मुझे कुछ मिनटों के लिए इसे देखने दें। लेकिन इसे पढ़ने में जल्दी ही आपने प्रत्येक उपयोगकर्ता के लिए एक टेबल का उल्लेख किया है। क्या वह एक टाइपो था या क्या आप इसका मतलब था? क्योंकि हमारे पास लगभग 100k उपयोगकर्ता हैं और प्रत्येक के लिए एक टेबल नियंत्रण से थोड़ा कम होगा। तो बस उस टुकड़े को तुरंत समझना चाहते हैं। – spinon

+0

@spinon ठीक है, टिप्पणी के लिए धन्यवाद। टेबल एक बुरा शब्द है। मेरे गरीब अंग्रेजी का एक आर्टेफैक्ट। मेरा मतलब डेटाबेस तालिका नहीं था, लेकिन केवल कुछ संरचना है जो मात्रा रखती है और उन्हें दिन के साथ जोड़ने में सक्षम बनाती है। यह डेटाबेस के बाहर एक साधारण सरणी हो सकती है। मैं इसे एक संपादन में फिर से लिखने की कोशिश करूंगा। डेटाबेस के मामले में, केवल 30 दिनों के लिए 30 कॉलम का उपयोग करें और डेटा को एक पंक्ति में एक पंक्ति में स्टोर करें। –

+0

ठीक है मैं इसे समझता हूं। मुझे इसके खिलाफ अपने परीक्षण जारी रखने दें। – spinon

0

इस समस्या का एक दृष्टिकोण केवल लेनदेन को स्टोर करना है, शेष राशि नहीं। फिर जब आप आवश्यक हो तो वास्तविक समय में शेष राशि की गणना करें। यहां डेटा है:

Date : Amount : Expiries 
7/1 : +5 : 7/31 
7/2 : +5 : 8/1 
7/2 : -3 : never 
7/3 : +5 : 8/2 

किसी भी समय शेष राशि उन सभी लेनदेनों की कुल है जो अभी तक समाप्त नहीं हुई हैं। किसी भी बैच प्रक्रियाओं को चलाने की जरूरत नहीं है।

0

जूलियंस के जवाब के बारे में (कि मैं अभी तक टिप्पणी नहीं कर सकता), मैं एक ही समस्या से निपट रहा हूं और जूलियन दृष्टिकोण काम नहीं करेगा क्योंकि इससे परिणाम नकारात्मक हो जाएगा।

यदि उपयोगकर्ता एक महीने के लिए सेवा का उपयोग नहीं करता है, तो 8/4 पर खाता शेष 3 होगा और 5 की एक गतिविधि 5 शेष राशि को 5 तक नहीं लाएगी, जैसा कि इसे करना चाहिए।

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