प्रथम-मूल्य सील-बोली नीलामी


32

अंतिम परिणाम

प्रतियोगिता समाप्त हो गई है। को बधाई hard_coded!

कुछ रोचक तथ्य:

  • 40920 नीलामी (77.2%) में से 31600 में, पहले दौर के विजेता ने उस नीलामी में सबसे अधिक राउंड जीते।

  • यदि उदाहरण बॉट को प्रतियोगिता में शामिल किया जाता है, तो शीर्ष नौ स्थान इसके अलावा नहीं बदलेंगे AverageMineऔर heuristअपनी स्थिति को बदल देंगे।

  • एक नीलामी में शीर्ष 10 परिणाम:

[2, 2, 3, 3] 16637
[0, 3, 3, 4] 7186
[1, 3, 3, 3] 6217
[1, 2, 3, 4] 4561
[0, 1, 4, 5] 1148
[0, 2, 4, 4] 1111
[2, 2, 2, 4] 765
[0, 2, 3, 5] 593
[1, 1, 4, 4] 471
[0, 0, 5, 5] 462
  • टाई गिनती (नीलामी की संख्या जो कि i-वें दौर में कोई विजेता नहीं थी) [719, 126, 25, 36, 15, 58, 10, 7, 19, 38]:।

  • आई-वें दौर की औसत विजेता बोली [449.4, 855.6, 1100.8, 1166.8, 1290.6, 1386.3, 1500.2, 1526.5, 1639.3, 3227.1]:।

स्कोरबोर्ड

Bot count: 33
hard_coded            Score: 16141  Total: 20075170
eenie_meanie_more     Score: 15633  Total: 18513346
minus_one             Score: 15288  Total: 19862540
AverageMine           Score: 15287  Total: 19389331
heurist               Score: 15270  Total: 19442892
blacklist_mod         Score: 15199  Total: 19572326
Swapper               Score: 15155  Total: 19730832
Almost_All_In         Score: 15001  Total: 19731428
HighHorse             Score: 14976  Total: 19740760
bid_higher            Score: 14950  Total: 18545549
Graylist              Score: 14936  Total: 17823051
above_average         Score: 14936  Total: 19712477
below_average         Score: 14813  Total: 19819816
Wingman_1             Score: 14456  Total: 18480040
wingman_2             Score: 14047  Total: 18482699
simple_bot            Score: 13855  Total: 20935527
I_Dont_Even           Score: 13505  Total: 20062500
AntiMaxer             Score: 13260  Total: 16528523
Showoff               Score: 13208  Total: 20941233
average_joe           Score: 13066  Total: 18712157
BeatTheWinner         Score: 12991  Total: 15859037
escalating            Score: 12914  Total: 18832696
one_upper             Score: 12618  Total: 18613875
half_in               Score: 12605  Total: 19592760
distributer           Score: 12581  Total: 18680641
copycat_or_sad        Score: 11573  Total: 19026290
slow_starter          Score: 11132  Total: 20458100
meanie                Score: 10559  Total: 12185779
FiveFiveFive          Score: 7110   Total: 24144915
patient_bot           Score: 7088   Total: 22967773
forgetful_bot         Score: 2943   Total: 1471500
bob_hater             Score: 650    Total: 1300
one_dollar_bob        Score: 401    Total: 401

इस खेल में, हम एक सीलबंद बोली नीलामी का अनुकरण करेंगे।

प्रत्येक नीलामी एक 4-प्लेयर गेम है, जिसमें 10 राउंड होते हैं। शुरू में, खिलाड़ियों के पास पैसे नहीं होते हैं। प्रत्येक दौर की शुरुआत में, प्रत्येक खिलाड़ी को $ 500 मिलेंगे, और फिर अपनी बोली लगाएंगे। बोली किसी भी गैर-नकारात्मक पूर्णांक से कम या बराबर हो सकती है, जो उनके पास है। आमतौर पर, जो सबसे अधिक बोली लगाता है वह गोल जीतता है। हालाँकि, चीजों को और अधिक रोचक बनाने के लिए, यदि कई खिलाड़ी एक ही कीमत पर बोली लगाते हैं, तो उनकी बोली को ध्यान में नहीं रखा जाएगा (इस प्रकार वह गोल नहीं जीत सकती)। उदाहरण के लिए, यदि चार खिलाड़ी 400 400 300 200 की बोली लगाते हैं, तो 300 खिलाड़ी जीतते हैं; अगर वे 400 400 300 300 की बोली लगाते हैं, तो कोई नहीं जीतता। विजेता को भुगतान करना चाहिए कि वे क्या बोली लगाते हैं।

चूंकि यह एक "सील्ड-बिड" नीलामी है, बोली लगाने वाले विजेता के बारे में एकमात्र सूचना खिलाड़ी को पता चलेगा और अगले राउंड शुरू होने पर उन्होंने कितना भुगतान किया (इसलिए खिलाड़ी यह जान सकता है कि सभी के पास कितना है)।


स्कोरिंग

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


कोडिंग

आपको एक पायथन फ़ंक्शन play_round(और __init__यदि आवश्यक हो तो अन्य) के साथ पायथन 3 वर्ग को लागू करना चाहिए । play_round3 तर्क (स्वयं सहित) लेना चाहिए। दूसरा और तीसरा तर्क क्रम में होगा: पिछले दौर के विजेता की आईडी, उसके बाद उन्होंने कितना भुगतान किया। यदि कोई नहीं जीतता है या यह पहला दौर है, तो वे दोनों -1 होंगे। आपकी आईडी हमेशा 0 होगी, और आईडी 1-3 इस क्रम पर स्थिति द्वारा निर्धारित केवल एक क्रम में अन्य खिलाड़ी होंगे।


