Finished week 1.

This commit is contained in:
2019-11-24 13:28:23 -05:00
commit e3a7b12a79
34 changed files with 14538 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.sublime-workspace
__pycache__

3
anyint/_coursera Normal file
View File

@@ -0,0 +1,3 @@
heD35Vv_EeajDAoJAOJJEw
Any Integer
mJWtY, _coursera, solver.py, Send an Integer

BIN
anyint/handout.pdf Normal file

Binary file not shown.

10
anyint/solver.py Normal file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
def solve_it(input_data):
# return a positive integer, as a string
return '10'
if __name__ == '__main__':
print('This script submits the integer: %s\n' % solve_it(''))

456
anyint/submit.py Executable file
View File

@@ -0,0 +1,456 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
import json
import time
import os
from collections import namedtuple
# Python 2/3 compatibility
# Python 2:
try:
from urlparse import urlparse
from urllib import urlencode
from urllib2 import urlopen, Request, HTTPError
except:
pass
# Python 3:
try:
from urllib.parse import urlparse, urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError
except:
pass
import sys
# Python 2:
if sys.version_info < (3, 0):
def input(str):
return raw_input(str)
# Python 3, backward compatibility with unicode test
if sys.version_info >= (3, 0):
unicode = type(str)
version = '1.0.0'
submitt_url = \
'https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1'
Metadata = namedtuple("Metadata", ['assignment_key', 'name', 'part_data'])
Part = namedtuple("Part", ['id', 'input_file', 'solver_file', 'name'])
def load_metadata(metadata_file_name='_coursera'):
'''
Parses an assignment metadata file
Args:
metadata_file_name (str): location of the metadata file
Returns:
metadata as a named tuple structure
'''
if not os.path.exists(metadata_file_name):
print('metadata file "%s" not found' % metadata_file_name)
quit()
try:
with open(metadata_file_name, 'r') as metadata_file:
url = metadata_file.readline().strip()
name = metadata_file.readline().strip()
part_data = []
for line in metadata_file.readlines():
if ',' in line:
line_parts = line.split(',')
line_parts = [x.strip() for x in line_parts]
assert(len(line_parts) == 4)
part_data.append(Part(*line_parts))
if len(url) <= 0:
print('Empty url in _coursera file: %s' % metadata_file_name)
quit()
if len(name) <= 0:
print('Empty assignment name in _coursera file: %s' % metadata_file_name)
quit()
except Exception as e:
print('problem parsing assignment metadata file')
print('exception message:')
print(e)
quit()
return Metadata(url, name, part_data)
def part_prompt(problems):
'''
Prompts the user for which parts of the assignment they would like to
submit.
Args:
problems: a list of assignment problems
Returns:
the selected subset of problems
'''
count = 1
print('Hello! These are the assignment parts that you can submit:')
for i, problem in enumerate(problems):
print(str(count) + ') ' + problem.name)
count += 1
print('0) All')
part_text = input('Please enter which part(s) you want to submit (0-%d): ' % (count-1))
selected_problems = []
selected_models = []
for item in part_text.split(','):
try:
i = int(item)
except:
print('Skipping input "' + item + '". It is not an integer.')
continue
if i >= count or i < 0:
print('Skipping input "' + item + '". It is out of the valid range (0-%d).' % (count-1))
continue
if i == 0:
selected_problems.extend(problems)
continue
if i <= len(problems):
selected_problems.append(problems[i-1])
if len(selected_problems) <= 0:
print('No valid assignment parts identified. Please try again. \n')
return part_prompt(problems)
else:
return selected_problems
def compute(metadata, solver_file_override=None):
'''
Determines which assignment parts the student would like to submit.
Then computes his/her answers to those assignment parts
Args:
metadata: the assignment metadata
solver_file_override: an optional model file to override the metadata
default
Returns:
a dictionary of results in the format Coursera expects
'''
if solver_file_override is not None:
print('Overriding solver file with: '+solver_file_override)
selected_problems = part_prompt(metadata.part_data)
results = {}
#submission needs empty dict for every assignment part
results.update({prob_data.id : {} for prob_data in metadata.part_data})
for problem in selected_problems:
if solver_file_override != None:
solver_file = solver_file_override
else:
solver_file = problem.solver_file
if not os.path.isfile(solver_file):
print('Unable to locate assignment file "%s" in the current working directory.' % solver_file)
continue
# if a relative path is given, add that patth to system path so import will work
if os.path.sep in solver_file:
split = solver_file.rfind(os.path.sep)
path = solver_file[0:split]
file_name = solver_file[split+1:]
sys.path.insert(0, path)
solver_file = file_name
submission = output(problem.input_file, solver_file)
if submission != None:
results[problem.id] = {'output':submission}
print('\n== Computations Complete ...')
return results
def load_input_data(file_location):
with open(file_location, 'r') as input_data_file:
input_data = ''.join(input_data_file.readlines())
return input_data
def output(input_file, solver_file):
'''
Attempts to execute solve_it locally on a given input file.
Args:
input_file: the assignment problem data of interest
solver_file: a python file containing the solve_it function
Returns:
the submission string in a format that the grader expects
'''
try:
pkg = __import__(solver_file[:-3]) # remove '.py' extension
if not hasattr(pkg, 'solve_it'):
print('the solve_it() function was not found in %s' % solver_file)
quit()
except ImportError:
print('import error with python file "%s".' % solver_file)
quit()
solution = ''
start = time.clock()
try:
solution = pkg.solve_it(load_input_data(input_file))
except Exception as e:
print('the solve_it(input_data) method from solver.py raised an exception')
print('try testing it with python ./solver.py before running this submission script')
print('exception message:')
print(str(e))
print('')
return 'Local Exception =('
end = time.clock()
if not (isinstance(solution, str) or isinstance(solution, unicode)):
print('Warning: the solver did not return a string. The given object will be converted with the str() method.')
solution = str(solution)
print('Submitting: ')
print(solution)
return solution.strip() + '\n' + str(end - start)
def login_dialog(assignment_key, results, credentials_file_location = '_credentials'):
'''
Requests Coursera login credentials from the student and submits the
student's solutions for grading
Args:
assignment_key: Coursera's assignment key
results: a dictionary of results in Cousera's format
credentials_file_location: a file location where login credentials can
be found
'''
success = False
tries = 0
while not success:
# stops infinate loop when credentials file is incorrect
if tries <= 0:
login, token = login_prompt(credentials_file_location)
else:
login, token = login_prompt('')
code, responce = submit_solution(assignment_key, login, token, results)
print('\n== Coursera Responce ...')
#print(code)
print(responce)
if code != 401:
success = True
else:
print('\ntry logging in again')
tries += 1
def login_prompt(credentials_file_location):
'''
Attempts to load credentials from a file, if that fails asks the user.
Returns:
the user's login and token
'''
if os.path.isfile(credentials_file_location):
try:
with open(credentials_file_location, 'r') as metadata_file:
login = metadata_file.readline().strip()
token = metadata_file.readline().strip()
metadata_file.close()
except:
login, token = basic_prompt()
else:
login, token = basic_prompt()
return login, token
def basic_prompt():
'''
Prompt the user for login credentials.
Returns:
the user's login and token
'''
login = input('User Name (e-mail address): ')
token = input('Submission Token (from the assignment page): ')
return login, token
def submit_solution(assignment_key, email_address, token, results):
'''
Sends the student's submission to Coursera for grading via the submission
API.
Args:
assignment_key: Coursera's assignment key
email_address: the student's email
token: the student's assignment token
results: a dictionary of results in Cousera's format
Returns:
the https response code and a feedback message
'''
print('\n== Connecting to Coursera ...')
print('Submitting %d of %d parts' %
(sum(['output' in v for k,v in results.items()]), len(results)))
# build json datastructure
parts = {}
submission = {
'assignmentKey': assignment_key,
'submitterEmail': email_address,
'secret': token,
'parts': results
}
# send submission
req = Request(submitt_url)
req.add_header('Cache-Control', 'no-cache')
req.add_header('Content-type', 'application/json')
try:
res = urlopen(req, json.dumps(submission).encode('utf8'))
except HTTPError as e:
responce = json.loads(e.read().decode('utf8'))
if 'details' in responce and responce['details'] != None and \
'learnerMessage' in responce['details']:
return e.code, responce['details']['learnerMessage']
else:
return e.code, 'Unexpected response code, please contact the ' \
'course staff.\nDetails: ' + responce['message']
code = res.code
responce = json.loads(res.read().decode('utf8'))
if code >= 200 and code <= 299:
return code, 'Your submission has been accepted and will be ' \
'graded shortly.'
return code, 'Unexpected response code, please contact the '\
'course staff.\nDetails: ' + responce
def main(args):
'''
1) Reads a metadata file to customize the submission process to
a particular assignment.
2) The compute the student's answers to the assignment parts.
3) Submits the student's answers for grading.
Provides the an option for saving the submissions locally. This is very
helpful when testing the assignment graders.
Args:
args: CLI arguments from an argparse parser
'''
# needed so that output can import from the cwd
sys.path.append(os.getcwd())
if args.metadata is None:
metadata = load_metadata()
else:
print('Overriding metadata file with: '+args.metadata)
metadata = load_metadata(args.metadata)
print('==\n== '+metadata.name+' Solution Submission \n==')
# compute dialog
results = compute(metadata, args.override)
if sum(['output' in v for k,v in results.items()]) <= 0:
return
# store submissions if requested
if args.record_submission == True:
print('Recording submission as files')
for sid, submission in results.items():
if 'output' in submission:
directory = '_'+sid
if not os.path.exists(directory):
os.makedirs(directory)
submission_file_name = directory+'/submission.sub'
print(' writting submission file: '+submission_file_name)
with open(submission_file_name,'w') as submission_file:
submission_file.write(submission['output'])
submission_file.close()
return
# submit dialog
if args.credentials is None:
login_dialog(metadata.assignment_key, results)
else:
print('Overriding credentials file with: '+args.credentials)
login_dialog(metadata.assignment_key, results, args.credentials)
import argparse
def build_parser():
'''
Builds an argument parser for the CLI
Returns:
parser: an argparse parser
'''
parser = argparse.ArgumentParser(
description='''The submission script for Discrete Optimization
assignments on the Coursera Platform.''',
epilog='''Please file bugs on github at:
https://github.com/discreteoptimization/assignment/issues. If you
would like to contribute to this tool's development, check it out at:
https://github.com/discreteoptimization/assignment'''
)
parser.add_argument('-v', '--version', action='version',
version='%(prog)s '+version)
parser.add_argument('-o', '--override',
help='overrides the python source file specified in the \'_coursera\' file')
parser.add_argument('-m', '--metadata',
help='overrides the \'_coursera\' metadata file')
parser.add_argument('-c', '--credentials',
help='overrides the \'_credentials\' credentials file')
parser.add_argument('-rs', '--record_submission',
help='records the submission(s) as files', action='store_true')
return parser
if __name__ == '__main__':
parser = build_parser()
main(parser.parse_args())

