You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
contains Producer, Consumer, Distributor and abstract class Entity,
which has the common fields of both consumers and distributors
(id, budget, isBankrupt)
both Consumer and Distributor classes extend Entity
the package contains a singleton entities factory that creates
consumers or distributors
Consumer implements Comparable interface, to allow for easy sorting
after specified criteria(first after remaining contract months, and then by id)
Distributor implements Observer interface, to receive updates concerning
the need to change its producers
Producer extends Observable and notifies its Distributors every time
a change in production prices happen (this is done using the warnDistributors
method)
Distributor has the following specific functions:
profit () -> used to calculate the wanted profit
contractPrice() -> used to compute the price of the contract
monthlyExpenses() -> calculates the expenses of the distributor
Distributors also have a list of their contract prices history for every
month of the game simulation
Producers hold their monthly stats about distributors in a map
ioutils:
contains InputReader and Output classes
those classes contain specific methods for reading and writing data
to files
!Used the @supresswarnings("unchecked") because the org.json.simple
library uses raw HashMap types!
utilities:
contains Constants class, which has strings to be used while reading
and writing data to files
contains the Utilities class, a class whose methods are used to solve
the simulations
this class contains methods for:
assigning each distributor producers
calculating distributor contract prices
checking if there are valid distributors
finding the cheapest non-bankrupt distributor
assign non-Bankrupt consumers with no contract to cheapest distributor
counting the remaining contracts of the distributors
paying the consumers (giving them their monthly income)
making distributors pay their monthly expenses
paying the distributors(consumers paying their contracts)
removing bankrupt consumers from the distributor's list
resetting the relations between distributors and producers
creating the monthly distributor stats of a producer
creating a list of distributor contract prices history
finding a producer by its id
strategies:
contains the interface EnergyStrategy, which has a method for sorting
a list of producers
GreenStrategy class implements EnergyStrategy and sorts producers based on
whether they use renewable energy sources, then by price and then by quantity of
energy they can give
PriceStrategy class implements EnergyStrategy and sorts producers based on price
and then by quantity of energy they can give
QuantityStrategy class implements EnergyStrategy and sorts producers based on
quantity of energy they can give
If the type of energy and the price are equal, producers will be sorted by
their id number
The Main class and the logic behind the entire program:
I read the initial data from the files, using my inputReader
If the number of the simulation is greater than 0, I update consumers,
distributors and producer data
I calculate the contract prices and choose the cheapest distributor
I assign consumers with no contract to the cheapest distributor and then reset
the number of consumers of every distributor
I pay my consumers, then they pay their distributors and then the distributors
pay their monthly expenses
I reset the relations between observers and observables (producer - distributor)
I assign distributors to their producers, if needed
I calculate the production cost again
Before a new round, I remove the Bankrupt consumers from the distributors' list:
I create a map that shows me all the producers' distributors in a specific month
I create a map that contains the contract prices of every distributor for every month