अतिरिक्त नियम

1. नियतात्मक: आपके फ़ंक्शन का व्यवहार केवल एक नीलामी के भीतर इनपुट तर्कों पर निर्भर होना चाहिए। यही है, आप फ़ाइलों, समय, वैश्विक चर या ऐसी किसी भी चीज़ तक नहीं पहुँच सकते जो राज्यों को अलग-अलग नीलामी या बॉट के बीच संग्रहीत करेगी । यदि आप एक छद्म आयामी जनरेटर का उपयोग करना चाहते हैं, तो इसे अपने आप से लिखना बेहतर है ( randomपायथन लिब में जैसे दूसरों के कार्यक्रमों को प्रभावित करने से रोकने के लिए ), और सुनिश्चित करें कि आपने इसे एक निश्चित बीज के साथ __init__या पहले दौर में रीसेट किया है ।

2. तीन बॉट प्रति व्यक्ति: आपको अधिकतम 3 बॉट में जमा करने की अनुमति है, इसलिए आप अपने बॉट्स को किसी तरह से "सहयोग" करने की रणनीति विकसित कर सकते हैं।

3. नॉट टू स्लो: चूंकि बहुत सारी नीलामी होगी, सुनिश्चित करें कि आपके बॉट बहुत धीमी गति से नहीं चलेंगे। आपके बॉट्स को एक सेकंड में कम से कम 1,000 नीलामियों को पूरा करने में सक्षम होना चाहिए।


नियंत्रक

यहाँ नियंत्रक मैं उपयोग कर रहा हूँ। bot_listइस पोस्ट पर सभी बॉट्स आयात किए जाएंगे और ऑर्डर में जोड़े जाएंगे ।

# from some_bots import some_bots

bot_list = [
    #one_bot, another_bot, 
]

import hashlib

def decide_order(ls):
    hash = int(hashlib.sha1(str(ls).encode()).hexdigest(), 16) % 24
    nls = []
    for i in range(4, 0, -1):
        nls.append(ls[hash % i])
        del ls[hash % i]
        hash //= i
    return nls

N = len(bot_list)
score = [0] * N
total = [0] * N

def auction(ls):
    global score, total
    pl = decide_order(sorted(ls))
    bots = [bot_list[i]() for i in pl]
    dollar = [0] * 4
    prev_win, prev_bid = -1, -1
    for rounds in range(10):
        bids = []
        for i in range(4): dollar[i] += 500
        for i in range(4):
            tmp_win = prev_win
            if prev_win == i: tmp_win = 0
            elif prev_win != -1 and prev_win < i: tmp_win += 1
            bid = int(bots[i].play_round(tmp_win, prev_bid))
            if bid < 0 or bid > dollar[i]: raise ValueError(pl[i])
            bids.append((bid, i))
        bids.sort(reverse = True)
        winner = 0
        if bids[0][0] == bids[1][0]:
            if bids[2][0] == bids[3][0]: winner = -1
            elif bids[1][0] == bids[2][0]: winner = 3
            else: winner = 2
        if winner == -1:
            prev_win, prev_bid = -1, -1
        else:
            prev_bid, prev_win = bids[winner]
            score[pl[prev_win]] += 1
            total[pl[prev_win]] += prev_bid
            dollar[prev_win] -= prev_bid

for a in range(N - 3):
    for b in range(a + 1, N - 2):
        for c in range(b + 1, N - 1):
            for d in range(c + 1, N): auction([a, b, c, d])

res = sorted(map(list, zip(score, total, bot_list)), key = lambda k: (-k[0], k[1]))

class TIE_REMOVED: pass

for i in range(N - 1):
    if (res[i][0], res[i][1]) == (res[i + 1][0], res[i + 1][1]):
        res[i][2] = res[i + 1][2] = TIE_REMOVED
for sc, t, tp in res:
    print('%-20s Score: %-6d Total: %d' % (tp.__name__, sc, t))

उदाहरण

यदि आपको एक छद्म आयामी जनरेटर की आवश्यकता है, तो यहां एक सरल है।

class myrand:
    def __init__(self, seed): self.val = seed
    def randint(self, a, b):
        self.val = (self.val * 6364136223846793005 + 1) % (1 << 64)
        return (self.val >> 32) % (b - a + 1) + a

class zero_bot:
    def play_round(self, i_dont, care): return 0

class all_in_bot:
    def __init__(self): self.dollar = 0
    def play_round(self, winner, win_amount):
        self.dollar += 500
        if winner == 0: self.dollar -= win_amount
        return self.dollar

class random_bot:
    def __init__(self):
        self.dollar = 0
        self.random = myrand(1)
    def play_round(self, winner, win_amount):
        self.dollar += 500
        if winner == 0: self.dollar -= win_amount
        return self.random.randint(0, self.dollar)

class average_bot:
    def __init__(self):
        self.dollar = 0
        self.round = 11
    def play_round(self, winner, win_amount):
        self.dollar += 500
        self.round -= 1
        if winner == 0: self.dollar -= win_amount
        return self.dollar / self.round

class fortytwo_bot:
    def play_round(self, i_dont, care): return 42

परिणाम

all_in_bot           Score: 20     Total: 15500
random_bot           Score: 15     Total: 14264
average_bot          Score: 15     Total: 20000
TIE_REMOVED          Score: 0      Total: 0
TIE_REMOVED          Score: 0      Total: 0

