Esempio n. 1
0
def mypool(parameters, lb, ub, wid):
    # print "Start lb: ", lb, " ub: ", ub
    # print "parameters received by mypool: ", id(parameters)
    print "Starting worker %d..." % wid
    results = {}
    best = {'worker': wid, 'allocation': (-1, -1, -1), 'value': 0.0}

    A = int(parameters['A'])
    # print "A: ", A
    # counter = 0

    for i in xrange(lb, ub, parameters['gridstep']):
        for j in xrange(0, A - i + 1, parameters['gridstep']):

            k = A - i - j
            # print "--->i, j, k: ", i,", ",j,", ", k, ", ", i+j+k
            # counter += 1
            if i + j + k != A:
                print "ERROR: ", i + j + k, " LB: ", lb, " UB: ", ub

            # from integer to float, faster than float(i)
            parameters['Q1'] = 1. * i
            parameters['Q2'] = 1. * j
            parameters['Q3'] = 1. * k

            results[(i, j, k)] = f3TruncNormRVSnp(parameters)
            if best['value'] < results[(i, j, k)]:
                # print "old value: ", best['value'], " vs new value: ",results[(i,j,k)]
                best['value'] = results[(i, j, k)]
                best['allocation'] = (i, j, k)
                # print "update best value from worker %d: %f @ %d %d %d" % (wid, best['value'], i,j,k)

    print "Worker %d completed!" % wid
    return best
Esempio n. 2
0
def heu_allocation3(df, parameters):
    """
    Greedy heuristic for 3 supplier
    :param df: dataframe containing the data from the excel file
    :param parameters: parameters dict
    :return: write o the df and save on the file
    """

    for index, row in df.iterrows():
        print "Elaborating index {}".format(index)
        # read parameters from the excel file
        parameters['mu1'] = row['MU1']
        parameters['mu2'] = row['MU2']
        parameters['mu3'] = row['MU3']
        parameters['sigma1'] = row['S1']
        parameters['sigma2'] = row['S2']
        parameters['sigma3'] = row['S3']
        parameters['target'] = row['TARGET']
        parameters['A'] = row['AVAIL']

        rv1 = truncnorm_custom(parameters['min_intrv1'], parameters['max_intrv1'], parameters['mu1'], parameters['sigma1'])
        rv2 = truncnorm_custom(parameters['min_intrv2'], parameters['max_intrv2'], parameters['mu2'], parameters['sigma2'])
        rv3 = truncnorm_custom(parameters['min_intrv3'], parameters['max_intrv3'], parameters['mu3'], parameters['sigma3'])

        A = parameters['A']
        i = 0
        Q = {i:0 for i in xrange(3)}
        log = []

        while A >= 0:
            best_probability = -1
            best_retailer = -1
            l = {}
            for n, r in enumerate([rv1, rv2, rv3]):
                p = 1 - r.cdf(Q[n]+1)
                l[n] = p
                # print "n: {}   p: {}".format(n,p)
                if p > best_probability:
                    best_probability = p
                    best_retailer = n

            # print "Best retailer: {} with value {}".format(best_retailer, best_probability)
            Q[best_retailer] += 1
            A -= 1
            # print "Current allocation: {}".format(Q)
            log.append(l)

        # print "best allocation:"
        # print Q
        parameters['Q1'] = Q[0]
        parameters['Q2'] = Q[1]
        parameters['Q3'] = Q[2]

        df.ix[index, 'ALLOC_HEU'] = str(Q.values())
        df.ix[index, 'HEURISTIC_VALUE'] = f3TruncNormRVSnp(parameters)


    df.to_excel(parameters['outfile'])
