approx = float(approx) if t == 'time': counter = [[0 for x in range(100)] for y in range(10)] averages = [] fptasSum, dynSum, j = 0, 0, 0 for n in range(minsize, 10*step + minsize, step): for i in range(100): filename = "tests/{0}_{3}_time_s{1}_i{2}".format(prefix, str(step), str(i), str(approx)) generateInstance(filename, int(n), int(n)*randint(1,n)) n, c, w = readInstance(filename) begin = time() fptasResult, _ = FPTAS(n, c, w, approx) fptasTime = time() - begin begin = time() dynResult, _ = knapsack(n, c, w) dynTime = time() - begin # counter[j][i] = [dynResult, fptasResult, dynTime, fptasTime] fptasSum += fptasTime dynSum += dynTime averages.append([n, dynSum/100.0, fptasSum/100.0, abs(dynSum-fptasSum)/float(dynSum)*100]) j += 1 fptasSum, dynSum = 0, 0 filename = "results/res_{0}_{1}_{3}_t_{2}".format(prefix, str(step), str(approx), str(minsize)) with open(filename, 'w') as f: for n in averages: print n f.write(str(n)[1:-1]+"\n") elif t == 'quality': res = []
def FPTAS(n, cap, wc, sf): nCap = int(float(cap)*sf) nWC = [(round(float(weight)* sf) + 1, cost) for weight, cost in wc] #print "APPROXIMATED: ", nCap, nWC #print return knapsack(n, nCap, nWC)
x, y = line.split() wc.append((int(x), int(y))) return n, cap, wc def generateInstance(filename, n, cap): with open(filename, 'w') as f: f.write(str(n) + '\n') f.write(str(cap) + '\n') for i in range(int(n)): w, c = randint(0, int(cap)), randint(0, 100) f.write(str(w) + ' ' + str(c) + '\n') if __name__ == '__main__': if len(sys.argv) < 3: print "Usage:\n" print "{0} approx filename".format(sys.argv[0]) print "{0} -g filename n capacity".format(sys.argv[0]) sys.exit() if sys.argv[1] == '-g': _, _, filename, n, cap = sys.argv generateInstance(filename, n, cap) sys.exit() approx = float(sys.argv[1]) n, cap, wc = readInstance(sys.argv[2]) print "INPUT: ", n, cap, wc print print FPTAS(n, cap, wc, approx) print print "DYNAMIC: ", knapsack(n, cap, wc)