विजेता है all_in_bot। ध्यान दें कि zero_botऔर fortytwo_botएक ही स्कोर और कुल है, इसलिए उन्हें हटा दिया गया है।

इन बॉट्स को प्रतियोगिता में शामिल नहीं किया जाएगा। आप उन्हें उपयोग कर सकते हैं यदि आपको लगता है कि वे महान हैं।


अंतिम प्रतियोगिता 2017/11/23 14:00 (UTC) में आयोजित की जाएगी । आप उससे पहले अपने बॉट्स में कोई भी बदलाव कर सकते हैं।


5
क्या उन्हें प्रत्येक दौर में 500 डॉलर मिलते हैं, या प्रत्येक नीलामी (जो 10 राउंड तक होती है)?
स्टीवे ग्रिफ़िन

1
@KamilDrakari प्रतियोगिता सूची से हटाए गए बॉट के साथ फिर से शुरू होगी।
कोलेरा सु

4
@ शफ़लपैंट्स सच है, लेकिन कोटह चैलेंज के मामले में हमेशा ऐसा होता है। अतीत में कुछ लोगों ने वास्तव में उस बिंदु तक सभी बॉट का मुकाबला करने के लिए अंत में एक बॉट बनाया। लेकिन यह कोट-शैली की चुनौती का हिस्सा है। और जिस तरह से अधिकांश कोठरी-चुनौतियां काम करती हैं, उसमें यह शामिल है, फायदा यह नहीं होगा। आप केवल एक ही समय में इतने सारे बोट्स का मुकाबला कर सकते हैं .. पहले अच्छी चुनौती, कोलेरा सु , और पीपीसीजी में आपका स्वागत है! परिणामों की प्रतीक्षा कर रहा है। :)
केविन क्रूज़सेन 22

4
यहाँ TIO पर सभी वर्तमान बॉट्स के साथ टेस्ट रन है
स्टेडीबॉक्स

2
यह इस समय एक कड़ी दौड़ है ...
Zaid

जवाबों:


13

हार्ड कोडित

class hard_coded:
  def __init__(self):
    self.money = 0
    self.round = 0

  def play_round(self, did_i_win, amount):
    self.money += 500
    self.round += 1
    if did_i_win == 0:
      self.money -= amount
    prob = [500, 992, 1170, 1181, 1499, 1276, 1290, 1401, 2166, 5000][self.round - 1]
    if prob > self.money:
      return self.money
    else:
      return prob    

यह बॉट कई अन्य छद्म यादृच्छिक बॉट (और अन्य उत्तरों में कुछ बॉट) के खिलाफ आनुवंशिक प्रशिक्षण का परिणाम है। मैंने अंत में कुछ समय ठीक से बिताया है, लेकिन इसकी संरचना वास्तव में बहुत सरल है।

निर्णय केवल मापदंडों के एक निश्चित सेट पर आधारित होते हैं, न कि पिछले दौर के परिणामों पर।

कुंजी पहले दौर की लगती है: आपको ऑल-इन जाना है, बोली लगाना 500 की सुरक्षित चाल है। बहुत से बॉट 499 या 498 की बोली लगाकर शुरुआती चाल को खत्म करने की कोशिश कर रहे हैं। पहले दौर में जीत आपको बाकी नीलामी के लिए बड़ा फायदा देती है। आप केवल 500 डॉलर पीछे हैं, और आपके पास ठीक होने का समय है।

दूसरे राउंड में एक सुरक्षित दांव 990 से थोड़ा अधिक है, लेकिन यहां तक ​​कि बोली 0 कुछ अच्छा परिणाम देता है। बहुत अधिक बोली लगाना और जीतना इस दौर को खोने से भी बदतर हो सकता है।

तीसरे दौर में, अधिकांश बॉट्स बढ़ना बंद कर देते हैं: उनमें से 50% के पास अब तक 1500 डॉलर से कम है, इसलिए इस दौर में पैसे बर्बाद करने की कोई जरूरत नहीं है, 1170 एक अच्छा व्यापार है। चौथे राउंड में एक ही बात। यदि आप पहले तीन हार गए हैं, तो आप इसे बहुत सस्ते में जीत सकते हैं, और अभी भी अगले के लिए पर्याप्त पैसा है।

उसके बाद, एक राउंड जीतने के लिए आवश्यक औसत धन 1500 डॉलर है (जो कि तार्किक निष्कर्ष है: हर कोई अब तक चार में से एक राउंड जीतता है, बाद में जीतने के लिए कम बोली लगाकर सिर्फ पैसा बर्बाद कर रहा है, स्थिति स्थिर हो गई है और यह अभी दौर है- अब से रॉबिन)।

अंतिम राउंड ऑल-इन होना चाहिए, और अन्य पैरामीटर तब तक के लिए कम से कम बोली लगाकर अंतिम राउंड जीतने के लिए ठीक-ठाक हैं।

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


1
खैर, यह जीतने का एक तरीका है। बधाई हो!
लुका एच

लेकिन मुझे लगता है कि मैं अन्य प्रस्तुतियाँ अधिक पसंद है, क्योंकि वहाँ विचार का एक और रूप चला गया। कोशिश नहीं कर रहा हूं कि मैं उन अन्य बॉट्स के खिलाफ कैसे जीतूंगा, लेकिन किसी भी यादृच्छिक बॉट के खिलाफ एक अच्छी रणनीति क्या हो सकती है।
लुका एच