View File

@@ -0,0 +1,8 @@
{
"folders":
[
{
"path": "."
}
]
}

91
knapsack/Solver.java Normal file
View File

@@ -0,0 +1,91 @@
import java.io.*;
import java.util.List;
import java.util.ArrayList;
/**
* The class <code>Solver</code> is an implementation of a greedy algorithm to solve the knapsack problem.
*
*/
public class Solver {
/**
* The main class
*/
public static void main(String[] args) {
try {
solve(args);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Read the instance, solve it, and print the solution in the standard output
*/
public static void solve(String[] args) throws IOException {
String fileName = null;
// get the temp file name
for(String arg : args){
if(arg.startsWith("-file=")){
fileName = arg.substring(6);
}
}
if(fileName == null)
return;
// read the lines out of the file
List<String> lines = new ArrayList<String>();
BufferedReader input = new BufferedReader(new FileReader(fileName));
try {
String line = null;
while (( line = input.readLine()) != null){
lines.add(line);
}
}
finally {
input.close();
}
// parse the data in the file
String[] firstLine = lines.get(0).split("\\s+");
int items = Integer.parseInt(firstLine[0]);
int capacity = Integer.parseInt(firstLine[1]);
int[] values = new int[items];
int[] weights = new int[items];
for(int i=1; i < items+1; i++){
String line = lines.get(i);
String[] parts = line.split("\\s+");
values[i-1] = Integer.parseInt(parts[0]);
weights[i-1] = Integer.parseInt(parts[1]);
}
// a trivial greedy algorithm for filling the knapsack
// it takes items in-order until the knapsack is full
int value = 0;
int weight = 0;
int[] taken = new int[items];
for(int i=0; i < items; i++){
if(weight + weights[i] <= capacity){
taken[i] = 1;
value += values[i];
weight += weights[i];
} else {
taken[i] = 0;
}
}
// prepare the solution in the specified output format
System.out.println(value+" 0");
for(int i=0; i < items; i++){
System.out.print(taken[i]+" ");
}
System.out.println("");
}
}

8
knapsack/_coursera Normal file
View File

@@ -0,0 +1,8 @@
_le-pVv_EeasJA5dVmWj2w
Knapsack
awPVV, ./data/ks_30_0, solver.py, Knapsack Problem 1
hHYWS, ./data/ks_50_0, solver.py, Knapsack Problem 2
JwWnx, ./data/ks_200_0, solver.py, Knapsack Problem 3
Z2tMt, ./data/ks_400_0, solver.py, Knapsack Problem 4
PUIxa, ./data/ks_1000_0, solver.py, Knapsack Problem 5
AKXWc, ./data/ks_10000_0, solver.py, Knapsack Problem 6

10001
knapsack/data/ks_10000_0 Normal file

File diff suppressed because it is too large Load Diff

1001
knapsack/data/ks_1000_0 Normal file

File diff suppressed because it is too large Load Diff

101
knapsack/data/ks_100_0 Normal file
View File

@@ -0,0 +1,101 @@
100 100000
90000 90001
89750 89751
10001 10002
89500 89501
10252 10254
89250 89251
10503 10506
89000 89001
10754 10758
88750 88751
11005 11010
88500 88501
11256 11262
88250 88251
11507 11514
88000 88001
11758 11766
87750 87751
12009 12018
87500 87501
12260 12270
87250 87251
12511 12522
87000 87001
12762 12774
86750 86751
13013 13026
86500 86501
13264 13278
86250 86251
13515 13530
86000 86001
13766 13782
85750 85751
14017 14034
85500 85501
14268 14286
85250 85251
14519 14538
85000 85001
14770 14790
84750 84751
15021 15042
84500 84501
15272 15294
84250 84251
15523 15546
84000 84001
15774 15798
83750 83751
16025 16050
83500 83501
16276 16302
83250 83251
16527 16554
83000 83001
16778 16806
82750 82751
17029 17058
82500 82501
17280 17310
82250 82251
17531 17562
82000 82001
17782 17814
81750 81751
18033 18066
81500 81501
18284 18318
81250 81251
18535 18570
81000 81001
18786 18822
80750 80751
19037 19074
80500 80501
19288 19326
80250 80251
19539 19578
80000 80001
19790 19830
79750 79751
20041 20082
79500 79501
20292 20334
79250 79251
20543 20586
79000 79001
20794 20838
78750 78751
21045 21090
78500 78501
21296 21342
78250 78251
21547 21594
78000 78001
21798 21846
77750 77751
22049 22098
77500 77501

101
knapsack/data/ks_100_1 Normal file
View File

@@ -0,0 +1,101 @@
100 3190802
1491 3882
399 1298
77 654
969 2638
8485 20670
55 610
1904 4908
703 2106
657 2014
932 2564
1201 3302
1697 4494
462 1424
1201 3302
111632 267364
9044 21988
147380 352660
31852 76604
9044 21988
9300 22700
8660 21020
174684 418068
19844 47788
9044 21988
1635 4370
62788 150476
6932 16964
6308 15516
50 600
4600 11300
565204 1351508
7463 18226
2988 7476
9044 21988
9044 21988
4040 9980
137732 329764
7150 17400
9300 22700
177 854
372 1244
499 1498
15108 36516
11108 26916
2468 6236
1133 3166
1490 3880
865 2430
2468 6236
2468 6236
5974 14648
5972 14644
9532 23164
1872 4844
3964 9828
2799 7098
527708 1261916
7212 17724
3002 7504
21004 50708
47728 114556
565204 1351508
100600 240900
118920 284740
2822 7144
612 1924
6324 15548
9508 23116
9268 22636
11636 28172
210708 504116
2176944 5204588
930 2560
4481 11062
50 600
112 724
14434 34968
0 500
248 996
48 596
820 2340
278 1056
643 1986
1413 3726
1408 3716
0 500
2581 6662
287 1074
2040 5180
289 1078
1380 3660
372 1244
0 500
472 1444
360 1220
0 500
622 1944
3504 8708
5924 14548
2784 7068

101
knapsack/data/ks_100_2 Normal file
View File

@@ -0,0 +1,101 @@
100 10000
339 342
1629 1514
697 696
1299 1433
1613 1762
36 40
1737 1635
473 442
1859 1899
2055 1960
362 378
1104 1177
1880 1970
1349 1434
1545 1691
132 139
341 371
1430 1350
1878 1775
1870 1980
1536 1651
818 814
289 282
1690 1573
1437 1587
310 302
53 56
720 726
1707 1820
258 269
1842 1680
757 842
1642 1730
1149 1243
1970 1794
749 775
1904 1810
2 3
967 970
1310 1261
1004 997
1295 1192
1056 1036
51 52
1320 1453
1580 1673
480 440
604 624
1766 1813
1198 1326
1762 1637
2046 1902
315 323
714 746
434 471
1461 1366
1652 1511
1876 1785
906 1002
1483 1560
1355 1403
510 513
2114 1958
1479 1505
1618 1538
1472 1378
310 315
1478 1493
970 1066
43 40
1231 1172
1792 1972
870 956
1484 1541
1049 1014
56 55
814 793
978 985
1215 1311
720 737
210 204
460 492
1798 1961
1944 1952
208 204
1836 1872
882 806
239 234
141 136
49 49
1352 1363
915 883
1318 1259
72 70
937 886
1783 1843
1253 1319
1268 1375
1144 1234
878 818

107
knapsack/data/ks_106_0 Normal file
View File

@@ -0,0 +1,107 @@
106 106925262
45276 45276
90552 90552
181104 181104
362208 362208
724416 724416
1448832 1448832
2897664 2897664
5795328 5795328
11590656 11590656
23181312 23181312
46362624 46362624
92725248 92725248
70778 70778
141556 141556
283112 283112
566224 566224
1132448 1132448
2264896 2264896
4529792 4529792
9059584 9059584
18119168 18119168
36238336 36238336
72476672 72476672
86911 86911
173822 173822
347644 347644
695288 695288
1390576 1390576
2781152 2781152
5562304 5562304
11124608 11124608
22249216 22249216
44498432 44498432
88996864 88996864
92634 92634
185268 185268
370536 370536
741072 741072
1482144 1482144
2964288 2964288
5928576 5928576
11857152 11857152
23714304 23714304
47428608 47428608
94857216 94857216
97839 97839
195678 195678
391356 391356
782712 782712
1565424 1565424
3130848 3130848
6261696 6261696
12523392 12523392
25046784 25046784
50093568 50093568
100187136 100187136
125941 125941
251882 251882
503764 503764
1007528 1007528
2015056 2015056
4030112 4030112
8060224 8060224
16120448 16120448
32240896 32240896
64481792 64481792
134269 134269
268538 268538
537076 537076
1074152 1074152
2148304 2148304
4296608 4296608
8593216 8593216
17186432 17186432
34372864 34372864
68745728 68745728
141033 141033
282066 282066
564132 564132
1128264 1128264
2256528 2256528
4513056 4513056
9026112 9026112
18052224 18052224
36104448 36104448
72208896 72208896
147279 147279
294558 294558
589116 589116
1178232 1178232
2356464 2356464
4712928 4712928
9425856 9425856
18851712 18851712
37703424 37703424
75406848 75406848
153525 153525
307050 307050
614100 614100
1228200 1228200
2456400 2456400
4912800 4912800
9825600 9825600
19651200 19651200
39302400 39302400
78604800 78604800

20
knapsack/data/ks_19_0 Normal file
View File

@@ -0,0 +1,20 @@
19 31181
1945 4990
321 1142
2945 7390
4136 10372
1107 3114
1022 2744
1101 3102
2890 7280
962 2624
1060 3020
805 2310
689 2078
1513 3926
3878 9656
13504 32708
1865 4830
667 2034
1833 4766
16553 40006

201
knapsack/data/ks_200_0 Normal file
View File

@@ -0,0 +1,201 @@
200 100000
90001 90000
89751 89750
10002 10001
89501 89500
10254 10252
89251 89250
10506 10503
89001 89000
10758 10754
88751 88750
11010 11005
88501 88500
11262 11256
88251 88250
11514 11507
88001 88000
11766 11758
87751 87750
12018 12009
87501 87500
12270 12260
87251 87250
12522 12511
87001 87000
12774 12762
86751 86750
13026 13013
86501 86500
13278 13264
86251 86250
13530 13515
86001 86000
13782 13766
85751 85750
14034 14017
85501 85500
14286 14268
85251 85250
14538 14519
85001 85000
14790 14770
84751 84750
15042 15021
84501 84500
15294 15272
84251 84250
15546 15523
84001 84000
15798 15774
83751 83750
16050 16025
83501 83500
16302 16276
83251 83250
16554 16527
83001 83000
16806 16778
82751 82750
17058 17029
82501 82500
17310 17280
82251 82250
17562 17531
82001 82000
17814 17782
81751 81750
18066 18033
81501 81500
18318 18284
81251 81250
18570 18535
81001 81000
18822 18786
80751 80750
19074 19037
80501 80500
19326 19288
80251 80250
19578 19539
80001 80000
19830 19790
79751 79750
20082 20041
79501 79500
20334 20292
79251 79250
20586 20543
79001 79000
20838 20794
78751 78750
21090 21045
78501 78500
21342 21296
78251 78250
21594 21547
78001 78000
21846 21798
77751 77750
22098 22049
77501 77500
22350 22300
77251 77250
22602 22551
77001 77000
22854 22802
76751 76750
23106 23053
76501 76500
23358 23304
76251 76250
23610 23555
76001 76000
23862 23806
75751 75750
24114 24057
75501 75500
24366 24308
75251 75250
24618 24559
75001 75000
24870 24810
74751 74750
25122 25061
74501 74500
25374 25312
74251 74250
25626 25563
74001 74000
25878 25814
73751 73750
26130 26065
73501 73500
26382 26316
73251 73250
26634 26567
73001 73000
26886 26818
72751 72750
27138 27069
72501 72500
27390 27320
72251 72250
27642 27571
72001 72000
27894 27822
71751 71750
28146 28073
71501 71500
28398 28324
71251 71250
28650 28575
71001 71000
28902 28826
70751 70750
29154 29077
70501 70500
29406 29328
70251 70250
29658 29579
70001 70000
29910 29830
69751 69750
30162 30081
69501 69500
30414 30332
69251 69250
30666 30583
69001 69000
30918 30834
68751 68750
31170 31085
68501 68500
31422 31336
68251 68250
31674 31587
68001 68000
31926 31838
67751 67750
32178 32089
67501 67500
32430 32340
67251 67250
32682 32591
67001 67000
32934 32842
66751 66750
33186 33093
66501 66500
33438 33344
66251 66250
33690 33595
66001 66000
33942 33846
65751 65750
34194 34097
65501 65500
34446 34348
65251 65250
34698 34599
68451 68450

201
knapsack/data/ks_200_1 Normal file
View File

@@ -0,0 +1,201 @@
200 2640230
31860 76620
11884 28868
10492 25484
901 2502
43580 104660
9004 21908
6700 16500
29940 71980
7484 18268
5932 14564
7900 19300
6564 16028
6596 16092
8172 19844
5324 13148
8436 20572
7332 17964
6972 17044
7668 18636
6524 15948
6244 15388
635 1970
5396 13292
13596 32892
51188 122676
13684 33068
8596 20892
156840 375380
7900 19300
6460 15820
14132 34164
4980 12260
5216 12932
6276 15452
701 2102
3084 7868
6924 16948
5500 13500
3148 7996
47844 114788
226844 542788
25748 61996
7012 17124
3440 8580
15580 37660
314 1128
2852 7204
15500 37500
9348 22796
17768 42836
16396 39692
16540 39980
395124 944948
10196 24692
6652 16204
4848 11996
74372 178244
4556 11212
4900 12100
3508 8716
3820 9540
5460 13420
16564 40028
3896 9692
3832 9564
9012 21924
4428 10956
57796 138492
12052 29204
7052 17204
85864 205628
5068 12436
10484 25468
4516 11132
3620 9140
18052 43604
21 542
15804 38108
19020 45940
170844 408788
3732 9364
2920 7340
4120 10340
6828 16756
26252 63204
11676 28252
19916 47932
65488 156876
7172 17644
3772 9444
132868 318036
8332 20364
5308 13116
3780 9460
5208 12916
56788 136076
7172 17644
7868 19236
31412 75524
9252 22604
12276 29652
3712 9324
4516 11132
105876 253452
20084 48468
11492 27884
49092 117684
83452 199804
71372 171044
66572 159644
25268 60836
64292 154084
21228 51156
16812 40524
19260 46420
7740 18980
5632 13964
3256 8212
15580 37660
4824 11948
59700 143100
14500 35100
7208 17716
6028 14756
75716 181332
22364 53828
7636 18572
6444 15788
5192 12884
7388 18076
33156 79612
3032 7564
6628 16156
7036 17172
3200 8100
7300 17900
4452 11004
26364 63428
14036 33972
16932 40964
5788 14276
70476 168852
4552 11204
33980 81660
19300 46500
39628 95156
4484 11068
55044 131988
574 1848
29644 71188
9460 23020
106284 254468
304 1108
3580 8860
6308 15516
10492 25484
12820 31140
14436 34972
5044 12388
1155 3210
12468 30236
4380 10860
9876 24052
8752 21404
8676 21052
42848 102796
22844 54988
6244 15388
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
387480 926660
314 1128
314 1128
314 1128
314 1128
314 1128
15996 38692
8372 20444
65488 156876
304 1108
4756 11812
5012 12324
304 1108
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
304 1108
1208 3316
47728 114556
314 1128
314 1128
314 1128

301
knapsack/data/ks_300_0 Normal file
View File

@@ -0,0 +1,301 @@
300 4040184
31860 76620
11884 28868
10492 25484
901 2502
43580 104660
9004 21908
6700 16500
29940 71980
7484 18268
5932 14564
7900 19300
6564 16028
6596 16092
8172 19844
5324 13148
8436 20572
7332 17964
6972 17044
7668 18636
6524 15948
6244 15388
635 1970
5396 13292
13596 32892
51188 122676
13684 33068
8596 20892
156840 375380
7900 19300
6460 15820
14132 34164
4980 12260
5216 12932
6276 15452
701 2102
3084 7868
6924 16948
5500 13500
3148 7996
47844 114788
226844 542788
25748 61996
7012 17124
3440 8580
15580 37660
314 1128
2852 7204
15500 37500
9348 22796
17768 42836
16396 39692
16540 39980
395124 944948
10196 24692
6652 16204
4848 11996
74372 178244
4556 11212
4900 12100
3508 8716
3820 9540
5460 13420
16564 40028
3896 9692
3832 9564
9012 21924
4428 10956
57796 138492
12052 29204
7052 17204
85864 205628
5068 12436
10484 25468
4516 11132
3620 9140
18052 43604
21 542
15804 38108
19020 45940
170844 408788
3732 9364
2920 7340
4120 10340
6828 16756
26252 63204
11676 28252
19916 47932
65488 156876
7172 17644
3772 9444
132868 318036
8332 20364
5308 13116
3780 9460
5208 12916
56788 136076
7172 17644
7868 19236
31412 75524
9252 22604
12276 29652
3712 9324
4516 11132
105876 253452
20084 48468
11492 27884
49092 117684
83452 199804
71372 171044
66572 159644
25268 60836
64292 154084
21228 51156
16812 40524
19260 46420
7740 18980
5632 13964
3256 8212
15580 37660
4824 11948
59700 143100
14500 35100
7208 17716
6028 14756
75716 181332
22364 53828
7636 18572
6444 15788
5192 12884
7388 18076
33156 79612
3032 7564
6628 16156
7036 17172
3200 8100
7300 17900
4452 11004
26364 63428
14036 33972
16932 40964
5788 14276
70476 168852
4552 11204
33980 81660
19300 46500
39628 95156
4484 11068
55044 131988
574 1848
29644 71188
9460 23020
106284 254468
304 1108
3580 8860
6308 15516
10492 25484
12820 31140
14436 34972
5044 12388
1155 3210
12468 30236
4380 10860
9876 24052
8752 21404
8676 21052
42848 102796
22844 54988
6244 15388
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
387480 926660
314 1128
314 1128
314 1128
314 1128
314 1128
15996 38692
8372 20444
65488 156876
304 1108
4756 11812
5012 12324
304 1108
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
304 1108
1208 3316
47728 114556
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
104036 249172
5248 12996
312 1124
24468 58836
7716 18932
30180 72460
4824 11948
1120 3140
11496 27892
4916 12132
14428 34956
24948 59996
41100 98700
28692 69084
826 2352
3073 7846
7684 18868
5604 13708
17188 41476
34828 83756
7540 18380
8004 19508
2648 6796
5124 12748
3096 7892
166516 398532
13756 33212
9980 24260
15980 38660
9056 22012
5052 12404
8212 20124
11164 27028
13036 31572
23596 56892
2028 5156
7584 18468
5772 14244
4124 10348
5368 13236
4364 10828
5604 13708
8500 20700
7676 18652
8636 20972
4588 11276
4152 10404
4860 12020
5484 13468
8636 20972
5140 12780
236380 565460
116500 278900
36480 87660
16968 41036
5232 12964
13280 32060
138032 330364
9044 21988
22028 53156
4632 11564
13196 31892
65404 156708
28940 69580
865 2430
45988 110276
670 2040
4820 11940
41356 99212
39844 95588
897 2494
4028 9956
7924 19348
47756 114612
47036 112772
25908 62316
4516 11132
29460 70820
7964 19428
16964 41028
22196 53492
68140 163380
80924 193948
63700 152700
20860 50220
1682 4464
16804 40508
3195 8090
60348 144596
1901 4902
67468 161636
4772 11844
11196 27092
25836 62172
49676 119252
6188 15276
15588 37676

31
knapsack/data/ks_30_0 Normal file
View File

@@ -0,0 +1,31 @@
30 100000
90000 90001
89750 89751
10001 10002
89500 89501
10252 10254
89250 89251
10503 10506
89000 89001
10754 10758
88750 88751
11005 11010
88500 88501
11256 11262
88250 88251
11507 11514
88000 88001
11758 11766
87750 87751
12009 12018
87500 87501
12260 12270
87250 87251
12511 12522
87000 87001
12762 12774
86750 86751
13013 13026
86500 86501
13264 13278
86250 86251

401
knapsack/data/ks_400_0 Normal file
View File

@@ -0,0 +1,401 @@
400 9486367
31860 76620
11884 28868
10492 25484
901 2502
43580 104660
9004 21908
6700 16500
29940 71980
7484 18268
5932 14564
7900 19300
6564 16028
6596 16092
8172 19844
5324 13148
8436 20572
7332 17964
6972 17044
7668 18636
6524 15948
6244 15388
635 1970
5396 13292
13596 32892
51188 122676
13684 33068
8596 20892
156840 375380
7900 19300
6460 15820
14132 34164
4980 12260
5216 12932
6276 15452
701 2102
3084 7868
6924 16948
5500 13500
3148 7996
47844 114788
226844 542788
25748 61996
7012 17124
3440 8580
15580 37660
314 1128
2852 7204
15500 37500
9348 22796
17768 42836
16396 39692
16540 39980
395124 944948
10196 24692
6652 16204
4848 11996
74372 178244
4556 11212
4900 12100
3508 8716
3820 9540
5460 13420
16564 40028
3896 9692
3832 9564
9012 21924
4428 10956
57796 138492
12052 29204
7052 17204
85864 205628
5068 12436
10484 25468
4516 11132
3620 9140
18052 43604
21 542
15804 38108
19020 45940
170844 408788
3732 9364
2920 7340
4120 10340
6828 16756
26252 63204
11676 28252
19916 47932
65488 156876
7172 17644
3772 9444
132868 318036
8332 20364
5308 13116
3780 9460
5208 12916
56788 136076
7172 17644
7868 19236
31412 75524
9252 22604
12276 29652
3712 9324
4516 11132
105876 253452
20084 48468
11492 27884
49092 117684
83452 199804
71372 171044
66572 159644
25268 60836
64292 154084
21228 51156
16812 40524
19260 46420
7740 18980
5632 13964
3256 8212
15580 37660
4824 11948
59700 143100
14500 35100
7208 17716
6028 14756
75716 181332
22364 53828
7636 18572
6444 15788
5192 12884
7388 18076
33156 79612
3032 7564
6628 16156
7036 17172
3200 8100
7300 17900
4452 11004
26364 63428
14036 33972
16932 40964
5788 14276
70476 168852
4552 11204
33980 81660
19300 46500
39628 95156
4484 11068
55044 131988
574 1848
29644 71188
9460 23020
106284 254468
304 1108
3580 8860
6308 15516
10492 25484
12820 31140
14436 34972
5044 12388
1155 3210
12468 30236
4380 10860
9876 24052
8752 21404
8676 21052
42848 102796
22844 54988
6244 15388
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
387480 926660
314 1128
314 1128
314 1128
314 1128
314 1128
15996 38692
8372 20444
65488 156876
304 1108
4756 11812
5012 12324
304 1108
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
304 1108
1208 3316
47728 114556
314 1128
314 1128
314 1128
314 1128
314 1128
314 1128
104036 249172
5248 12996
312 1124
24468 58836
7716 18932
30180 72460
4824 11948
1120 3140
11496 27892
4916 12132
14428 34956
24948 59996
41100 98700
28692 69084
826 2352
3073 7846
7684 18868
5604 13708
17188 41476
34828 83756
7540 18380
8004 19508
2648 6796
5124 12748
3096 7892
166516 398532
13756 33212
9980 24260
15980 38660
9056 22012
5052 12404
8212 20124
11164 27028
13036 31572
23596 56892
2028 5156
7584 18468
5772 14244
4124 10348
5368 13236
4364 10828
5604 13708
8500 20700
7676 18652
8636 20972
4588 11276
4152 10404
4860 12020
5484 13468
8636 20972
5140 12780
236380 565460
116500 278900
36480 87660
16968 41036
5232 12964
13280 32060
138032 330364
9044 21988
22028 53156
4632 11564
13196 31892
65404 156708
28940 69580
865 2430
45988 110276
670 2040
4820 11940
41356 99212
39844 95588
897 2494
4028 9956
7924 19348
47756 114612
47036 112772
25908 62316
4516 11132
29460 70820
7964 19428
16964 41028
22196 53492
68140 163380
80924 193948
63700 152700
20860 50220
1682 4464
16804 40508
3195 8090
60348 144596
1901 4902
67468 161636
4772 11844
11196 27092
25836 62172
49676 119252
6188 15276
15588 37676
4412 10924
26564 63828
16412 39724
8108 19716
6084 14868
9884 24068
4224 10548
14660 35420
25708 61916
39228 94156
40748 97796
40748 97796
64276 154052
114356 273812
14724 35548
4540 11180
11612 28124
4972 12244
10060 24420
14548 35196
3136 7972
9132 22164
5752 14204
10100 24500
12172 29444
24428 58756
3336 8372
4356 10812
8652 21004
14492 35084
8796 21492
6408 15716
6056 14812
10124 24548
387480 926660
18188 43876
7732 18964
9492 23084
7300 17900
10052 24404
19604 47308
6644 16188
107364 257028
91812 219924
4620 11540
42848 102796
33268 79836
13260 32020
6564 16028
6524 15948
13596 32892
13596 32892
47844 114788
226844 542788
226844 542788
226844 542788
226844 542788
85864 205628
170844 408788
56788 136076
6628 16156
10492 25484
104036 249172
14428 34956
14428 34956
22028 53156
22028 53156
22028 53156
25836 62172
11612 28124
11612 28124
11612 28124
85872 205644
1377 3654
1365820 3265540
562272 1344644
1445900 3457100
501060 1198220
106224 254348
492496 1177692
387824 927548
151320 362140
109924 263148
105696 253092
96404 230908
107732 257964
42140 101180
102896 246292
4036 9972
19616 47332
100948 241796
1417728 3389756
62604 150108
491820 1176140
33740 80980
25216 60732
111716 267532
400156 957012
108800 260500
1211040 2895580

41
knapsack/data/ks_40_0 Normal file
View File

@@ -0,0 +1,41 @@
40 100000
90001 90000
89751 89750
10002 10001
89501 89500
10254 10252
89251 89250
10506 10503
89001 89000
10758 10754
88751 88750
11010 11005
88501 88500
11262 11256
88251 88250
11514 11507
88001 88000
11766 11758
87751 87750
12018 12009
87501 87500
12270 12260
87251 87250
12522 12511
87001 87000
12774 12762
86751 86750
13026 13013
86501 86500
13278 13264
86251 86250
13530 13515
86001 86000
13782 13766
85751 85750
14034 14017
85501 85500
14286 14268
85251 85250
14538 14519
86131 86130

46
knapsack/data/ks_45_0 Normal file
View File

@@ -0,0 +1,46 @@
45 58181
1945 4990
321 1142
2945 7390
4136 10372
1107 3114
1022 2744
1101 3102
2890 7280
47019 112738
1530 3960
3432 8564
2165 5630
1703 4506
1106 3112
370 1240
657 2014
962 2624
1060 3020
805 2310
689 2078
1513 3926
3878 9656
13504 32708
1865 4830
667 2034
1833 4766
16553 40006
1261 3422
2593 6686
1170 3240
794 2288
671 2042
7421 18142
6009 14718
1767 4634
2622 6744
831 2362
701 2102
5222 12944
3086 7872
900 2500
3121 7942
1029 2958
52555 126010
389 1278

5
knapsack/data/ks_4_0 Normal file
View File

@@ -0,0 +1,5 @@
4 11
8 4
10 5
15 8
4 3

501
knapsack/data/ks_500_0 Normal file
View File

@@ -0,0 +1,501 @@
500 50000
384 412
7060 7285
8475 8103
5028 4876
9741 9369
3360 3538
1426 1394
2084 2204
4865 5362
1885 1779
8191 8376
6296 6460
3292 3193
10227 9957
5744 5513
2163 2365
10738 9786
5099 4865
9193 9406
7777 7455
8538 8090
9597 9224
1275 1257
6317 5831
7598 7177
2241 2297
1398 1271
4083 4216
6033 5634
1694 1560
7563 6878
12 12
7406 6872
7679 7142
6619 6945
9222 8778
1869 1785
6809 7485
4961 5033
2616 2719
6406 6156
1703 1826
6415 6795
4898 4790
7601 7620
2145 1971
6559 6310
1691 1874
8734 8092
9570 9321
7649 7955
0 1
5652 5146
475 517
8789 8341
1366 1400
3325 3230
5487 5443
7316 7097
10232 9979
1788 1873
9179 9259
3790 3940
7820 8611
4462 4552
832 893
6798 7209
5467 5319
5573 6065
5489 5010
8246 8770
2815 2918
8766 8355
7043 7760
8834 8052
8549 8969
6511 6415
9253 9812
831 861
4587 4755
202 210
1022 950
867 823
1989 2194
2813 2594
1711 1642
9343 9828
1840 2029
2772 2575
6035 5564
8815 9345
9329 8485
354 353
3488 3792
2701 2645
102 102
3711 4046
10505 9897
8471 9201
3406 3157
10171 9442
6862 7425
3747 3887
7132 7137
7386 7590
3073 3179
7566 8244
2269 2467
7134 7291
7750 7078
8126 8991
1803 1824
8229 8894
9725 9514
1468 1498
844 771
2939 2868
7538 7210
380 406
10182 9845
176 188
8874 8977
5461 5808
7833 7831
9668 9122
3381 3255
8534 7808
10002 9684
8881 9703
3503 3884
2774 2742
6546 6754
3368 3227
2269 2521
3229 3149
6703 6895
9740 9718
1660 1779
4724 4906
10161 9765
2460 2712
1221 1161
893 956
3922 3736
3837 3854
4564 4211
6844 7195
7300 7204
550 509
3347 3315
8141 8090
7173 7121
1386 1366
2216 2053
4182 4310
6496 6753
7540 7923
6576 7072
745 774
10510 9710
5294 5494
6752 6259
3818 4235
6704 6462
212 222
6247 5995
7948 8543
2763 2688
5698 5186
2307 2186
7426 7303
5292 5134
9295 8645
2578 2430
6097 5571
2925 3243
1223 1123
8720 8978
4240 4139
4344 4244
6250 6864
6547 7189
4989 4641
732 753
4440 4445
7861 8726
147 147
3066 3394
5265 5044
6723 7050
7443 7655
6062 6387
3793 3529
6167 6689
1965 1918
1479 1530
7177 7624
3624 3782
6602 7203
9195 9398
8667 8091
4802 4637
3317 3035
10496 9631
2441 2467
8759 7973
320 325
3459 3770
4805 4396
6153 5990
5076 5513
6003 6084
2143 2027
2915 3169
6150 6074
5077 4948
3335 3361
8400 8116
9711 9158
1375 1467
6421 6150
8784 8277
3085 2946
247 228
6182 6208
7543 7284
2056 2048
1198 1190
4033 4380
2527 2603
4158 4618
2552 2607
668 609
7843 8591
3986 3670
8463 8184
6382 6242
3103 3422
397 385
10619 9845
8138 8106
8370 8192
4321 3974
4514 4964
4041 4063
6558 6871
397 438
1943 2122
319 305
8557 8465
10517 9695
7573 8139
9981 9433
8833 8354
5854 5944
3796 3761
2043 2109
7288 7949
7280 7744
2163 2065
2469 2264
5532 5066
2318 2387
7179 6779
8381 9284
5665 5694
3544 3303
3108 2872
3050 2801
7307 6760
528 536
8598 8444
1282 1404
1912 1919
6096 6018
2305 2211
3787 3723
7142 6631
950 965
7389 7413
2823 2941
2097 1979
7066 6576
3447 3779
2727 2493
7624 8353
764 776
4578 4617
2503 2653
7276 7099
6643 6991
2786 2972
2422 2349
6811 6498
5584 5951
10727 9755
3882 3987
9566 9211
4396 4126
8930 8192
831 849
4712 4675
657 602
2738 3006
6995 6708
5598 5844
8939 9020
6861 6674
9795 9952
2090 2208
4661 4726
3258 3155
6520 6999
3040 3298
7137 6758
8379 8963
7682 7553
5225 5634
5653 5459
6605 6957
8226 7939
7947 8831
6663 6956
9263 8743
8527 7914
110 116
486 526
916 863
6285 6030
8658 8005
9627 9516
777 752
5208 5569
7641 7249
2961 2726
255 252
6656 6447
10101 9887
124 133
8303 7584
7576 8318
2428 2643
4008 4090
2645 2517
756 717
3980 4407
2950 3236
9529 9690
3644 3814
260 276
7840 8345
4601 4493
7423 7117
1692 1817
6957 7465
2923 3073
1677 1792
1138 1088
5317 5247
9705 9127
840 838
1209 1309
2481 2369
7686 8119
6022 5554
8029 8016
5418 5101
646 613
9511 8848
2350 2335
2544 2444
6819 7518
1055 1044
7563 7599
4530 4369
2249 2154
2244 2095
2976 3034
6533 6184
1518 1625
2484 2603
6100 6072
6326 6297
7341 7384
8751 8748
7195 7352
2487 2548
6846 7003
1049 1102
3670 3525
2538 2691
5378 5906
1530 1403
8675 8179
5411 5421
308 342
8138 8884
3751 4000
5392 5535
8288 7690
3425 3797
6599 6118
1855 2050
8516 8028
5331 5379
8180 7989
708 746
1217 1315
5753 5983
2918 3035
8370 8675
9502 9840
10584 9793
6538 6077
3678 3780
5013 5327
8374 8415
2038 1965
6129 5741
6622 6292
7569 7366
942 963
1259 1194
4277 3984
1121 1021
6333 5974
8989 9647
9265 8860
8344 8231
3112 3138
3347 3355
1352 1450
9712 9502
2307 2209
5520 5095
10137 9833
4583 4634
4444 4676
6024 5990
2481 2671
9522 9498
9993 9209
5687 6004
420 414
5365 5480
834 836
4767 4745
2409 2497
1897 1847
8698 9047
4612 4405
3524 3486
1156 1173
6516 5996
7741 7139
8546 9331
2349 2219
6095 6103
835 872
724 666
5288 5114
5659 6134
2847 3042
9627 9511
189 189
1509 1378
3609 3963
3802 3926
134 139
5689 6206
9097 9077
6347 5951
3007 2835
4305 3972
3155 3228
4130 3764
3904 3631
1915 2109
9014 9897
8504 8943
651 708
8947 8695
6239 5900
8311 8054
1412 1422
6513 7166
8244 8159
8127 8361
5552 5782
4068 4325
1013 935
10274 9984
2977 3181
2751 2876
10479 9715
2260 2159
5603 5520
3074 3065
9406 9789
9416 9939

51
knapsack/data/ks_50_0 Normal file
View File

@@ -0,0 +1,51 @@
50 341045
1906 4912
41516 99732
23527 56554
559 1818
45136 108372
2625 6750
492 1484
1086 3072
5516 13532
4875 12050
7570 18440
4436 10972
620 1940
50897 122094
2129 5558
4265 10630
706 2112
2721 6942
16494 39888
29688 71276
3383 8466
2181 5662
96601 231302
1795 4690
7512 18324
1242 3384
2889 7278
2133 5566
103 706
4446 10992
11326 27552
3024 7548
217 934
13269 32038
281 1062
77174 184848
952 2604
15572 37644
566 1832
4103 10306
313 1126
14393 34886
1313 3526
348 1196
419 1338
246 992
445 1390
23552 56804
23552 56804
67 634

51
knapsack/data/ks_50_1 Normal file
View File

@@ -0,0 +1,51 @@
50 5000
995 945
259 242
258 244
279 281
576 582
126 119
280 303
859 913
270 279
389 408
927 925
281 305
624 662
961 938
757 718
231 250
838 767
154 158
649 595
277 268
180 167
895 957
23 22
930 948
93 102
61 62
626 604
342 349
262 279
215 221
183 203
958 889
205 213
859 835
171 166
566 575
779 758
704 706
196 182
26 28
726 729
621 671
800 864
580 579
535 553
647 632
168 163
90 95
679 745
440 438

61
knapsack/data/ks_60_0 Normal file
View File

@@ -0,0 +1,61 @@
60 100000
90000 90001
89750 89751
10001 10002
89500 89501
10252 10254
89250 89251
10503 10506
89000 89001
10754 10758
88750 88751
11005 11010
88500 88501
11256 11262
88250 88251
11507 11514
88000 88001
11758 11766
87750 87751
12009 12018
87500 87501
12260 12270
87250 87251
12511 12522
87000 87001
12762 12774
86750 86751
13013 13026
86500 86501
13264 13278
86250 86251
13515 13530
86000 86001
13766 13782
85750 85751
14017 14034
85500 85501
14268 14286
85250 85251
14519 14538
85000 85001
14770 14790
84750 84751
15021 15042
84500 84501
15272 15294
84250 84251
15523 15546
84000 84001
15774 15798
83750 83751
16025 16050
83500 83501
16276 16302
83250 83251
16527 16554
83000 83001
16778 16806
82750 82751
17029 17058
82500 82501

83
knapsack/data/ks_82_0 Normal file
View File

@@ -0,0 +1,83 @@
82 104723596
13211 13211
26422 26422
52844 52844
105688 105688
211376 211376
422752 422752
845504 845504
1691008 1691008
3382016 3382016
6764032 6764032
13528064 13528064
27056128 27056128
54112256 54112256
13212 13212
26424 26424
52848 52848
105696 105696
211392 211392
422784 422784
845568 845568
1691136 1691136
3382272 3382272
6764544 6764544
13529088 13529088
27058176 27058176
54116352 54116352
39638 39638
79276 79276
158552 158552
317104 317104
634208 634208
1268416 1268416
2536832 2536832
5073664 5073664
10147328 10147328
20294656 20294656
40589312 40589312
81178624 81178624
52844 52844
105688 105688
211376 211376
422752 422752
845504 845504
1691008 1691008
3382016 3382016
6764032 6764032
13528064 13528064
27056128 27056128
54112256 54112256
66060 66060
132120 132120
264240 264240
528480 528480
1056960 1056960
2113920 2113920
4227840 4227840
8455680 8455680
16911360 16911360
33822720 33822720
67645440 67645440
79268 79268
158536 158536
317072 317072
634144 634144
1268288 1268288
2536576 2536576
5073152 5073152
10146304 10146304
20292608 20292608
40585216 40585216
81170432 81170432
92482 92482
184964 184964
369928 369928
739856 739856
1479712 1479712
2959424 2959424
5918848 5918848
11837696 11837696
23675392 23675392
47350784 47350784
94701568 94701568

View File

@@ -0,0 +1,4 @@
3 9
5 4
6 5
3 2

View File

@@ -0,0 +1,6 @@
4 7
16 2
19 3
23 4
28 5

BIN
knapsack/handout.pdf Normal file

Binary file not shown.

51
knapsack/solver.py Executable file
View File

@@ -0,0 +1,51 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
from collections import namedtuple
Item = namedtuple("Item", ['index', 'value', 'weight'])
def solve_it(input_data):
# Modify this code to run your optimization algorithm
# parse the input
lines = input_data.split('\n')
firstLine = lines[0].split()
item_count = int(firstLine[0])
capacity = int(firstLine[1])
items = []
for i in range(1, item_count+1):
line = lines[i]
parts = line.split()
items.append(Item(i-1, int(parts[0]), int(parts[1])))
# a trivial greedy algorithm for filling the knapsack
# it takes items in-order until the knapsack is full
value = 0
weight = 0
taken = [0]*len(items)
for item in items:
if weight + item.weight <= capacity:
taken[item.index] = 1
value += item.value
weight += item.weight
# prepare the solution in the specified output format
output_data = str(value) + ' ' + str(0) + '\n'
output_data += ' '.join(map(str, taken))
return output_data
if __name__ == '__main__':
import sys
if len(sys.argv) > 1:
file_location = sys.argv[1].strip()
with open(file_location, 'r') as input_data_file:
input_data = input_data_file.read()
print(solve_it(input_data))
else:
print('This test requires an input file. Please select one from the data directory. (i.e. python solver.py ./data/ks_4_0)')

37
knapsack/solverJava.py Normal file
View File

@@ -0,0 +1,37 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
from subprocess import Popen, PIPE
def solve_it(input_data):
# Writes the inputData to a temporay file
tmp_file_name = 'tmp.data'
tmp_file = open(tmp_file_name, 'w')
tmp_file.write(input_data)
tmp_file.close()
# Runs the command: java Solver -file=tmp.data
process = Popen(['java', 'Solver', '-file=' + tmp_file_name], stdout=PIPE)
(stdout, stderr) = process.communicate()
# removes the temporay file
os.remove(tmp_file_name)
return stdout.strip()
import sys
if __name__ == '__main__':
if len(sys.argv) > 1:
file_location = sys.argv[1].strip()
with open(file_location, 'r') as input_data_file:
input_data = input_data_file.read()
print solve_it(input_data)
else:
print('This test requires an input file. Please select one from the data directory. (i.e. python solver.py ./data/ks_4_0)')

456
knapsack/submit.py Executable file
View File

@@ -0,0 +1,456 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import print_function
import json
import time
import os
from collections import namedtuple
# Python 2/3 compatibility
# Python 2:
try:
from urlparse import urlparse
from urllib import urlencode
from urllib2 import urlopen, Request, HTTPError
except:
pass
# Python 3:
try:
from urllib.parse import urlparse, urlencode
from urllib.request import urlopen, Request
from urllib.error import HTTPError
except:
pass
import sys
# Python 2:
if sys.version_info < (3, 0):
def input(str):
return raw_input(str)
# Python 3, backward compatibility with unicode test
if sys.version_info >= (3, 0):
unicode = type(str)
version = '1.0.0'
submitt_url = \
'https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1'
Metadata = namedtuple("Metadata", ['assignment_key', 'name', 'part_data'])
Part = namedtuple("Part", ['id', 'input_file', 'solver_file', 'name'])
def load_metadata(metadata_file_name='_coursera'):
'''
Parses an assignment metadata file
Args:
metadata_file_name (str): location of the metadata file
Returns:
metadata as a named tuple structure
'''
if not os.path.exists(metadata_file_name):
print('metadata file "%s" not found' % metadata_file_name)
quit()
try:
with open(metadata_file_name, 'r') as metadata_file:
url = metadata_file.readline().strip()
name = metadata_file.readline().strip()
part_data = []
for line in metadata_file.readlines():
if ',' in line:
line_parts = line.split(',')
line_parts = [x.strip() for x in line_parts]
assert(len(line_parts) == 4)
part_data.append(Part(*line_parts))
if len(url) <= 0:
print('Empty url in _coursera file: %s' % metadata_file_name)
quit()
if len(name) <= 0:
print('Empty assignment name in _coursera file: %s' % metadata_file_name)
quit()
except Exception as e:
print('problem parsing assignment metadata file')
print('exception message:')
print(e)
quit()
return Metadata(url, name, part_data)
def part_prompt(problems):
'''
Prompts the user for which parts of the assignment they would like to
submit.
Args:
problems: a list of assignment problems
Returns:
the selected subset of problems
'''
count = 1
print('Hello! These are the assignment parts that you can submit:')
for i, problem in enumerate(problems):
print(str(count) + ') ' + problem.name)
count += 1
print('0) All')
part_text = input('Please enter which part(s) you want to submit (0-%d): ' % (count-1))
selected_problems = []
selected_models = []
for item in part_text.split(','):
try:
i = int(item)
except:
print('Skipping input "' + item + '". It is not an integer.')
continue
if i >= count or i < 0:
print('Skipping input "' + item + '". It is out of the valid range (0-%d).' % (count-1))
continue
if i == 0:
selected_problems.extend(problems)
continue
if i <= len(problems):
selected_problems.append(problems[i-1])
if len(selected_problems) <= 0:
print('No valid assignment parts identified. Please try again. \n')
return part_prompt(problems)
else:
return selected_problems
def compute(metadata, solver_file_override=None):
'''
Determines which assignment parts the student would like to submit.
Then computes his/her answers to those assignment parts
Args:
metadata: the assignment metadata
solver_file_override: an optional model file to override the metadata
default
Returns:
a dictionary of results in the format Coursera expects
'''
if solver_file_override is not None:
print('Overriding solver file with: '+solver_file_override)
selected_problems = part_prompt(metadata.part_data)
results = {}
#submission needs empty dict for every assignment part
results.update({prob_data.id : {} for prob_data in metadata.part_data})
for problem in selected_problems:
if solver_file_override != None:
solver_file = solver_file_override
else:
solver_file = problem.solver_file
if not os.path.isfile(solver_file):
print('Unable to locate assignment file "%s" in the current working directory.' % solver_file)
continue
# if a relative path is given, add that patth to system path so import will work
if os.path.sep in solver_file:
split = solver_file.rfind(os.path.sep)
path = solver_file[0:split]
file_name = solver_file[split+1:]
sys.path.insert(0, path)
solver_file = file_name
submission = output(problem.input_file, solver_file)
if submission != None:
results[problem.id] = {'output':submission}
print('\n== Computations Complete ...')
return results
def load_input_data(file_location):
with open(file_location, 'r') as input_data_file:
input_data = ''.join(input_data_file.readlines())
return input_data
def output(input_file, solver_file):
'''
Attempts to execute solve_it locally on a given input file.
Args:
input_file: the assignment problem data of interest
solver_file: a python file containing the solve_it function
Returns:
the submission string in a format that the grader expects
'''
try:
pkg = __import__(solver_file[:-3]) # remove '.py' extension
if not hasattr(pkg, 'solve_it'):
print('the solve_it() function was not found in %s' % solver_file)
quit()
except ImportError:
print('import error with python file "%s".' % solver_file)
quit()
solution = ''
start = time.clock()
try:
solution = pkg.solve_it(load_input_data(input_file))
except Exception as e:
print('the solve_it(input_data) method from solver.py raised an exception')
print('try testing it with python ./solver.py before running this submission script')
print('exception message:')
print(str(e))
print('')
return 'Local Exception =('
end = time.clock()
if not (isinstance(solution, str) or isinstance(solution, unicode)):
print('Warning: the solver did not return a string. The given object will be converted with the str() method.')
solution = str(solution)
print('Submitting: ')
print(solution)
return solution.strip() + '\n' + str(end - start)
def login_dialog(assignment_key, results, credentials_file_location = '_credentials'):
'''
Requests Coursera login credentials from the student and submits the
student's solutions for grading
Args:
assignment_key: Coursera's assignment key
results: a dictionary of results in Cousera's format
credentials_file_location: a file location where login credentials can
be found
'''
success = False
tries = 0
while not success:
# stops infinate loop when credentials file is incorrect
if tries <= 0:
login, token = login_prompt(credentials_file_location)
else:
login, token = login_prompt('')
code, responce = submit_solution(assignment_key, login, token, results)
print('\n== Coursera Responce ...')
#print(code)
print(responce)
if code != 401:
success = True
else:
print('\ntry logging in again')
tries += 1
def login_prompt(credentials_file_location):
'''
Attempts to load credentials from a file, if that fails asks the user.
Returns:
the user's login and token
'''
if os.path.isfile(credentials_file_location):
try:
with open(credentials_file_location, 'r') as metadata_file:
login = metadata_file.readline().strip()
token = metadata_file.readline().strip()
metadata_file.close()
except:
login, token = basic_prompt()
else:
login, token = basic_prompt()
return login, token
def basic_prompt():
'''
Prompt the user for login credentials.
Returns:
the user's login and token
'''
login = input('User Name (e-mail address): ')
token = input('Submission Token (from the assignment page): ')
return login, token
def submit_solution(assignment_key, email_address, token, results):
'''
Sends the student's submission to Coursera for grading via the submission
API.
Args:
assignment_key: Coursera's assignment key
email_address: the student's email
token: the student's assignment token
results: a dictionary of results in Cousera's format
Returns:
the https response code and a feedback message
'''
print('\n== Connecting to Coursera ...')
print('Submitting %d of %d parts' %
(sum(['output' in v for k,v in results.items()]), len(results)))
# build json datastructure
parts = {}
submission = {
'assignmentKey': assignment_key,
'submitterEmail': email_address,
'secret': token,
'parts': results
}
# send submission
req = Request(submitt_url)
req.add_header('Cache-Control', 'no-cache')
req.add_header('Content-type', 'application/json')
try:
res = urlopen(req, json.dumps(submission).encode('utf8'))
except HTTPError as e:
responce = json.loads(e.read().decode('utf8'))
if 'details' in responce and responce['details'] != None and \
'learnerMessage' in responce['details']:
return e.code, responce['details']['learnerMessage']
else:
return e.code, 'Unexpected response code, please contact the ' \
'course staff.\nDetails: ' + responce['message']
code = res.code
responce = json.loads(res.read().decode('utf8'))
if code >= 200 and code <= 299:
return code, 'Your submission has been accepted and will be ' \
'graded shortly.'
return code, 'Unexpected response code, please contact the '\
'course staff.\nDetails: ' + responce
def main(args):
'''
1) Reads a metadata file to customize the submission process to
a particular assignment.
2) The compute the student's answers to the assignment parts.
3) Submits the student's answers for grading.
Provides the an option for saving the submissions locally. This is very
helpful when testing the assignment graders.
Args:
args: CLI arguments from an argparse parser
'''
# needed so that output can import from the cwd
sys.path.append(os.getcwd())
if args.metadata is None:
metadata = load_metadata()
else:
print('Overriding metadata file with: '+args.metadata)
metadata = load_metadata(args.metadata)
print('==\n== '+metadata.name+' Solution Submission \n==')
# compute dialog
results = compute(metadata, args.override)
if sum(['output' in v for k,v in results.items()]) <= 0:
return
# store submissions if requested
if args.record_submission == True:
print('Recording submission as files')
for sid, submission in results.items():
if 'output' in submission:
directory = '_'+sid
if not os.path.exists(directory):
os.makedirs(directory)
submission_file_name = directory+'/submission.sub'
print(' writting submission file: '+submission_file_name)
with open(submission_file_name,'w') as submission_file:
submission_file.write(submission['output'])
submission_file.close()
return
# submit dialog
if args.credentials is None:
login_dialog(metadata.assignment_key, results)
else:
print('Overriding credentials file with: '+args.credentials)
login_dialog(metadata.assignment_key, results, args.credentials)
import argparse
def build_parser():
'''
Builds an argument parser for the CLI
Returns:
parser: an argparse parser
'''
parser = argparse.ArgumentParser(
description='''The submission script for Discrete Optimization
assignments on the Coursera Platform.''',
epilog='''Please file bugs on github at:
https://github.com/discreteoptimization/assignment/issues. If you
would like to contribute to this tool's development, check it out at:
https://github.com/discreteoptimization/assignment'''
)
parser.add_argument('-v', '--version', action='version',
version='%(prog)s '+version)
parser.add_argument('-o', '--override',
help='overrides the python source file specified in the \'_coursera\' file')
parser.add_argument('-m', '--metadata',
help='overrides the \'_coursera\' metadata file')
parser.add_argument('-c', '--credentials',
help='overrides the \'_credentials\' credentials file')
parser.add_argument('-rs', '--record_submission',
help='records the submission(s) as files', action='store_true')
return parser
if __name__ == '__main__':
parser = build_parser()
main(parser.parse_args())