lsa-pucrs / mas-pc-pucrs-2016

Repository for the 2016 MAS programming contest: https://multiagentcontest.org/
2 stars 1 forks source link

Bug - Job contendo materiais compostos de outros materiais - aparentemente compra quantidade errada #28

Closed tbasegio closed 9 years ago

tbasegio commented 9 years ago

Executei com um job solicitando: 2 unidades do material4. O material4 é composto por outros materiais, sendo um deles o material3 que é composto pelo material1 conforme arquivo anexo.

A quantidade de base2 comprada para o job parece não estar correta. Comprou: 64x base1 - ok 6x base3 - ok 36x base2 - parece estar errado.

issuetest1

anibalsolon commented 9 years ago

Eu calculei 36 de base2 também.

#!/usr/bin/env python

decomposable = {
    'm1': {
        'b1': 2,
        'b2': 2,
        't1': 1,
    },
    'm2': {
        'b1': 10,
        't3': 1,
    },
    'm3': {
        'b2': 2,
        'b3': 1,
        'm1': 2,
        't1': 1,
        't3': 1,
    },
    'm4': {
        'm1': 2,
        'm2': 2,
        'm3': 2,
        'b2': 2,
        'b3': 1,
        't1': 1,
        't3': 1,
    },
}

def multiply(res, quantity):
    res = dict(decomposable[res])
    for k in res:
        res[k] = res[k] * quantity
    return res

def merge(dict1, dict2):
    dict1 = dict(dict1)
    dict2 = dict(dict2)
    for m in dict1:
        if m in dict2:
            dict1[m] = dict1[m] + dict2[m]
    for n in dict2:
        if n not in dict1:
            dict1[n] = dict2[n]
    return dict1

def decompose(res, quantity=1):
    res = multiply(res, quantity)
    while set(res.keys()).intersection(set(decomposable.keys())): # Check if there is decomposable
        for mat in res:
            if mat in decomposable: # If resource is decomposable
                decomposed = decompose(mat, res[mat]) # Decompose it
                del res[mat] # Remove material, keep decomposition
                res = merge(res, decomposed)
                break # It changes res durint iteration, must stop it
    return res

print decompose('m4', 2)
# {'t3': 10, 't1': 18, 'b1': 64, 'b2': 36, 'b3': 6}