मैं समझ सकता हूं, मुझे कुछ अन्य सबमिशन पसंद (और अपवित्र) किए गए, लेकिन यह एक सीमित डोमेन पर एक समस्या है, और बहुत सारे सबमिशन केवल बहुत जटिल हैं। समस्या का मूल 10 नंबर का अनुक्रम उत्पन्न कर रहा है, इसलिए मैंने एक सामान्य प्रक्रिया खोजने के बजाय एक विशिष्ट डोमेन के लिए अनुकूलन करना चुना। मैं एक इंजीनियर हूं, गणितज्ञ नहीं।
जीबी

2
@ LUCH दृष्टिकोण की स्पष्ट सादगी इस विशेष संख्या के सेट पर पहुंचने के लिए आवश्यक कार्य की मात्रा को मानता है। मैं सांख्यिकीय दृष्टिकोण से अपने बॉट के साथ एक समान बात करने का प्रयास कर रहा था, और यह आसान नहीं था
Zaid

1
@ निश्चित रूप से इसमें बहुत काम हो रहा है, लेकिन जानवर मजबूरन बस इतना है ... जानवर;)
Luca H

12

औसत से ऊपर

अन्य खिलाड़ियों के पास औसत राशि से अधिक की बोली होती है। अंतिम दौर में सब कुछ बोल देता है।

class above_average:
  def __init__(self):
    self.round = 0
    self.player_money = [0] * 4
  def play_round(self, winner, winning_bid):
    self.round += 1
    self.player_money = [x+500 for x in self.player_money]
    if winner != -1:
      self.player_money[winner] -= winning_bid
    if self.round == 10:
      return self.player_money[0]
    bid = sum(self.player_money[1:]) / 3 + 1
    if bid > self.player_money[0]:
      return self.player_money[0]
    return min(self.player_money[0], bid)

12

मैं भी नहीं

class I_Dont_Even:
	def __init__(self):
		self.money = 0
		self.round = 0
	def play_round(self, loser, bid):
		self.money += 500 - (not loser) * bid
		self.round += 1
		return self.money * (self.round & 1 or self.round == 10)

केवल विषम दौर और अंतिम दौर में भाग लेता है।


7

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

class forgetful_bot:
  def play_round(self, winner, amt):
    return 500

15
मैं नीच नहीं हूँ, लेकिन शायद यह 'कारण है कि आपने अपने बॉट में कोई प्रयास नहीं किया है
मिशा

9
यह पहले उत्तरों में से एक है। गेंद लुढ़कने के लिए कुछ चाहिए।
खुल्द्रेसैथ न'बर्या

मैं नीचे नहीं गया, लेकिन शायद यह इसलिए है क्योंकि भले ही गेंद लुढ़कने के लिए कुछ आवश्यक हो, शायद कुछ अधिक दिलचस्प हो? विशेष रूप से चूंकि यह व्यावहारिक रूप से वन डॉलर बॉब के समान है जिसे इसे शुरू करने के लिए इस्तेमाल किया गया था
हाइपरयूट्रीनो

7

एक अपर

मैं अजगर के बारे में ज्यादा नहीं जानता, इसलिए मैं किसी तरह की त्रुटि कर सकता हूं

class one_upper:
    def __init__(self): 
        self.money = 0
        self.round = 0
    def play_round(self, winner, win_amount):
        self.money += 500
        if winner == 0: self.money -= win_amount
        self.round += 1
        bid = win_amount + 1
        if self.money < bid or self.round == 10:
            bid = self.money
        return bid

पिछली विजेता बोली की तुलना में 1 उच्चतर बोली लगती है, या अंतिम राउंड के दौरान सभी में चली जाती है।

मैं भविष्य में कब win_amount-१ के लिए एक अलग रणनीति तय कर सकता हूं


7

रोगी बॉट

class patient_bot:
    def __init__(self):
        self.round = 0
        self.money = 0
    def rand(self, seed, max):
        return (394587485 - self.money*self.round*seed) % (max + 1)
    def play_round(self, winner, amount):
        self.round += 1
        self.money += 500
        if winner == 0:
            self.money -= amount
        if self.round < 6:
            return 0
        else:
            bid = 980 + self.rand(amount, 35)
            if self.money < bid or self.round == 10:
                bid = self.money
            return bid

पहले पांच राउंड के लिए कुछ भी नहीं बोलता है, फिर अगले चार राउंड के लिए ~ 1000 डॉलर की बोली लगाता है, और अंत में अंतिम राउंड में सब कुछ बोलता है।


7

नकलची या दु: खी

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

class copycat_or_sad:
  def __init__(self):
    self.money = 0
    self.round = -1
  def play_round(self, winner, win_amount):
    # Default actions:
    #  Collect 500 dollars
    self.money += 500
    #  If it was the winner: subtract the win_amount from his money
    if winner == 0:
      self.money -= win_amount
    #  One round further
    self.round += 1

    # If it's the final round: bid all-in
    if self.round == 9:
      return self.money
    # Else-if there was no previous winner, or it doesn't have enough money left: bid 1
    if win_amount < 1 or self.money < win_amount:
      return 1
    # Else: bid the exact same as the previous winner
    return win_amount

मैं पायथन में कभी भी कार्यक्रम नहीं करता, इसलिए यदि आपको कोई गलती दिखाई देती है तो मुझे बताएं ..


2
यह -1पहली नीलामी पर बोली लगाता है ।
ओकेक्स

7

परीक्षण चालन

मैंने पिछले टेस्ट रन को एडेड किया है जिसमें स्टेडीबॉक्स द्वारा नवीनतम सबमिशन में जोड़ दिया गया है ।

