blob: 6fb60c96ec48b5d76251cc118276bf5d9bce6abe [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.examples.ml.genetic.movie;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.ignite.Ignite;
import org.apache.ignite.Ignition;
import org.apache.ignite.ml.genetic.Chromosome;
import org.apache.ignite.ml.genetic.GAGrid;
import org.apache.ignite.ml.genetic.Gene;
import org.apache.ignite.ml.genetic.parameter.GAConfiguration;
import org.apache.ignite.ml.genetic.parameter.GAGridConstants;
/**
* In this example, we utilize {@link GAGrid} framework to calculate an optimal set of movies based on our interests in
* various genres (ie: Action, Comedy, and Romance).
* <p>
* Code in this example launches Ignite grid, prepares simple test data (gene pool) and configures GA grid.</p>
* <p>
* After that it launches the process of evolution on GA grid and outputs the progress and results.</p>
* <p>
* You can change the test data and parameters of GA grid used in this example and re-run it to explore this
* functionality further.</p>
* <p>
* How to run from command line:</p>
* <p>
* {@code mvn exec:java -Dexec.mainClass="org.apache.ignite.examples.ml.genetic.movie.MovieGAExample"
* -DGENRES=Action,Comedy}</p>
* <p>
* Remote nodes should always be started with special configuration file which enables P2P class loading: {@code
* 'ignite.{sh|bat} examples/config/example-ignite.xml'}.</p>
* <p>
* Alternatively you can run ExampleNodeStartup in another JVM which will start node with {@code
* examples/config/example-ignite.xml} configuration.</p>
*/
public class MovieGAExample {
/**
* Executes example.
* <p>
* Specify value for {@code -DGENRES} JVM system variable.
*
* @param args Command line arguments, none required.
*/
public static void main(String args[]) {
System.out.println(">>> Movie GA grid example started.");
List<String> genres = new ArrayList<>();
String sGenres = "Action,Comedy,Romance";
StringBuffer sbErrorMsg = new StringBuffer();
sbErrorMsg.append("GENRES System property not set. Please provide GENRES information.");
sbErrorMsg.append(" ");
sbErrorMsg.append("IE: -DGENRES=Action,Comedy,Romance");
sbErrorMsg.append("\n");
sbErrorMsg.append("Using default value: Action,Comedy,Romance");
if (System.getProperty("GENRES") == null)
System.out.println(sbErrorMsg);
else
sGenres = System.getProperty("GENRES");
StringTokenizer st = new StringTokenizer(sGenres, ",");
while (st.hasMoreElements()) {
String genre = st.nextToken();
genres.add(genre);
}
// Create GAConfiguration.
GAConfiguration gaCfg = new GAConfiguration();
// Set Gene Pool.
List<Gene> genes = getGenePool();
// Define Chromosome.
gaCfg.setChromosomeLen(3);
gaCfg.setPopulationSize(100);
gaCfg.setGenePool(genes);
gaCfg.setTruncateRate(.10);
gaCfg.setCrossOverRate(.50);
gaCfg.setMutationRate(.50);
gaCfg.setSelectionMtd(GAGridConstants.SELECTION_METHOD.SELECTION_METHOD_TRUNCATION);
// Create fitness function.
MovieFitnessFunction function = new MovieFitnessFunction(genres);
// Set fitness function.
gaCfg.setFitnessFunction(function);
try {
// Create an Ignite instance as you would in any other use case.
Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
MovieTerminateCriteria termCriteria = new MovieTerminateCriteria(ignite, System.out::println);
gaCfg.setTerminateCriteria(termCriteria);
GAGrid gaGrid = new GAGrid(gaCfg, ignite);
Chromosome chromosome = gaGrid.evolve();
System.out.println(">>> Evolution result: " + chromosome);
Ignition.stop(true);
System.out.println(">>> Movie GA grid example completed.");
}
catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
/**
*
*/
private static List<Gene> getGenePool() {
List<Gene> list = new ArrayList<>();
Movie movie1 = new Movie();
movie1.setName("The Matrix");
movie1.setImdbRating(7);
List<String> genre1 = new ArrayList<>();
genre1.add("SciFi");
genre1.add("Action");
movie1.setGenre(genre1);
movie1.setRating("PG-13");
movie1.setYear("1999");
Gene gene1 = new Gene(movie1);
Movie movie2 = new Movie();
movie2.setName("The Dark Knight");
movie2.setImdbRating(9.6);
List<String> genre2 = new ArrayList<>();
genre2.add("Action");
movie2.setGenre(genre2);
movie2.setRating("PG-13");
movie2.setYear("2008");
Gene gene2 = new Gene(movie2);
Movie movie3 = new Movie();
movie3.setName("The Avengers");
movie3.setImdbRating(9.6);
movie3.setYear("2012");
List<String> genre3 = new ArrayList<>();
genre3.add("Action");
movie3.setGenre(genre3);
movie3.setRating("PG-13");
Gene gene3 = new Gene(movie3);
Movie movie4 = new Movie();
movie4.setName("The Hangover");
movie4.setImdbRating(7.6);
List<String> genre4 = new ArrayList<>();
genre4.add("Comedy");
movie4.setGenre(genre4);
movie4.setRating("R");
movie4.setYear("2009");
Gene gene4 = new Gene(movie4);
Movie movie5 = new Movie();
movie5.setName("The Hangover 2");
movie5.setImdbRating(9.6);
List<String> genre5 = new ArrayList<>();
genre5.add("Comedy");
movie5.setGenre(genre5);
movie5.setRating("R");
movie5.setYear("2012");
Gene gene5 = new Gene(movie5);
Movie movie6 = new Movie();
movie6.setName("This Means War");
movie6.setImdbRating(6.4);
List<String> genre6 = new ArrayList<>();
genre6.add("Comedy");
genre6.add("Action");
genre6.add("Romance");
movie6.setGenre(genre6);
movie6.setRating("PG-13");
movie6.setYear("2012");
Gene gene6 = new Gene(movie6);
Movie movie7 = new Movie();
movie7.setName("Hitch");
movie7.setImdbRating(10);
List<String> genre7 = new ArrayList<>();
genre7.add("Comedy");
genre7.add("Romance");
movie7.setGenre(genre7);
movie7.setRating("PG-13");
movie7.setYear("2005");
Gene gene7 = new Gene(movie7);
Movie movie8 = new Movie();
movie8.setName("21 Jump Street");
movie8.setImdbRating(6.7);
List<String> genre8 = new ArrayList<>();
genre8.add("Comedy");
genre8.add("Action");
movie8.setGenre(genre8);
movie8.setRating("R");
movie8.setYear("2012");
Gene gene8 = new Gene(movie8);
Movie movie9 = new Movie();
movie9.setName("Killers");
movie9.setImdbRating(5.1);
List<String> genre9 = new ArrayList<>();
genre9.add("Comedy");
genre9.add("Action");
genre9.add("Romance");
movie9.setGenre(genre9);
movie9.setRating("PG-13");
movie9.setYear("2010");
Gene gene9 = new Gene(movie9);
Movie movie10 = new Movie();
movie10.setName("What to Expect When You're Expecting");
movie10.setImdbRating(5.1);
List<String> genre10 = new ArrayList<>();
genre10.add("Comedy");
genre10.add("Romance");
movie10.setGenre(genre10);
movie10.setRating("PG-13");
movie10.setYear("2012");
Gene gene10 = new Gene(movie10);
list.add(gene1);
list.add(gene2);
list.add(gene3);
list.add(gene4);
list.add(gene5);
list.add(gene6);
list.add(gene7);
list.add(gene8);
list.add(gene9);
list.add(gene10);
return list;
}
}