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
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'])
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)}
def f3wrapper(x0, parameters): parameters['Q1'] = x0[0] parameters['Q2'] = x0[1] parameters['Q3'] = x0[2] return -1. * f3TruncNormRVSnp(parameters)
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')