मैं इसे यहाँ पोस्ट कर रहा हूँ, इसलिए एक ऐसी जगह है जहाँ लिंक को हाल के संस्करणों के साथ अपडेट किया जा सकता है, यह पोस्ट एक सामुदायिक विकी है इसलिए इसे अपडेट करने के लिए स्वतंत्र महसूस करें यदि आप एक नया सबमिशन पोस्ट करते हैं, तो एक पुराने को संशोधित करें, या बस कुछ देखें कुछ अन्य प्रस्तुत करने से नया!

यहाँ परीक्षण चलाने के लिए लिंक है! (TIO)


क्या मुझे उदास होना चाहिए कि मेरा बॉट जो विघटनकारी होने के लिए था, मेरे दो "असली" सबमिशन को खत्म कर देता है?
thegreatemu

@Thegreatemu यह देखना दिलचस्प है कि बॉट एक-दूसरे के साथ कैसे बातचीत करते हैं। एक नया बॉट नाटकीय रूप से रैंकिंग बदल सकता है। कुछ दिलचस्प मैंने पाया है कि अगर हिस्टोक्रेट की हटाई गई ब्लैकलिस्ट बॉट भाग लेती है, तो मेरे दो बॉट रैंकिंग के शीर्ष पर चले जाते हैं। :)
जो।

6

आधा में

यह बॉट हमेशा आधे हिस्से की बोली लगाता है, अंतिम दौर को छोड़कर, जहां यह सभी में जाएगा।

class half_in:
  def __init__(self):
    self.money = 0
    self.round = -1
  def play_round(self, winner, win_amount):
    # Default actions:
    #  Collect 500 dollars
    self.money += 500
    #  If it was the winner: subtract the win_amount from his money
    if winner == 0:
      self.money -= win_amount
    #  One round further
    self.round += 1

    # If it's the final round: bid all in
    if self.round == 9:
      return self.money
    # Else: Bid half what it has left:
    return self.money / 2

मैं पायथन में कभी भी कार्यक्रम नहीं करता, इसलिए यदि आपको कोई गलती दिखाई देती है तो मुझे बताएं ..


6

Graylist

