From here on in, each week's work will include two separate components,
programming, worth half the credit, and questions, worth the other half.
Since we are only giving credit for the top 10 scores, each week's work
will be worth 10 points, 5 for questions, 5 for programming.
Simple multiple choice questions, 1 point each:
- In the road network model, the roads and intersections can be modeled by
a) a lattice
b) a tree
c) a DAG (directed acyclic graph)
d) a directed graph
e) an undirected grap
- In the epidemic model we
could assign people to households several ways. Which of these allows us
tight control of the household size according to a pre-determined distribution
while creating exactly the specified population:
a) Set the number h of households to the population divided by the
average household size, then create people, assigning each to a
randomly selected household.
b) Repeatedly pick a random household size from the size distribution
and assign that many of the remaining people to it until all the
people are used up.
c) Repeatedly pick a random household size from the size distribution
and create that many people for that household until the number of
created people matches or exceeds the specified population.
could assignin students to schools using the same
algorithm we use for:
a) determining how many students are in each household.
b) connecting roads to intersections in the road network model.
c) assigning people to households.
d) assigning shoppers to stores.
e) determining the workplace size distribution.
- Code in a Java static method can only access their own local
variables, their own parameters, and ...
a) instance variables of their class.
b) private variables of their class.
c) nothing else.
d) final variables of their class.
e) static variables of their class.
- Java class scanner allows a program to
a) scan a stream for misspellings.
b) pick consecutive words, numbers or other tokens from a stream.
c) scan a stream and make arbitrary text substitutions.
d) convert the text of a stream to canonical form.
e) remove tabs, spaces, newlines and other delimiters from a stream.
Machine Problem 1 -- due Monday, Sept 14
Tuesday, Sept 15.
Write version one of the epidemic model. This should accept input from
a text file named by the first command line parameter, where the file has
the form:
All it should do is read the numbers (using a scanner) and create the
required number of people (25 for the example input above), then assign
them to households so that the household size is uniformly distributed
over the range given by the average and variation (3 plus or minus 1 for
the example above).
Then, print out the entire collection of people, listing, for each person,
their name and the household to which they belong, one line per
person. A typical line for one person might look like this
person@896001 place@321045
And, print out the entire database of households, listing the name of the
household and the names of the people that belong to it, one line per
household. A typical line for one place might look like this
place@321045 person@896001 person@301579
The only rule for names is that the name should be textual and it
should identify whether it is a person or place name. Every Java
class has a default toString method that meets this requirement,
although the strings it produces are ugly.
Submission
Your code must be in a single source file named Epidemic.java
the CLAS Linux system.
This implies that the main method is in a class called Epidemic.
To submit your solution, use the following Linux shell command:
~dwjones/submit SECTION Epidemic.java
Where SECTION is the section number you are registered in, which must
be one of 0A01, 0A02, 0A11 or 0A12.
Grading Criteria
- 1 point for code that compiles with no errors
- 1 point for code that accepts our test data and produces sensible output
If it compiles and runs on our test files, we will look at the source code.
- 1 point for appropriate use of classes
- 1 point for appropriate indenting and other issues of code format
- 1 point for appropriate use of comments
Questions and Answers
A student asked:
How do we organize our solutions, as just one source file
or multiple files?
One file, named Epidemic.java, with
public class Epidemic as its main method. That class should
contain a public static void main method plus any private
methods needed by the main method. Other classes go up front in the same
file, as demonstrated in the code discussed in lecture.
A student asked:
Do we use class home or class place for the
single class that will later be subdivided into subclasses for different kinds
of place? Or should we use both?
Any of the above can work, but plan on eventually using both. You either pay
the price up front or pay the price by having to edit code later.
A student asked: I'm having trouble figuring out how to read the input.
I advised that students try playing with scanners in little tiny programs.
So I demonstrated such a playful exploration of how to read a file containing
the specified data, where the name of the data file is given as a command-line
argument.
import java.util.Scanner;
import java.io.File;
public class Fool {
public static void main(String[] args) {
try {
final Scanner in = new Scanner( new File( args[0] ) );
in.next( "pop" );
int pop = in.nextInt();
in.next( ";" );
in.next( "house" );
int house = in.nextInt();
in.next( "," );
int var = in.nextInt();
in.next( ";" );
System.out.println( "pop = "+pop+" house = "+house+"+/-"+var );
} catch ( Exception e ) {
System.out.println( "oops: "+e );
}
}
}
This code is awful. It fails with an ugly exception message and
gives no helpful feedback about errors. If the real input gave the right bits
in the wrong order, or if someone left out a comma or semicolon, they'd get
no help. In the long run, you want your code to be more forgiving.
It would be nice if it didn't bomb on missing punctuation, and it would be
nice if it allowed the keywords in any order. Perhaps there could be default
values for the numbers a person forgets to specify?
A student asked: Is it OK to interactively prompt for input? That is,
the program outputs: "Enter population size" and the user types that, etc.?
No. All the discussion in lecture has pointed in one direction: The
command line argument, as in the above code, gives a file name holding the
name of the file describing the population. This way, you could have a file
describing Upper South Amana (population very small), another file
describing Lone Tree (bigger) and yet another describing North Liberty
(even bigger). Once you get things working, you don't want to retype
everything for each run, and when we test your code, we certainly don't want
to retype all the input for each student's code.
A student asked:
How do we run the program with the expected file? And does it matter what we
call the test file.
Suppose you create a file called
testfile containing the test data
suggested in the assignment. Assuming you use
Epidemic.java as the
name of your source file (you have no choice about this),
you'd compile your source file with this shell commad:
javac Epidemic.java
And, assuming it compiles with no errors, you'd run it with this:
java Epidemic testfile
And it doesn't matter what you call your test file, and you have no reason
to know what we call our test files, because the file name is a parameter to
your main program. This means you can have as many different test files as
you want.
A student asked:
I am having difficulty understanding what it means to assign people to homes.
Look at the road network example, where we have intersections and roads.
Each road is assigned exactly one source intersection, so there is an
instance variable (non-static member) of class road that is a pointer to
(or a handle for) an intersection. Each road may have many outgoing
intersections, so each road has a collection (a linked list in my code) of
outgoing roads. The assignment of people to households can be represented
identically, with a link from every person to their home and a collection of
people in every home identifying members of the household.
A student asked:
How do you create a specific number of Person objects
Nothing I’ve looked up shows that dynamically creating a variable
amount of objects is possible (even wise) in Java.
In our road network model, the buldmodel method reads the input file
and creates one intersection object for every line that begins
intersection.
That is an example of creating a variable number of objects.
In the epidemic model, the input file just gives a number of people, but your
buldmodel method can use this in a for loop to manufacture that many
person objects.
A student asked:
What about at the end of assigning people to households, when you throw the
final random number and it says create a household of 3 people but there is
only one person left. Where do you put that person? Add them to an existing
but underpopulated household? Create an under-populated household?
This is a genuinely interesting question because, in a strict sense, the two
solutions suggested above each violate the statistical constraints. Suppose
the household size is supposed to be from 2 to 6, with an average of 4.
Creating a one-person household violates this rule and slightly lowers the
expected average household size. Throwing that person into some
already-existing household slightly raises the expected household size.
In a formal sense, they are different enough that they would not be considered
equivalent programs.
For our purposes, though, this kind of underspecification is very typical of
real-world problems. If you model a large population, nobody will noticd the
difference between the two suggested solutions. Either one will work, so the
obvious answer is, do whichever is easier.