Esempio n. 3
0
def greedy_allocation3(parameters):
    """
    Greedy heuristic for 3 supplier (the same as heu_allocation3 but with different parameters)
    Does not write on the file but returns the solution
    :param df: dataframe containing the data from the excel file
    :param parameters: parameters dict
    :return: write o the df and save on the file
    """
    if not parameters['distribution']:
        print 'No distribution set...abort'
        exit(1)
    elif parameters['distribution'] == 'truncnorm':
        rv1 = truncnorm_custom(parameters['min_intrv1'], parameters['max_intrv1'], parameters['mu1'], parameters['sigma1'])
        rv2 = truncnorm_custom(parameters['min_intrv2'], parameters['max_intrv2'], parameters['mu2'], parameters['sigma2'])
        rv3 = truncnorm_custom(parameters['min_intrv3'], parameters['max_intrv3'], parameters['mu3'], parameters['sigma3'])
    elif parameters['distribution'] == 'norm':
        rv1 = norm(parameters['mu1'], parameters['sigma1'])
        rv2 = norm(parameters['mu2'], parameters['sigma2'])
        rv3 = norm(parameters['mu3'], parameters['sigma3'])
    elif parameters['distribution'] == 'uniform':
        rv1 = uniform(loc=parameters['mu1'], scale=parameters['sigma1'])
        rv2 = uniform(loc=parameters['mu2'], scale=parameters['sigma2'])
        rv3 = uniform(loc=parameters['mu3'], scale=parameters['sigma3'])
    elif parameters['distribution'] == 'beta':
        rv1 = beta(a=parameters['min_intrv1'], b=parameters['max_intrv1'], loc=parameters['mu1'], scale=parameters['sigma1'])
        rv2 = beta(a=parameters['min_intrv2'], b=parameters['max_intrv2'], loc=parameters['mu2'], scale=parameters['sigma2'])
        rv3 = beta(a=parameters['min_intrv3'], b=parameters['max_intrv3'], loc=parameters['mu3'], scale=parameters['sigma3'])
    elif parameters['distribution'] == 'triang':
        rv1 = triang(loc=parameters['min_intrv1'], scale=parameters['max_intrv1'], c=parameters['mu1'])
        rv2 = triang(loc=parameters['min_intrv2'], scale=parameters['max_intrv2'], c=parameters['mu2'])
        rv3 = triang(loc=parameters['min_intrv3'], scale=parameters['max_intrv3'], c=parameters['mu3'])
    else:
        print 'Distribution not recognized...abort'
        exit(1)

    A = parameters['A']
    Q = {i: 0 for i in xrange(3)}

    while A > 0:
        best_probability = -1
        best_retailer = -1
        for n, r in enumerate([rv1, rv2, rv3]):
            p = 1 - r.cdf(Q[n]+1)
            if p > best_probability:
                best_probability = p
                best_retailer = n

        Q[best_retailer] += 1
        A -= 1

    parameters['Q1'] = Q[0]
    parameters['Q2'] = Q[1]
    parameters['Q3'] = Q[2]

    return {'Q1': Q[0],
            'Q2': Q[1],
            'Q3': Q[2],
            'PROB': f3TruncNormRVSnp(parameters)}
Esempio n. 4
0
def f3wrapper(x0, parameters):
    parameters['Q1'] = x0[0]
    parameters['Q2'] = x0[1]
    parameters['Q3'] = x0[2]
    return -1. * f3TruncNormRVSnp(parameters)
Esempio n. 5
0
        while A >= 0:
            best_probability = -1
            best_retailer = -1
            l = {}
            for n, r in enumerate([rv1, rv2, rv3]):
                p = 1 - r.cdf(Q[n]+1)
                l[n] = p
                # print "n: {}   p: {}".format(n,p)
                if p > best_probability:
                    best_probability = p
                    best_retailer = n

            # print "Best retailer: {} with value {}".format(best_retailer, best_probability)
            Q[best_retailer] += 1
            A -= 1
            # print "Current allocation: {}".format(Q)
            log.append(l)

        # print "best allocation:"
        # print Q
        parameters['Q1'] = Q[0]
        parameters['Q2'] = Q[1]
        parameters['Q3'] = Q[2]

        df.ix[index, 'ALLOC_HEU'] = str(Q.values())
        df.ix[index, 'HEURISTIC_VALUE'] = f3TruncNormRVSnp(parameters)


    df.to_excel('ex_6_with_heuristics_results.xlsx')