class Graylist:
  def __init__(self):
    self.round = 0
    self.player_money = [0] * 4
    self.ratios = {1}
    self.diffs = {0}
  def play_round(self, winner, winning_bid):
    self.round += 1
    if winner != -1:
      if winner >0 and winning_bid>0:
        self.ratios.add(self.player_money[winner]/winning_bid)
        self.diffs.add(self.player_money[winner]-winning_bid)
      self.player_money[winner] -= winning_bid
    self.player_money = [x+500 for x in self.player_money]
    tentative_bid = min(self.player_money[0],max(self.player_money[1:])+1, winning_bid+169, sum(self.player_money[1:])//3+169)
    while tentative_bid and (tentative_bid in (round(m*r) for m in self.player_money[1:] for r in self.ratios)) or (tentative_bid in (m-d for m in self.player_money[1:] for d in self.diffs)):
      tentative_bid = tentative_bid - 1
    return tentative_bid

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

EDIT: बोली के लिए शुरुआती मूल्य के बीच अब न्यूनतम का उपयोग करता है: इसका वर्तमान पैसा, सबसे अमीर प्रतिद्वंद्वी के धन से 1, पिछले विजेता की तुलना में X अधिक, या Y अपने विरोधियों के औसत धन से अधिक है। X और Y स्थिरांक हैं जो संभवतः प्रतियोगिता के अंत से पहले संशोधित किए जाएंगे।


6

AverageMine

यह खिलाड़ी प्रत्येक राउंड के विजेता के लिए प्रतिशत (बोली / कुल धन) की गणना करता है और उसके (कुल पैसे * औसत जीतने का प्रतिशत + 85) की बोली लगाता है जब तक कि उसके पास अन्य सभी खिलाड़ियों की तुलना में अधिक पैसा न हो, तब वह उच्चतम प्रतियोगी की तुलना में 1 अधिक बोली लगाता है । शुरुआती राशि के 99.0% की बोली के साथ शुरू होता है।

class AverageMine:
    nplayers = 4
    maxrounds = 10
    def __init__(self):
        self.money = [0] * self.nplayers
        self.wins = [0] * self.nplayers
        self.round = 0
        self.average = 0
    def play_round(self, winner, win_amt):
        self.round += 1
        for i in range(self.nplayers):
            if i == winner:
                self.average = (self.average * (self.round - 2) + (win_amt / self.money[i])) / (self.round - 1)
                self.money[i] -= win_amt
                self.wins[i] += 1
            self.money[i] += 500
        if self.round == 1:
            return int(0.990 * self.money[0])
        elif self.round < self.maxrounds:
            if self.money[0] > self.money[1] + 1 and self.money[0] > self.money[2] + 1 and self.money[0] > self.money[3] + 1:
                return max(self.money[1],self.money[2],self.money[3]) + 1
            bid = int(self.average * self.money[0]) + 85
            return min(self.money[0],bid)
        else:
            bid = self.money[0]
            return bid

6

एनी मीनी मोर

यह खिलाड़ी एक चर को छोड़कर माईनी के समान है। यह संस्करण अधिक आक्रामक तरीके से बोली लगाता है और कुछ खिलाडियों के माध्यम से अधिक खर्च करने का कारण बनता है।

class eenie_meanie_more:
    def __init__(self):
        self.money = [0] * 4
        self.rounds = 11
        self.total_spent = 0

    def play_round(self, winner, winning_bid):
        self.money = [x+500 for x in self.money]
        self.rounds -= 1
        if winner != -1:
            self.money[winner] -= winning_bid
            self.total_spent += winning_bid
        bid = 500
        if self.rounds > 0 and self.total_spent < 20000:
            bid = int((20000 - self.total_spent)/self.rounds/4)+440
        return min(bid, max(self.money[1:])+1, self.money[0])

5

distributer

जब यह बॉट एक राउंड हार जाता है, तो वह अगले राउंड के सभी के बीच अतिरिक्त नकदी वितरित करता है। वह पहले दौर में यह सोचकर $ 499 में रखता है कि दूसरे $ 500 के साथ टाई करेंगे और समाप्त हो जाएंगे।

class distributer:
  def __init__(self):
    self.money = 0
    self.rounds = 11
  def play_round(self, winner, amt):
    self.money += 500
    self.rounds -= 1
    if self.rounds == 10:
      return 499
    if winner == 0:
      self.money -= amt
    return ((self.rounds - 1) * 500 + self.money) / self.rounds

1
के roundsबजाय उपयोग self.roundsत्रुटियों का कारण होगा। उसी के साथ money
जेरेमी वेइरिच

5

meanie

यह खिलाड़ी कुल नकद लेता है जो खिलाड़ियों की संख्या और शेष राउंड के दौरान औसत बोली प्राप्त करने के लिए खेल में प्रवेश करेगा। यदि यह लक्ष्य अन्य सभी खिलाड़ियों की तुलना में अधिक है, तो वर्तमान में यह अपने सबसे बड़े प्रतिस्पर्धी प्लस के संतुलन के लिए अपनी बोली को कम करता है। यदि खिलाड़ी अपने लक्ष्य को वहन नहीं कर सकता है, तो यह ऑल-इन है।

class meanie:
    def __init__(self):
        self.money = [0] * 4
        self.rounds = 11
        self.total_spent = 0

    def play_round(self,winner,winning_bid):
        self.money = [x+500 for x in self.money]
        self.rounds -= 1
        if winner != -1:
            self.money[winner] -= winning_bid
            self.total_spent += winning_bid
        bid = 500
        if self.rounds > 0 and self.total_spent < 20000:
            bid = int((20000 - self.total_spent)/self.rounds/4)+1
        return min(bid,max(self.money[1:])+1,self.money[0])

5

विजेता को हराया

सबसे अधिक जीत वाले खिलाड़ी की तुलना में बोली 1 अधिक

class BeatTheWinner:
    nplayers = 4
    maxrounds = 10
    def __init__(self):
        self.money = [0] * self.nplayers
        self.wins = [0] * self.nplayers
        self.round = 0

    def play_round(self, winner, win_amt):
        self.round += 1
        for i in range(self.nplayers):
            self.money[i] += 500
            if i == winner:
                self.money[i] -= win_amt
                self.wins[i] += 1
        mymoney = self.money[0]
        for w,m in sorted(zip(self.wins, self.money),reverse=True):
            if mymoney > m:
                return m+1
        #if we get here we can't afford our default strategy, so
        return int(mymoney/10)

4
क्या आप m,wसही क्रम में हैं?
जो।

5

एक घटाओ

class minus_one:
    def __init__(self):
        self.money = 0
    def play_round(self, winner, amount):
        self.money += 500
        if winner == 0:
            self.money -= amount
        return self.money - 1

5

उच्चतर बोली

class bid_higher:
    def __init__(self):
        self.dollar = 0
        self.round = 0
    def play_round(self, winner, win_amount):
        self.dollar += 500
        self.round += 1
        inc = 131
        if winner == 0: self.dollar -= win_amount
        if self.round == 10: return self.dollar
        if win_amount == 0: win_amount = 500
        if self.dollar > (win_amount + inc):
            return win_amount + inc
        else:
            if self.dollar > 1:
                return self.dollar -1
            else:
                return 0

फिर भी अजगर सीखना; अंतिम विजेता की तुलना में थोड़ी अधिक बोली लगाएं।


PPCG में आपका स्वागत है! ऐसा लगता है कि अगर आप बदल जाते हैं तो आपके बॉट का स्कोर और भी बेहतर हो जाता inc = 100है inc = 101
स्टेडीबॉक्स

मैं वास्तव में अपने स्वयं के हितों के खिलाफ जा रहा हूं, लेकिन आप आसानी से अपने स्कोर को बदल सकते हैं और अंतिम दौर में सभी को पीछे छोड़ सकते हैं;)
सिंह

सुझावों के लिए धन्यवाद; मैंने एक आखिरी राउंड ऑल-इन जोड़ा, ठीक-ठाक वेतन वृद्धि की, और इस बॉट को बढ़ावा देने के लिए
विंगमेन

नमस्ते, मुझे आशा है कि आपको कोई आपत्ति नहीं है, लेकिन मैं सभी वर्तमान सबमिशन के साथ एक टेस्टबैंक डाल रहा था और मुझे पता चला है कि आपका कोड कभी-कभी आखिरी दौर में अमान्य मान लौटा रहा था, इसलिए मैंने बग को रीक्रिएट करके बग को ठीक कर दिया है आदेश लाइनों के एक जोड़े। क्षमा करें, अगर मैंने कुछ भी नहीं बदला है, तो बदलावों को वापस करने और बग को दूसरे तरीके से ठीक करने के लिए स्वतंत्र महसूस करें!
सिंह

@ लियो: कोई बात नहीं, रुचि लेने के लिए धन्यवाद ..
rancid_banana

4

FiveFiveFive

