diff --git a/EA/BGw-sealed-opponent.txt b/EA/BGw-sealed-opponent.txt new file mode 100644 index 0000000..2ed8194 --- /dev/null +++ b/EA/BGw-sealed-opponent.txt @@ -0,0 +1,7 @@ +This was BGw-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 0 +UWg-sealed-opponent.dck: 1 +RG-sealed-opponent.dck: 0 +BGw-sealed-opponent.dck: 0 +UR-sealed-opponent.dck: 0 +RW-sealed-opponent.dck: 1 diff --git a/EA/GB-sealed-opponent.txt b/EA/GB-sealed-opponent.txt new file mode 100644 index 0000000..d912f56 --- /dev/null +++ b/EA/GB-sealed-opponent.txt @@ -0,0 +1,7 @@ +This was GB-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 0 +UWg-sealed-opponent.dck: 0 +RG-sealed-opponent.dck: 0 +BGw-sealed-opponent.dck: 1 +UR-sealed-opponent.dck: 2 +RW-sealed-opponent.dck: 0 diff --git a/EA/RG-sealed-opponent.txt b/EA/RG-sealed-opponent.txt new file mode 100644 index 0000000..9807b06 --- /dev/null +++ b/EA/RG-sealed-opponent.txt @@ -0,0 +1,7 @@ +This was RG-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 2 +UWg-sealed-opponent.dck: 2 +RG-sealed-opponent.dck: 0 +BGw-sealed-opponent.dck: 1 +UR-sealed-opponent.dck: 0 +RW-sealed-opponent.dck: 1 diff --git a/EA/RG-sealed-opponent.txtBGw-sealed-opponent.txt b/EA/RG-sealed-opponent.txtBGw-sealed-opponent.txt new file mode 100644 index 0000000..c1ffda5 --- /dev/null +++ b/EA/RG-sealed-opponent.txtBGw-sealed-opponent.txt @@ -0,0 +1,6 @@ +This was RG-sealed-opponent.dckBGw-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 0 +UWg-sealed-opponent.dck: 0 +RG-sealed-opponent.dckBGw-sealed-opponent.dck: 0 +UR-sealed-opponent.dck: 0 +RW-sealed-opponent.dck: 0 diff --git a/EA/RW-sealed-opponent.txt b/EA/RW-sealed-opponent.txt new file mode 100644 index 0000000..eabc5eb --- /dev/null +++ b/EA/RW-sealed-opponent.txt @@ -0,0 +1,7 @@ +This was RW-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 2 +UWg-sealed-opponent.dck: 1 +RG-sealed-opponent.dck: 0 +BGw-sealed-opponent.dck: 2 +UR-sealed-opponent.dck: 2 +RW-sealed-opponent.dck: 1 diff --git a/EA/UR-sealed-opponent.txt b/EA/UR-sealed-opponent.txt new file mode 100644 index 0000000..d2c7996 --- /dev/null +++ b/EA/UR-sealed-opponent.txt @@ -0,0 +1,7 @@ +This was UR-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 1 +UWg-sealed-opponent.dck: 1 +RG-sealed-opponent.dck: 2 +BGw-sealed-opponent.dck: 2 +UR-sealed-opponent.dck: 2 +RW-sealed-opponent.dck: 1 diff --git a/EA/UWg-sealed-opponent.txt b/EA/UWg-sealed-opponent.txt new file mode 100644 index 0000000..c8cdf4b --- /dev/null +++ b/EA/UWg-sealed-opponent.txt @@ -0,0 +1,7 @@ +This was UWg-sealed-opponent.dckplaying versus: +GB-sealed-opponent.dck: 1 +UWg-sealed-opponent.dck: 1 +RG-sealed-opponent.dck: 1 +BGw-sealed-opponent.dck: 2 +UR-sealed-opponent.dck: 2 +RW-sealed-opponent.dck: 2 diff --git a/EA/constants.py b/EA/constants.py index eaeb827..60d6db6 100644 --- a/EA/constants.py +++ b/EA/constants.py @@ -5,17 +5,17 @@ POPSIZE = 10 DECKSIZE = 40 -CROSSOVER_RATE = 0.1 +CROSSOVER_RATE = 0.5 MUTATION_RATE = 0.2 -NUMBER_OF_GENERATIONS = 500 -MATCHES_PER_OPPONENT = '1' # must be string! +NUMBER_OF_GENERATIONS = 200 +MATCHES_PER_OPPONENT = '50' # must be string! CARD_POOL = read_card_pool('../AER-POOL-1.txt') CARD_POOL_SIZE = len(CARD_POOL) CARD_DIRECTORY = config.CARD_DIR FORGE_PATH = config.FORGE_DIR DECKLIST_HEADER = '[metadata]\nName=candidate\n[Main]\n' -# OPPONENTS = ["GB-sealed-opponent.dck"] -OPPONENTS = ["GB-sealed-opponent.dck", "UWg-sealed-opponent.dck", "UW-sealed-opponent.dck", "BGw-sealed-opponent.dck"] +OPPONENTS = ["GB-sealed-opponent.dck", "UWg-sealed-opponent.dck", "RG-sealed-opponent1.dck", + "BGw-sealed-opponent.dck", "UR-sealed-opponent.dck", "RW-sealed-opponent.dck"] EXPERIMENT_TIMESTAMP = datetime.datetime.now().strftime("%d%m%H%M") EXPERIMENT_FOLDER = "results/" + EXPERIMENT_TIMESTAMP TERMINATION_TRESHOLD = 65 diff --git a/EA/fitness.py b/EA/fitness.py index 5d86a67..9ae3cf8 100644 --- a/EA/fitness.py +++ b/EA/fitness.py @@ -11,16 +11,19 @@ def build_cmd(candidate_name, opponent_name, nr_matches): '-n', nr_matches, '-f', 'sealed'] -def evaluate_deck_by_wins(individual): +def evaluate_deck_by_wins(data): - number_of_matches = len(ct.OPPONENTS) * ct.MATCHES_PER_OPPONENT + individual = data[0] + matches_per_opponent = data[1] + + number_of_matches = len(ct.OPPONENTS) * int(matches_per_opponent) decklist = genome_to_decklist(individual) filename = "candidate.dck" write_decklist(ct.CARD_DIRECTORY + filename, decklist) wins = 0 for opponent in ct.OPPONENTS: - cmd = build_cmd(filename, opponent, ct.MATCHES_PER_OPPONENT) + cmd = build_cmd(filename, opponent, matches_per_opponent) p = subprocess.Popen(cmd, cwd=ct.FORGE_PATH, stdout=subprocess.PIPE) for line in p.stdout: line = line.decode("utf-8").strip() diff --git a/EA/mail.py b/EA/mail.py index 7854d3e..d625cc1 100644 --- a/EA/mail.py +++ b/EA/mail.py @@ -8,6 +8,7 @@ from email.utils import COMMASPACE, formatdate + def send_mail(send_to, text, files=[], isTls=True): print('Sending mail') msg = MIMEMultipart() diff --git a/EA/main.py b/EA/main.py index 8fc83f1..4b0ab74 100644 --- a/EA/main.py +++ b/EA/main.py @@ -1,6 +1,8 @@ +import argparse import copy import os import time +import sys from random import randint from statistics import median @@ -68,9 +70,30 @@ def mate_individuals(ind1, ind2): return ind1, ind2 +def parse_arguments(): + ap = argparse.ArgumentParser() + ap.add_argument('-g', '--gens', type=str, help='number of generations') + ap.add_argument('-m', '--matches', type=float, help='matches per opponent') + args = vars(ap.parse_args()) + + if args['gens'] is None: + print('Number of generations not specified with -g, using default of 200') + else: + ct.NUMBER_OF_GENERATIONS = int(args['gens']) + print(ct.NUMBER_OF_GENERATIONS) + + if args['matches'] is None: + print("Number of matches per opponent not specified with -m, using default of 50") + else: + ct.MATCHES_PER_OPPONENT = str(int(args['matches'])) + print(ct.MATCHES_PER_OPPONENT) + + def main(): - # TODO: VELG BREEDING OG MUTASJONSSTRATEGI + + parse_arguments() number_of_matches = int(ct.MATCHES_PER_OPPONENT) * len(ct.OPPONENTS) * ct.NUMBER_OF_GENERATIONS * ct.POPSIZE + print('Starting experiment {}'.format(ct.EXPERIMENT_TIMESTAMP)) print('Doing {} matches'.format(number_of_matches)) @@ -97,8 +120,11 @@ def main(): for gen in range(ct.NUMBER_OF_GENERATIONS): offspring = algorithms.varAnd(population, toolbox, cxpb=ct.CROSSOVER_RATE, mutpb=ct.MUTATION_RATE) - fits = list(futures.map(toolbox.evaluate, offspring)) - print("Generation {}, {}".format(gen, fits)) + + offspring_and_matches = [(x, ct.MATCHES_PER_OPPONENT) for x in offspring] + + fits = list(futures.map(toolbox.evaluate, offspring_and_matches)) + for fit, ind in zip(fits, offspring): ind.fitness.values = fit population = toolbox.select(offspring, k=len(population)) @@ -108,11 +134,17 @@ def main(): for i, solution in enumerate(population): write_decklist(card_location + "/" + str(i) + '.dck', genome_to_decklist(solution)) fitness_list = [x[0] for x in fits] + maximum = max(fitness_list) strongest_individual = tools.selBest(population, k=1) median_score = median(fitness_list) + + minimum = min(fitness_list) + + print("Generation {}, max: {} median: {} min: ".format(gen, median_score, median_score, minimum)) + if median_score > best_median: best_median = median_score last_improvement = gen @@ -147,4 +179,3 @@ def main(): except Exception as e: print("Unexpected error:\n{}".format(e)) send_mail(['sverrejb@stud.ntnu.no', 'knutfludal@gmail.com'], "The program has crashed:\n{}".format(e)) - diff --git a/EA/test2.py b/EA/test2.py new file mode 100644 index 0000000..784ceab --- /dev/null +++ b/EA/test2.py @@ -0,0 +1,45 @@ +import subprocess + +def build_cmd(candidate_name, opponent_name, nr_matches): + return ['java', '-Xmx1024m', '-jar', + 'forge-gui-desktop-1.5.61-SNAPSHOT-jar-with-dependencies.jar', 'sim', + '-d', candidate_name, opponent_name, + '-n', nr_matches, '-f', 'sealed'] + + + +#total_damage = 0 +wins = 0 +OPPONENTS = ["GB-sealed-opponent.dck", "UWg-sealed-opponent.dck", "RG-sealed-opponent.dck", + "BGw-sealed-opponent.dck", "UR-sealed-opponent.dck", "RW-sealed-opponent.dck"] + +for challenger in OPPONENTS: + print(challenger) + with open("results\\tournament\\" + challenger.replace(".dck", ".txt"),"w") as file: + file.write("This was " + challenger + "playing versus:\n\n") + for opponent in OPPONENTS: + print(opponent) + wins = 0 + for i in range(25): + print(i) + cmd = build_cmd(challenger, opponent, str(50)) + p = subprocess.Popen(cmd, cwd="C:\\Users\\Public\\IC\\forge-gui-desktop-1.5.60", stdout=subprocess.PIPE) + for line in p.stdout: + line = line.decode("utf-8").strip() + #if challenger=="RG-sealed-opponent.dck": + # print(line) + # if 'combat damage to Ai(2' in line: + # hit_event = line.split(' ') + # # print(hit_event) #For debugging + # damage_index = hit_event.index('deals') + 1 + # damage = int(hit_event[damage_index]) + # total_damage += damage + if 'Match result' in line: + result = line.split(' ') + wins += int(result[4]) + p.wait() + + with open("results\\tournament\\" + challenger.replace(".dck", ".txt"), "a") as file: + file.write(opponent + ": {}\n \n".format(wins)) + + diff --git a/EA/tournament.py b/EA/tournament.py new file mode 100644 index 0000000..623cb66 --- /dev/null +++ b/EA/tournament.py @@ -0,0 +1,37 @@ +import subprocess + +import constants as ct +from decks import genome_to_decklist, write_decklist + +def build_cmd(candidate_name, opponent_name, nr_matches): + return ['java', '-Xmx1024m', '-jar', + 'forge-gui-desktop-1.5.61-SNAPSHOT-jar-with-dependencies.jar', 'sim', + '-d', candidate_name, opponent_name, + '-n', nr_matches, '-f', 'sealed'] + + + +total_damage = 0 +wins = 0 +# colors,lands = colorsymbols_in_deck(CARDS, decklist) + +for challenger in ct.OPPONENTS: + total_wins=0 + for i in range(20): + for opponent in ct.OPPONENTS: + cmd = build_cmd(challenger, opponent, ct.MATCHES_PER_OPPONENT) + p = subprocess.Popen(cmd, cwd=ct.FORGE_PATH, stdout=subprocess.PIPE) + for line in p.stdout: + line = line.decode("utf-8").strip() + #print(line) + # if 'combat damage to Ai(2' in line: + # hit_event = line.split(' ') + # # print(hit_event) #For debugging + # damage_index = hit_event.index('deals') + 1 + # damage = int(hit_event[damage_index]) + # total_damage += damage + if 'Match result' in line: + result = line.split(' ') + wins += int(result[3]) + p.wait() + total_wins+=wins \ No newline at end of file diff --git a/AER-pool-1.txt b/decks/AER-pool-1.txt similarity index 100% rename from AER-pool-1.txt rename to decks/AER-pool-1.txt diff --git a/AER-pool-2.txt b/decks/AER-pool-2.txt similarity index 100% rename from AER-pool-2.txt rename to decks/AER-pool-2.txt diff --git a/BGw-sealed-opponent.dck b/decks/BGw-sealed-opponent.dck similarity index 100% rename from BGw-sealed-opponent.dck rename to decks/BGw-sealed-opponent.dck diff --git a/GB-sealed-opponent.dck b/decks/GB-sealed-opponent.dck similarity index 100% rename from GB-sealed-opponent.dck rename to decks/GB-sealed-opponent.dck diff --git a/README.md b/decks/README.md similarity index 100% rename from README.md rename to decks/README.md diff --git a/decks/RG-sealed-opponent.dck b/decks/RG-sealed-opponent.dck new file mode 100644 index 0000000..6a20241 --- /dev/null +++ b/decks/RG-sealed-opponent.dck @@ -0,0 +1,26 @@ +[metadata] +Name=RG aggro 2 +[Main] +8 Mountain +1 Sky Skiff +1 Harnessed Lightning +2 Spireside Infiltrator +1 Chandra's Pyrohelix +1 Highspire Artisan +1 Wayward Giant +1 Blossoming Defense +1 Wild Wanderer +1 Whirlermaker +8 Forest +2 Welding Sparks +1 Fairgrounds Trumpeter +1 Fateful Showdown +1 Elegant Edgecrafters +1 Brazen Scourge +1 Attune with Aether +1 Thriving Rhino +1 Cultivator of Blades +1 Fleetwheel Cruiser +1 Oviya Pashiri, Sage Lifecrafter +2 Voltaic Brawler +1 Renegade Freighter \ No newline at end of file diff --git a/decks/RW-sealed-opponent.dck b/decks/RW-sealed-opponent.dck new file mode 100644 index 0000000..ebf76f6 --- /dev/null +++ b/decks/RW-sealed-opponent.dck @@ -0,0 +1,25 @@ +[metadata] +Name=RW aggro +[Main] +1 Bomat Bazaar Barge +2 Brazen Scourge +1 Chief of the Foundry +1 Combustible Gearhulk +1 Consul's Shieldguard +1 Fleetwheel Cruiser +1 Fragmentize +3 Gearshift Ace +1 Glint-Sleeve Artisan +1 Inventor's Apprentice +9 Mountain +8 Plains +1 Propeller Pioneer +1 Renegade Freighter +1 Revoke Privileges +1 Scrapheap Scrounger +1 Sky Skiff +1 Skyship Stalker +1 Thriving Grubs +1 Veteran Motorist +1 Visionary Augmenter +1 Weldfast Monitor \ No newline at end of file diff --git a/decks/Sveinung_2_RG.txt b/decks/Sveinung_2_RG.txt new file mode 100644 index 0000000..de364b0 --- /dev/null +++ b/decks/Sveinung_2_RG.txt @@ -0,0 +1,71 @@ +8 Mountain +1 Sky Skiff +1 Harnessed Lightning +2 Spireside Infiltrator +1 Chandra's Pyrohelix +1 Highspire Artisan +1 Wayward Giant +1 Blossoming Defense +1 Wild Wanderer +1 Whirlermaker +8 Forest +2 Welding Sparks +1 Fairgrounds Trumpeter +1 Fateful Showdown +1 Elegant Edgecrafters +1 Brazen Scourge +1 Attune with Aether +1 Thriving Rhino +1 Cultivator of Blades +1 Fleetwheel Cruiser +1 Oviya Pashiri, Sage Lifecrafter +2 Voltaic Brawler +1 Renegade Freighter + +1 Inspired Charge +1 Refurbish +1 Propeller Pioneer +1 Skywhaler's Shot +1 Herald of the Fair +1 Acrobatic Maneuver +1 Ninth Bridge Patrol +1 Eddytrail Hawk +3 Aviary Mechanic +1 Tasseled Dromedary +1 Failed Inspection +1 Weldfast Wingsmith +2 Disappearing Act +2 Dramatic Reversal +1 Curio Vendor +1 Minister of Inquiries +1 Demon of Dark Schemes +1 Prakhata Club Security +2 Maulfist Squad +1 Aetherborn Marauder +1 Essence Extraction +1 Mind Rot +1 Make Obsolete +1 Live Fast +2 Lawless Broker +1 Foundry Screecher +2 Fortuitous Find +1 Syndicate Trafficker +1 Subtle Strike +2 Rush of Vitality +1 Die Young +1 Harsh Scrutiny +1 Salivating Gremlins +1 Spark of Creativity +1 Renegade Tactics +2 Cowl Prowler +2 Larger Than Life +1 Take Down +2 Ornamental Courage +1 Aradara Express +1 Dynavolt Tower +1 Woodweaver's Puzzleknot +3 Torch Gauntlet +1 Sky Skiff +1 Metalspinner's Puzzleknot +1 Fireforger's Puzzleknot +1 Sequestered Stash diff --git a/decks/Sveinung_2b_GB.txt b/decks/Sveinung_2b_GB.txt new file mode 100644 index 0000000..b7b0d08 --- /dev/null +++ b/decks/Sveinung_2b_GB.txt @@ -0,0 +1,71 @@ +8 Forest +1 Sky Skiff +1 Aetherborn Marauder +1 Demon of Dark Schemes +1 Essence Extraction +8 Swamp +1 Highspire Artisan +2 Maulfist Squad +1 Blossoming Defense +1 Wild Wanderer +1 Foundry Screecher +1 Die Young +2 Lawless Broker +1 Fairgrounds Trumpeter +1 Syndicate Trafficker +1 Elegant Edgecrafters +1 Subtle Strike +1 Attune with Aether +1 Thriving Rhino +1 Cultivator of Blades +1 Fleetwheel Cruiser +1 Oviya Pashiri, Sage Lifecrafter +1 Live Fast +1 Renegade Freighter + +1 Inspired Charge +1 Refurbish +1 Propeller Pioneer +1 Skywhaler's Shot +1 Herald of the Fair +1 Acrobatic Maneuver +1 Ninth Bridge Patrol +1 Eddytrail Hawk +3 Aviary Mechanic +1 Tasseled Dromedary +1 Failed Inspection +1 Weldfast Wingsmith +2 Disappearing Act +2 Dramatic Reversal +1 Curio Vendor +1 Minister of Inquiries +1 Prakhata Club Security +1 Mind Rot +1 Make Obsolete +2 Fortuitous Find +1 Whirlermaker +2 Rush of Vitality +1 Harsh Scrutiny +1 Brazen Scourge +1 Fateful Showdown +1 Salivating Gremlins +1 Harnessed Lightning +1 Chandra's Pyrohelix +1 Spark of Creativity +1 Renegade Tactics +2 Cowl Prowler +2 Welding Sparks +1 Wayward Giant +2 Larger Than Life +1 Take Down +2 Ornamental Courage +2 Spireside Infiltrator +1 Aradara Express +2 Voltaic Brawler +1 Dynavolt Tower +1 Woodweaver's Puzzleknot +3 Torch Gauntlet +1 Sky Skiff +1 Metalspinner's Puzzleknot +1 Fireforger's Puzzleknot +1 Sequestered Stash diff --git a/decks/Sveinung_3_RW.txt b/decks/Sveinung_3_RW.txt new file mode 100644 index 0000000..e710ea2 --- /dev/null +++ b/decks/Sveinung_3_RW.txt @@ -0,0 +1,74 @@ +1 Revoke Privileges +9 Mountain +8 Plains +1 Consul's Shieldguard +1 Combustible Gearhulk +1 Inventor's Apprentice +1 Visionary Augmenter +3 Gearshift Ace +1 Weldfast Monitor +1 Skyship Stalker +1 Fleetwheel Cruiser +1 Sky Skiff +1 Scrapheap Scrounger +1 Renegade Freighter +1 Chief of the Foundry +1 Propeller Pioneer +1 Glint-Sleeve Artisan +1 Fragmentize +1 Veteran Motorist +2 Brazen Scourge +1 Bomat Bazaar Barge +1 Thriving Grubs + +1 Concealed Courtyard +2 Wily Bandar +1 Take Down +1 Ornamental Courage +1 Spark of Creativity +1 Ruinous Gremlin +1 Harsh Scrutiny +1 Fragmentize +1 Built to Last +1 Torch Gauntlet +1 Fretwork Colony +1 Servant of the Conduit +2 Larger Than Life +1 Commencement of Festivities +2 Foundry Screecher +2 Cathartic Reunion +1 Woodweaver's Puzzleknot +1 Rush of Vitality +1 Revolutionary Rebuff +2 Impeccable Timing +1 Eddytrail Hawk +1 Gonti, Lord of Luxury +1 Thriving Rats +1 Prakhata Pillar-Bug +1 Die Young +1 Thriving Rhino +1 Appetite for the Unnatural +1 Hijack +1 Spireside Infiltrator +1 Lost Legacy +2 Live Fast +1 Cogworker's Puzzleknot +1 Lawless Broker +1 Glassblower's Puzzleknot +1 Fortuitous Find +1 Wind Drake +2 Aether Tradewinds +1 Herald of the Fair +1 Restoration Gearsmith +1 Peema Outrider +3 Wild Wanderer +1 Tezzeret's Ambition +2 Failed Inspection +1 Glimmer of Genius +1 Thriving Ibex +1 Aradara Express +1 Engineered Might +1 Wayward Giant +1 Ambitious Aetherborn +1 Skyswirl Harrier +2 Workshop Assistant diff --git a/decks/Sveinung_4_UR.txt b/decks/Sveinung_4_UR.txt new file mode 100644 index 0000000..5252f1d --- /dev/null +++ b/decks/Sveinung_4_UR.txt @@ -0,0 +1,72 @@ +1 Thriving Turtle +2 Glassblower's Puzzleknot +2 Aether Meltdown +2 Minister of Inquiries +1 Gearseeker Serpent +10 Island +1 Skyship Stalker +2 Bastion Mastodon +1 Aethersquall Ancient +1 Hightide Hermit +1 Welding Sparks +1 Weldfast Monitor +7 Mountain +1 Insidious Will +1 Tezzeret's Ambition +1 Long-Finned Skywhale +1 Padeem, Consul of Innovation +2 Chandra's Pyrohelix +1 Malfunction +1 Glimmer of Genius + +1 Wily Bandar +1 Take Down +1 Renegade Tactics +1 Night Market Lookout +1 Harsh Scrutiny +1 Ballista Charger +1 Ceremonious Rejection +1 Fragmentize +1 Built to Last +1 Sage of Shaila's Claim +1 Narnam Cobra +1 Larger Than Life +1 Thriving Grubs +1 Cathartic Reunion +2 Rush of Vitality +1 Cogworker's Puzzleknot +1 Die Young +1 Fireforger's Puzzleknot +1 Dhund Operative +1 Trusty Companion +1 Pressure Point +2 Eddytrail Hawk +1 Workshop Assistant +1 Spireside Infiltrator +1 Renegade Freighter +2 Prakhata Pillar-Bug +1 Unlicensed Disintegration +1 Ghirapur Guide +1 Appetite for the Unnatural +1 Brazen Scourge +3 Lost Legacy +1 Lawless Broker +1 Revoke Privileges +1 Wild Wanderer +1 Hunt the Weak +1 Armorcraft Judge +3 Terror of the Fairgrounds +2 Demolish +1 Maulfist Squad +1 Weldfast Wingsmith +1 Inspired Charge +1 Thriving Ibex +2 Refurbish +2 Propeller Pioneer +1 Revolutionary Rebuff +1 Hightide Hermit +1 Engineered Might +1 Wayward Giant +1 Tidy Conclusion +1 Demolition Stomper +1 Cowl Prowler diff --git a/decks/UR-sealed-opponent.dck b/decks/UR-sealed-opponent.dck new file mode 100644 index 0000000..d39367e --- /dev/null +++ b/decks/UR-sealed-opponent.dck @@ -0,0 +1,23 @@ +[metadata] +Name=UR control +[Main] +1 Thriving Turtle +2 Glassblower's Puzzleknot +2 Aether Meltdown +2 Minister of Inquiries +1 Gearseeker Serpent +10 Island +1 Skyship Stalker +2 Bastion Mastodon +1 Aethersquall Ancient +1 Hightide Hermit +1 Welding Sparks +1 Weldfast Monitor +7 Mountain +1 Insidious Will +1 Tezzeret's Ambition +1 Long-Finned Skywhale +1 Padeem, Consul of Innovation +2 Chandra's Pyrohelix +1 Malfunction +1 Glimmer of Genius \ No newline at end of file diff --git a/UW-sealed-opponent.dck b/decks/UW-sealed-opponent.dck similarity index 100% rename from UW-sealed-opponent.dck rename to decks/UW-sealed-opponent.dck diff --git a/decks/deck_sveinung.txt b/decks/deck_sveinung.txt new file mode 100644 index 0000000..9b5da11 --- /dev/null +++ b/decks/deck_sveinung.txt @@ -0,0 +1,81 @@ +1 Chandra's Revolution +2 Frontline Rebel +1 Outland Boar +1 Aether Chaser +1 Ballista Charger +1 Welder Automaton +1 Druid of the Cowl +1 Scrounging Bandar +1 Aetherstream Leopard +1 Daredevil Dragster +1 Lifecraft Cavalry +7 Mountain +1 Aether Herder +1 Scrapper Champion +1 Monstrous Onslaught +1 Nature's Way +1 Metallic Mimic +1 Implement of Ferocity +9 Forest +1 Narnam Renegade +1 Ornamental Courage +1 Attune with Aether +1 Release the Gremlins // denne ga feilmeldinger, så den ble byttet ut med chandra's revolution +1 Spontaneous Artist +1 Quicksmith Rebel + +1 Spire of Industry +1 Universal Solvent +1 Implement of Improvement +1 Unbridled Growth +1 Augmenting Automaton +2 Precise Strike +1 Night Market Lookout +1 Harsh Scrutiny +1 Gonti's Machinations +1 Take into Custody +1 Sky Skiff +1 Lifecraft Cavalry +1 Aegis Automaton +1 Wrangle +1 Cathartic Reunion +1 Underhanded Designs +1 Glint-Sleeve Siphoner +1 Ice Over +1 Curio Vendor +1 Aether Theorist +1 Trusty Companion +1 Impeccable Timing +1 Audacious Infiltrator +1 Workshop Assistant +1 Consulate Turret +1 Highspire Artisan +2 Renegade's Getaway +1 Defiant Salvager +1 Revoke Privileges +1 Ghirapur Osprey +1 Caught in the Brights +1 Bastion Enforcer +1 Irontread Crusher +1 Aetherflux Reservoir +1 Spire Patrol +1 Wild Wanderer +1 Sweatworks Brawler +1 Gremlin Infestation +1 Demolish +1 Long-Finned Skywhale +1 Failed Inspection +1 Padeem, Consul of Innovation +1 Inspired Charge +1 Propeller Pioneer +1 Deft Dismissal +1 Aeronaut Admiral +1 Reservoir Walker +1 Prizefighter Construct +2 Foundry Assembler +1 Perilous Predicament +1 Reverse Engineer +1 Wind-Kin Raiders +1 Bastion Inventor +1 Fen Hauler +1 Gearseeker Serpent diff --git a/decks/final decklists/BGw-sealed-opponent.dck b/decks/final decklists/BGw-sealed-opponent.dck new file mode 100644 index 0000000..facb109 --- /dev/null +++ b/decks/final decklists/BGw-sealed-opponent.dck @@ -0,0 +1,29 @@ +[metadata] +Name=BGw midrange +[Main] +thopter arrest +wispweaver angel +caught in the brights +countless gears renegade +revoke privileges +battle at the bridge +fatal push +gifted aetherborn +daring demolition +maulfist squad +tidy conclusion +nissa, vital force +elegant edgecrafters +appetite for the unnatural +druid of the cowl +lifecraft cavalry +scrounging bandar +silkweaver elite +thriving Rhino +unbridled Growth +pacification array +prakhata pillar-bug +prophetic prism +7 forest +6 swamp +4 plains \ No newline at end of file diff --git a/decks/final decklists/GB-sealed-opponent.dck b/decks/final decklists/GB-sealed-opponent.dck new file mode 100644 index 0000000..7fde4b2 --- /dev/null +++ b/decks/final decklists/GB-sealed-opponent.dck @@ -0,0 +1,28 @@ +[metadata] +Name=GB midrange +[Main] +2 unbridled growth +1 narnam Renegade +1 scrapheap scrounger +1 gifted aetherborn +1 Dhund Operative +1 fretwork colony +1 prophetic prism +1 conviction +1 revoke privileges +1 renegade rallier +1 thopter arrest +1 lawless broker +1 caught in the brights +1 maulfist Revolutionary +1 night market aeronaut +1 irontread crusher +1 daring demolition +1 peema outrider +1 Lifecraft cavalry +1 aid from the cowl +1 cowl prowler +1 rishkar's expertise +2 plains +8 forest +7 swamp \ No newline at end of file diff --git a/decks/final decklists/RG-sealed-opponent.dck b/decks/final decklists/RG-sealed-opponent.dck new file mode 100644 index 0000000..8313dae --- /dev/null +++ b/decks/final decklists/RG-sealed-opponent.dck @@ -0,0 +1,26 @@ +[metadata] +Name=RG aggro +[Main] +8 Mountain +1 Sky Skiff +1 Shock +2 Spireside Infiltrator +1 Chandra's Pyrohelix +1 Highspire Artisan +1 Wayward Giant +1 Blossoming Defense +1 Wild Wanderer +1 Whirlermaker +8 Forest +2 Welding Sparks +1 Fairgrounds Trumpeter +1 Fateful Showdown +1 Elegant Edgecrafters +1 Brazen Scourge +1 Attune with Aether +1 Thriving Rhino +1 Cultivator of Blades +1 Fleetwheel Cruiser +1 Oviya Pashiri, Sage Lifecrafter +2 Voltaic Brawler +1 Renegade Freighter \ No newline at end of file diff --git a/decks/final decklists/RW-sealed-opponent.dck b/decks/final decklists/RW-sealed-opponent.dck new file mode 100644 index 0000000..ebf76f6 --- /dev/null +++ b/decks/final decklists/RW-sealed-opponent.dck @@ -0,0 +1,25 @@ +[metadata] +Name=RW aggro +[Main] +1 Bomat Bazaar Barge +2 Brazen Scourge +1 Chief of the Foundry +1 Combustible Gearhulk +1 Consul's Shieldguard +1 Fleetwheel Cruiser +1 Fragmentize +3 Gearshift Ace +1 Glint-Sleeve Artisan +1 Inventor's Apprentice +9 Mountain +8 Plains +1 Propeller Pioneer +1 Renegade Freighter +1 Revoke Privileges +1 Scrapheap Scrounger +1 Sky Skiff +1 Skyship Stalker +1 Thriving Grubs +1 Veteran Motorist +1 Visionary Augmenter +1 Weldfast Monitor \ No newline at end of file diff --git a/decks/final decklists/UR-sealed-opponent.dck b/decks/final decklists/UR-sealed-opponent.dck new file mode 100644 index 0000000..d39367e --- /dev/null +++ b/decks/final decklists/UR-sealed-opponent.dck @@ -0,0 +1,23 @@ +[metadata] +Name=UR control +[Main] +1 Thriving Turtle +2 Glassblower's Puzzleknot +2 Aether Meltdown +2 Minister of Inquiries +1 Gearseeker Serpent +10 Island +1 Skyship Stalker +2 Bastion Mastodon +1 Aethersquall Ancient +1 Hightide Hermit +1 Welding Sparks +1 Weldfast Monitor +7 Mountain +1 Insidious Will +1 Tezzeret's Ambition +1 Long-Finned Skywhale +1 Padeem, Consul of Innovation +2 Chandra's Pyrohelix +1 Malfunction +1 Glimmer of Genius \ No newline at end of file diff --git a/UWg-sealed-opponent.dck b/decks/final decklists/UWg-sealed-opponent.dck similarity index 100% rename from UWg-sealed-opponent.dck rename to decks/final decklists/UWg-sealed-opponent.dck diff --git a/decks/results/20031812.txt b/decks/results/20031812.txt new file mode 100644 index 0000000..38fdf05 --- /dev/null +++ b/decks/results/20031812.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 1 +Number of matches pr opponent: 5 +Number of opponents: 2 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck'] +Total number of matches: 100 +Time to complete: 133.23674249649048 +Avg time per match: 1.3323674249649047 +Strongest overall individual: 4 +Topscore for each generation: +40.0, +Median score for each generation: +10.0, +Worst score for each generation: +0.0, +Overall best deck: +Caught in the Brights +Countless Gears Renegade +Glint-Sleeve Artisan +Curio Vendor +Weldfast Wingsmith +Lost Legacy +Ovalchase Daredevil +Aether Poisoner +Night Market Lookout +Resourceful Return +Aethertorch Renegade +Embraal Gear-Smasher +Hijack +Commencement of Festivities +Silkweaver Elite +Wily Bandar +Aethersphere Harvester +Daredevil Dragster +Accomplished Automaton +Implement of Combustion +Island +Mountain +Swamp +Plains +Forest +Mountain +Swamp +Mountain +Plains +Plains +Mountain +Mountain +Plains +Swamp +Plains +Plains +Mountain +Forest +Swamp +Forest diff --git a/decks/results/21030129.txt b/decks/results/21030129.txt new file mode 100644 index 0000000..c279642 --- /dev/null +++ b/decks/results/21030129.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 40 +Number of matches pr opponent: 25 +Number of opponents: 2 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck'] +Total number of matches: 20000 +Time to complete: 26082.868936538696 +Avg time per match: 1.3041434468269348 +Strongest overall individual: 22 +Topscore for each generation: +24.0, 28.000000000000004, 36.0, 36.0, 32.0, 30.0, 38.0, 34.0, 34.0, 32.0, 28.000000000000004, 28.000000000000004, 38.0, 28.000000000000004, 30.0, 32.0, 36.0, 32.0, 40.0, 30.0, 36.0, 34.0, 36.0, 32.0, 38.0, 42.0, 38.0, 42.0, 40.0, 38.0, 42.0, 34.0, 34.0, 36.0, 42.0, 42.0, 44.0, 42.0, 38.0, 34.0, +Median score for each generation: +14.000000000000002, 15.0, 20.0, 25.0, 23.0, 23.0, 23.0, 25.0, 25.0, 23.0, 17.0, 24.0, 26.0, 24.0, 21.0, 25.0, 28.000000000000004, 24.0, 20.0, 25.0, 28.000000000000004, 24.0, 30.0, 26.0, 35.0, 30.0, 28.999999999999996, 32.0, 30.0, 26.0, 31.0, 28.000000000000004, 26.0, 27.0, 30.0, 31.0, 24.0, 27.0, 28.999999999999996, 26.0, +Worst score for each generation: +6.0, 6.0, 12.0, 10.0, 16.0, 8.0, 14.000000000000002, 16.0, 18.0, 16.0, 6.0, 14.000000000000002, 20.0, 16.0, 12.0, 14.000000000000002, 16.0, 18.0, 12.0, 14.000000000000002, 16.0, 18.0, 22.0, 20.0, 20.0, 24.0, 20.0, 20.0, 20.0, 22.0, 20.0, 12.0, 22.0, 14.000000000000002, 22.0, 14.000000000000002, 18.0, 14.000000000000002, 22.0, 16.0, +Overall best deck: +Mountain +Glint-Sleeve Artisan +Curio Vendor +Vengeful Rebel +Aether Poisoner +Cruel Finality +Daring Demolition +Fortuitous Find +Maulfist Squad +Renegade's Getaway +Freejam Regent +Embraal Gear-Smasher +Night Market Lookout +Elegant Edgecrafters +Druid of the Cowl +Thriving Rhino +Hidden Stockpile +Renegade Rallier +Filigree Familiar +Accomplished Automaton +Renegade Freighter +Verdant Automaton +Island +Plains +Swamp +Mountain +Swamp +Mountain +Swamp +Mountain +Forest +Forest +Swamp +Swamp +Plains +Plains +Forest +Swamp +Mountain +Forest diff --git a/decks/results/21031159.txt b/decks/results/21031159.txt new file mode 100644 index 0000000..ec63aff --- /dev/null +++ b/decks/results/21031159.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 5 +Number of matches pr opponent: 10 +Number of opponents: 4 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck', 'UW-sealed-opponent.dck', 'BGw-sealed-opponent.dck'] +Total number of matches: 2000 +Time to complete: 2441.324812889099 +Avg time per match: 1.2206624064445495 +Strongest overall individual: 14 +Topscore for each generation: +25.0, 25.0, 27.500000000000004, 32.5, 35.0, +Median score for each generation: +15.0, 20.0, 16.25, 20.0, 23.75, +Worst score for each generation: +5.0, 12.5, 7.5, 7.5, 20.0, +Overall best deck: +Mountain +Forest +Aethersphere Harvester +Swamp +Forest +Forest +Night Market Lookout +Fen Hauler +Mountain +Swamp +Fortuitous Find +Island +Commencement of Festivities +Wily Bandar +Swamp +Island +Swamp +Mountain +Swamp +Island +Plains +Resourceful Return +Plains +Unlicensed Disintegration +Plains +Maulfist Squad +Freejam Regent +Island +Glint-Sleeve Artisan +Plains +Bastion Inventor +Hidden Stockpile +Kari Zev, Skyship Raider +Mountain +Swamp +Aether Poisoner +Plains +Swamp +Aethertorch Renegade +Take into Custody diff --git a/decks/results/21031258.txt b/decks/results/21031258.txt new file mode 100644 index 0000000..79a0841 --- /dev/null +++ b/decks/results/21031258.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 2 +Number of matches pr opponent: 2 +Number of opponents: 4 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck', 'UW-sealed-opponent.dck', 'BGw-sealed-opponent.dck'] +Total number of matches: 160 +Time to complete: 333.13094305992126 +Avg time per match: 2.0820683941245077 +Strongest overall individual: 5 +Topscore for each generation: +62.5, 37.5, +Median score for each generation: +25.0, 6.25, +Worst score for each generation: +0.0, 0.0, +Overall best deck: +Highspire Artisan +Consulate Turret +Hidden Stockpile +Vedalken Blademaster +Thriving Rats +Mountain +Island +Forest +Mountain +Forest +Swamp +Mountain +Swamp +Plains +Weldfast Wingsmith +Island +Ovalchase Daredevil +Plains +Filigree Familiar +Forest +Druid of the Cowl +Plains +Chandra, Torch of Defiance +Island +Island +Forest +Plains +Hinterland Drake +Aethersphere Harvester +Island +Maulfist Squad +scrapper champion +Invigorated Rampage +Kari Zev's Expertise +Sequestered Stash +Resourceful Return +Island +Audacious Infiltrator +Aether Swooper +Wily Bandar diff --git a/decks/results/21031306.txt b/decks/results/21031306.txt new file mode 100644 index 0000000..65e3870 --- /dev/null +++ b/decks/results/21031306.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 2 +Number of matches pr opponent: 2 +Number of opponents: 4 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck', 'UW-sealed-opponent.dck', 'BGw-sealed-opponent.dck'] +Total number of matches: 160 +Time to complete: 297.90844774246216 +Avg time per match: 1.8619277983903886 +Strongest overall individual: 3 +Topscore for each generation: +37.5, 25.0, +Median score for each generation: +12.5, 12.5, +Worst score for each generation: +0.0, 0.0, +Overall best deck: +Aether Poisoner +Thriving Rats +Chandra, Torch of Defiance +Forest +Gonti's Machinations +Embraal Gear-Smasher +Swamp +Invigorated Rampage +Forest +Deft Dismissal +Island +Renegade's Getaway +Forest +Accomplished Automaton +Aethersphere Harvester +Island +Daredevil Dragster +Failed Inspection +Swamp +Wind-Kin Raiders +Sequestered Stash +Shock +Plains +Filigree Familiar +Weldfast Wingsmith +Mountain +Elegant Edgecrafters +Filigree Crawler +Mountain +Forest +Daring Demolition +Swamp +Cruel Finality +Plains +Swamp +Island +Renegade Freighter +Hidden Stockpile +Aether Theorist +Night Market Lookout diff --git a/decks/results/21031314.txt b/decks/results/21031314.txt new file mode 100644 index 0000000..dd8cf7c --- /dev/null +++ b/decks/results/21031314.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 2 +Number of matches pr opponent: 2 +Number of opponents: 4 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck', 'UW-sealed-opponent.dck', 'BGw-sealed-opponent.dck'] +Total number of matches: 160 +Time to complete: 338.23952531814575 +Avg time per match: 2.113997033238411 +Strongest overall individual: 2 +Topscore for each generation: +25.0, 12.5, +Median score for each generation: +12.5, 6.25, +Worst score for each generation: +0.0, 0.0, +Overall best deck: +Forest +Audacious Infiltrator +Mountain +Swamp +Mountain +Plains +Kari Zev, Skyship Raider +Weldfast Wingsmith +Mountain +Forest +Cruel Finality +Mountain +Island +Forest +Plains +Fortuitous Find +Forest +Swamp +Mountain +Mountain +Island +Freejam Regent +Forest +Kari Zev's Expertise +Island +Daredevil Dragster +Audacious Infiltrator +Island +Verdant Automaton +Plains +Curio Vendor +Commencement of Festivities +Mountain +Plains +Swamp +Plains +Swamp +Plains +Island +Deft Dismissal diff --git a/decks/results/21031445.txt b/decks/results/21031445.txt new file mode 100644 index 0000000..57d7864 --- /dev/null +++ b/decks/results/21031445.txt @@ -0,0 +1,58 @@ +Experiment log: +Mutation rate: 0.2 +Crossover rate: 0.1 +Number of generations: 1 +Number of matches pr opponent: 1 +Number of opponents: 4 +Opponents: ['GB-sealed-opponent.dck', 'UWg-sealed-opponent.dck', 'UW-sealed-opponent.dck', 'BGw-sealed-opponent.dck'] +Total number of matches: 40 +Time to complete: 118.70794582366943 +Avg time per match: 2.967698645591736 +Strongest overall individual: 2 +Topscore for each generation: +50.0, +Median score for each generation: +25.0, +Worst score for each generation: +0.0, +Overall best deck: +Aether Herder +Built to Last +Chandra's Revolution +Concealed Courtyard +Daring Demolition +Diabolic Tutor +Druid of the Cowl +Fen Hauler +Fragmentize +Herald of Anguish +Implement of Malice +Irontread Crusher +Prakhata Pillar-Bug +Renegade Map +Reservoir Walker +Reverse Engineer +Revoke Privileges +Sage of Shaila's Claim +Treasure Keeper +Weldfast Wingsmith +Plains +Forest +Mountain +Mountain +Forest +Island +Swamp +Swamp +Plains +Mountain +Plains +Island +Forest +Swamp +Plains +Plains +Swamp +Forest +Mountain +Swamp diff --git a/decks/ubrukte decks/RG-sealed-opponent.dck b/decks/ubrukte decks/RG-sealed-opponent.dck new file mode 100644 index 0000000..f2902b0 --- /dev/null +++ b/decks/ubrukte decks/RG-sealed-opponent.dck @@ -0,0 +1,27 @@ +[metadata] +Name=RG aggro +[Main] +2 Chandra's Revolution +2 Frontline Rebel +1 Outland Boar +1 Aether Chaser +1 Ballista Charger +1 Welder Automaton +1 Druid of the Cowl +1 Scrounging Bandar +1 Aetherstream Leopard +1 Daredevil Dragster +1 Lifecraft Cavalry +7 Mountain +1 Aether Herder +1 Scrapper Champion +1 Monstrous Onslaught +1 Nature's Way +1 Metallic Mimic +1 Implement of Ferocity +9 Forest +1 Narnam Renegade +1 Ornamental Courage +1 Attune with Aether +1 Spontaneous Artist +1 Quicksmith Rebel \ No newline at end of file diff --git a/decks/ubrukte decks/UW-sealed-opponent.dck b/decks/ubrukte decks/UW-sealed-opponent.dck new file mode 100644 index 0000000..68279f5 --- /dev/null +++ b/decks/ubrukte decks/UW-sealed-opponent.dck @@ -0,0 +1,26 @@ +[metadata] +Name=UW control +[Main] +1 Acrobatic Maneuver +1 Aether Hub +1 Aether Swooper +1 AEther Tradewinds +1 Airdrop Aeronauts +1 Aradara Express +1 Audacious Infiltrator +1 Authority of the Consuls +1 Aviary Mechanic +1 Consul's Shieldguard +1 Consulate Crackdown +1 Conviction +1 Deadeye Harpooner +1 Felidar Guardian +2 Ghirapur Osprey +1 Glint-Sleeve Artisan +2 Hinterland Drake +7 island +10 plains +1 Ice Over +1 Sram's Expertise +1 Thriving Ibex +1 Visionary Augmenter \ No newline at end of file