| /* |
| * 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; |
| } |
| } |