पहले राउंड को छोड़ देता है और शेष राउंड पर $ 555 की बोली लगाता है। अंतिम दौर में, सभी तब तक जाएंगे, जब तक कि 2 अन्य बॉट में समान राशि न हो (और संभवतः टाई आउट होगा)।

class FiveFiveFive:
    nplayers = 4
    maxrounds = 10
    def __init__(self):
        self.money = [0] * self.nplayers
        self.wins = [0] * self.nplayers
        self.round = 0

    def play_round(self, winner, win_amt):
        self.round += 1
        for i in range(self.nplayers):
            self.money[i] += 500
            if i == winner:
                self.money[i] -= win_amt
                self.wins[i] += 1
        if self.round == 1:
            return 0
        elif self.round < self.maxrounds:
            return min(555, self.money[0])
        else:
            bid = self.money[0]
            return bid if self.money.count(bid) < 3 else bid-1

4

लगभग सभी में

class Almost_All_In:
	def __init__(self):
		self.money = 0
		self.round = 0
	def play_round(self, loser, bid):
		self.money += 500 - (not loser) * bid
		self.round += 1
		return self.money - self.round % 3 * 3 - 3

हमेशा बोली की तुलना में थोड़ा कम है।


4

तेजी से बढ़ रहा है

प्रत्येक दौर में इसके धन के बढ़ते हुए अंश (कृपया मुझे बताएं कि क्या कोई त्रुटि है, थोड़ी देर के बाद से मैंने पायथन का उपयोग किया)

class escalating:
  def __init__(self):
    self.money = 0
    self.round = 0
  def play_round(self, winner, win_amount):
    # Default actions:
    #  Collect 500 dollars
    self.money += 500
    #  If it was the winner: subtract the win_amount from his money
    if winner == 0:
      self.money -= win_amount
    #  One round further
    self.round += 1

    # bid round number in percent times remaining money, floored to integer
    return self.money * self.round // 10

4

औसत से कम

ऊपर के औसत के समान, लेकिन थोड़ा कम हो जाता है

class below_average:
  def __init__(self):
    self.round = 0
    self.player_money = [0] * 4
  def play_round(self, winner, winning_bid):
    self.round += 1
    self.player_money = [x+500 for x in self.player_money]
    if winner != -1:
      self.player_money[winner] -= winning_bid
    if self.round == 10:
      return self.player_money[0]
    bid = sum(self.player_money[1:]) / 3 - 2
    if bid > self.player_money[0]:
      return self.player_money[0]
    return min(self.player_money[0], bid)

4

ऊंचा घोडा

यह खिलाड़ी अपने सभी पैसे को मौजूदा दौर की संख्या में घटाता है, अंतिम दौर को छोड़कर, जहां वह सभी में जाता है।

class HighHorse:
    maxrounds = 10
    def __init__(self):
        self.money = 0
        self.round = 0
    def play_round(self, winner, win_amt):
        self.round += 1
        if 0 == winner:
            self.money -= win_amt
        self.money += 500
        if self.round < self.maxrounds:
            return self.money - self.round
        else:
            bid = self.money
            return bid

4

Swapper

अपने अधिकतम के तहत एक बोली लगाने और सभी में जाने के बीच वैकल्पिक।

class Swapper:
    def __init__(self):
        self.money = 0
        self.round = 0
    def play_round(self, loser, bid):
        self.money += 500 - (not loser) * bid
        self.round += 1
        if self.round & 1:
            return self.money - 1
        return self.money

मुझे लगा कि मुझे कुछ ऐसा खोजने की ज़रूरत है जो स्टेडीबॉक्स की माइनस_ऑन को हरा सके। :)


4

मॉड्यूलर ब्लैकलिस्ट

class blacklist_mod:
  def __init__(self):
    self.round = 0
    self.player_money = [0] * 4
    self.blacklist = {0, 499}
  def play_round(self, winner, winning_bid):
    self.round += 1
    self.player_money = [x+500 for x in self.player_money]
    if winner != -1:
      self.player_money[winner] -= winning_bid
      self.blacklist.add(winning_bid % 500)
      self.blacklist |= {x % 500 for x in self.player_money[1:]}
    tentative_bid = self.player_money[0]
    autowin = max(self.player_money[1:])+1
    if tentative_bid < autowin:
      while tentative_bid and (tentative_bid % 500) in self.blacklist:
        tentative_bid = tentative_bid - 1
    else:
      tentative_bid = autowin
    self.blacklist.add(tentative_bid % 500)
    return tentative_bid

इससे पहले देखी गई किसी भी संख्या के लिए मोडुलो 500 के अनुरूप नहीं है, यह सबसे अधिक राशि देता है।

ब्लैकलिस्ट को लागू नहीं करने का संपादन तब किया जाता है जब उसे गारंटीकृत जीत मिल सकती है।


उत्सुकता से, ऐसा लगता है कि आपके अन्य बॉट के लिए नवीनतम अपडेट इस बॉट को नकारात्मक रूप से प्रभावित कर रहा है। वर्तमान में, लीडरबोर्ड परblacklist_mod पांचवें स्थान पर है , जबकि blacklistदूसरे स्थान पर है। यदि blacklistइसके बजाय पुराने संस्करण का उपयोग किया जाता है, तो blacklistवह छठे स्थान पर आता है, लेकिन blacklist_mod बढ़त लेता है !
स्टेडीबॉक्स

blacklistपूरी तरह से बाहर फेंकने के लिए और भी अधिक ठोस नेतृत्व देने लगता है , लेकिन यह अनिर्णायक है। blacklist_mod
स्टेडीबॉक्स

ओह, धन्यवाद, इसका मतलब है - वे पुराने विशेष-केस लॉजिक के बिना एक ही एल्गोरिदम के करीब हैं, इसलिए वे एक-दूसरे के पैर की उंगलियों पर कदम रखते हैं। मुझे लगता है कि मैं मूल बॉट को हटा दूंगा; मैं इसे रखने के लिए एक अच्छे कारण के बारे में नहीं सोच सकता।
हिस्टोक्रैट

4

Heurist

हेयूरिस्ट , repeatable संभावना के रूप में इस खेल का व्यवहार करता है तो यह जानता है, जहां लाइन आकर्षित करने के लिए।

यह भी बुरी तरह से है, इसलिए यह जीत के लिए आवश्यक न्यूनतम न्यूनतम बोली लगाता है जब यह कर सकता है।

class heurist:
    def __init__(self):
        self.money = 0
        self.round = -1
        self.net_worth = [0] * 4
    def play_round(self, winner, bid):
        self.round += 1
        self.money += 500
        if winner == 0: self.money -= bid
        if winner != -1: self.net_worth[winner] -= bid
        self.net_worth = [x+500 for x in self.net_worth]
        max_bid = [498,1000,1223,1391,1250,1921,2511,1666,1600,5000][self.round]
        if self.money > max_bid:
            return 1 + min(max_bid,max(self.net_worth[1:3]))
        else:
            return self.money

अस्वीकरण: max_bidपरिवर्तन के अधीन है


4

bob_hater

यह बॉट बॉब को पसंद नहीं करता है और इस तरह बॉब के खिलाफ जीतने के लिए हमेशा 2 $ की बोली लगाएगा।

class bob_hater:
    def play_round(bob,will,loose):
        return 2

4

दिखावा

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

class Showoff:
  def __init__(self):
      self.moneys = [0, 0, 0]
      self.roundsLeft = 10
  def play_round(self, winner, winning_bid):
      import math
      self.moneys = [self.moneys[0] + 500,
                     self.moneys[1] + 1500,
                     self.moneys[2] + 1500]
      self.roundsLeft -= 1
      if winner > 0:
          self.moneys[1] -= winning_bid
      if winner == 0:
          self.moneys[0] -= winning_bid
      if self.roundsLeft == 0:
          return self.moneys[0]
      ratio = self.moneys[1] / self.moneys[2]
      logisticized = (1 + (math.e ** (-8 * (ratio - 0.5)))) ** -1
      return math.floor(self.moneys[0] * logisticized)

प्रयुक्त लॉजिस्टिक वक्र f (x) = 1 / (1 + e -8 (x-0.5) ) है, जहाँ x वर्तमान शत्रु-धन के अनुपात से लेकर कुल संभावित शत्रु-धन तक का अनुपात है। जितना अधिक दूसरों के पास होता है, वह उतना ही अधिक बोली लगाता है। इससे पहले दौर में लगभग ५०० डॉलर की बोली लगाने का संभावित लाभ है।


3

AntiMaxer

सबसे अधिक राशि का मिलान हम सभी खिलाड़ी के पैसे से कर सकते हैं। टाई करने के लिए उस दौर में सभी के लिए जा रहे किसी भी बॉट का कारण होगा।

class AntiMaxer:
    nplayers = 4
    maxrounds = 10
    def __init__(self):
        self.money = [0] * self.nplayers
        self.wins = [0] * self.nplayers
        self.round = 0

    def play_round(self, winner, win_amt):
        self.round += 1
        for i in range(self.nplayers):
            self.money[i] += 500
            if i == winner:
                self.money[i] -= win_amt
                self.wins[i] += 1
        return max((m for m in self.money[1:] if m<=self.money[0]),
                   default=0)    

3

सिंपल बॉट

class simple_bot:
    def __init__(self):
        self.round = 0
        self.money = 0
    def rand(self, seed, max):
        return (394587485 - self.money*self.round*seed) % (max + 1)
    def play_round(self, winner, amount):
        self.round += 1
        self.money += 500
        if winner == 0:
            self.money -= amount
        bid = 980 + self.rand(amount, 135)
        if self.money < bid or self.round == 10:
            bid = self.money
        return bid

लगभग रोगी बॉट के समान, लेकिन रोगी के रूप में नहीं। एक हो जाता है बहुत , हालांकि, यह तुलना में बेहतर स्कोर।


3

विंगमैन २

यदि एक विंगमैन अच्छा है, तो दो बेहतर होना चाहिए?

class wingman_2:
    def __init__(self):
        self.dollar = 0
        self.round = 0
    def play_round(self, winner, win_amount):
        self.round += 1
        self.dollar += 500
        inc = 129
        if win_amount == 0: win_amount = 500
        if winner == 0: self.dollar -= win_amount
        if self.round == 10: return self.dollar
        if self.dollar > win_amount + inc:
            return win_amount + inc
        else:
            if self.dollar > 1: return self.dollar -1
            else:
                return 0

आपका कोड काम नहीं करेगा क्योंकि आपको कक्षा में सामान के लिए इंडेंटेशन की आवश्यकता है
HyperNeutrino

दिलचस्प बात यह है कि आपके दोनों विंगमैन आपके मूल बॉट को हरा देते हैं (पास्टबिन लिंक में TIO लिंक है, जो एक टिप्पणी में पोस्ट करने के लिए बहुत लंबा है और यहां तक ​​कि URL
शॉर्टर्स के

1
मैंने पाया कि परिणाम अन्य बॉट्स के पूल के लिए बहुत संवेदनशील थे; वेतन वृद्धि में मामूली बदलाव के परिणाम असंगत हैं।
22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.