| /* |
| * 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.knapsack; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.concurrent.atomic.AtomicInteger; |
| 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; |
| |
| /** |
| * This example demonstrates how to use the {@link GAGrid} framework. It shows working with Knapsack Problem: Given a |
| * set of 30 items, each with a weight and a value, pack 10 items in knapsack so that the total weight is less or equal |
| * 20 lbs, and the total value is maximized. |
| * <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.knapsack.KnapsackGAExample"}</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 KnapsackGAExample { |
| /** |
| * @param args Command line arguments, none required. |
| */ |
| public static void main(String args[]) { |
| System.out.println(">>> Knapsack GA grid example started."); |
| |
| try { |
| // Create an Ignite instance as you would in any other use case. |
| Ignite ignite = Ignition.start("examples/config/example-ignite.xml"); |
| |
| // Create GAConfiguration. |
| GAConfiguration gaCfg = new GAConfiguration(); |
| |
| // Set Gene Pool. |
| List<Gene> genes = getGenePool(); |
| |
| // Set the Chromosome Length to '10' since our knapsack may contain a total of 10 items. |
| gaCfg.setChromosomeLen(10); |
| |
| // Initialize gene pool. |
| gaCfg.setGenePool(genes); |
| |
| // Create and set Fitness function. |
| KnapsackFitnessFunction function = new KnapsackFitnessFunction(); |
| gaCfg.setFitnessFunction(function); |
| |
| // Create and set TerminateCriteria. |
| AtomicInteger cnt = new AtomicInteger(0); |
| KnapsackTerminateCriteria termCriteria = new KnapsackTerminateCriteria(ignite, |
| msg -> { |
| if (cnt.getAndIncrement() % 10 == 0) |
| System.out.println(msg); |
| }); |
| gaCfg.setTerminateCriteria(termCriteria); |
| |
| GAGrid gaGrid = new GAGrid(gaCfg, ignite); |
| |
| // Evolve the population. |
| Chromosome chromosome = gaGrid.evolve(); |
| |
| System.out.println(">>> Evolution result: " + chromosome); |
| |
| Ignition.stop(true); |
| |
| System.out.println(">>> Knapsack GA grid example completed."); |
| } |
| catch (Exception e) { |
| System.out.println(e.getMessage()); |
| e.printStackTrace(); |
| } |
| } |
| |
| /** |
| * Helper routine to initialize Gene pool. |
| * <p> |
| * In typical use case genes may be stored in database. |
| * |
| * @return List of Gene objects. |
| */ |
| private static List<Gene> getGenePool() { |
| List<Gene> list = new ArrayList<>(); |
| |
| Item item1 = new Item(); |
| item1.setName("Swiss Army Knife"); |
| item1.setWeight(0.08125); |
| item1.setVal(15); |
| Gene gene1 = new Gene(item1); |
| |
| Item item2 = new Item(); |
| item2.setName("Duct Tape"); |
| item2.setWeight(1.3); |
| item2.setVal(3); |
| Gene gene2 = new Gene(item2); |
| |
| Item item3 = new Item(); |
| item3.setName("Rope (50 feet)"); |
| item3.setWeight(7); |
| item3.setVal(10); |
| Gene gene3 = new Gene(item3); |
| |
| Item item4 = new Item(); |
| item4.setName("Satellite phone"); |
| item4.setWeight(2); |
| item4.setVal(8); |
| Gene gene4 = new Gene(item4); |
| |
| Item item5 = new Item(); |
| item5.setName("Elmer's Glue"); |
| item5.setWeight(0.25); |
| item5.setVal(2); |
| Gene gene5 = new Gene(item5); |
| |
| Item item6 = new Item(); |
| item6.setName("Toilet Paper Roll"); |
| item6.setWeight(.5); |
| item6.setVal(4); |
| Gene gene6 = new Gene(item6); |
| |
| Item item7 = new Item(); |
| item7.setName("Binoculars"); |
| item7.setWeight(3); |
| item7.setVal(5); |
| Gene gene7 = new Gene(item7); |
| |
| Item item8 = new Item(); |
| item8.setName("Compass"); |
| item8.setWeight(0.0573202); |
| item8.setVal(15); |
| Gene gene8 = new Gene(item8); |
| |
| Item item9 = new Item(); |
| item9.setName("Jug (pre-filled with water)"); |
| item9.setWeight(4); |
| item9.setVal(6); |
| Gene gene9 = new Gene(item9); |
| |
| Item item10 = new Item(); |
| item10.setName("Flashlight"); |
| item10.setWeight(2); |
| item10.setVal(4); |
| Gene gene10 = new Gene(item10); |
| |
| Item item11 = new Item(); |
| item11.setName("Box of paper clips"); |
| item11.setWeight(.9); |
| item11.setVal(2); |
| Gene gene11 = new Gene(item11); |
| |
| Item item12 = new Item(); |
| item12.setName("Gloves (1 pair)"); |
| item12.setWeight(.8125); |
| item12.setVal(3); |
| Gene gene12 = new Gene(item12); |
| |
| Item item13 = new Item(); |
| item13.setName("Scissors"); |
| item13.setWeight(0.2); |
| item13.setVal(2); |
| Gene gene13 = new Gene(item13); |
| |
| Item item14 = new Item(); |
| item14.setName("Signal Flair (4pk)"); |
| item14.setWeight(4); |
| item14.setVal(5); |
| Gene gene14 = new Gene(item14); |
| |
| Item item15 = new Item(); |
| item15.setName("Water Purifying System"); |
| item15.setWeight(0.5125); |
| item15.setVal(4); |
| Gene gene15 = new Gene(item15); |
| |
| Item item16 = new Item(); |
| item16.setName("Whistle"); |
| item16.setWeight(0.075); |
| item16.setVal(2); |
| Gene gene16 = new Gene(item16); |
| |
| Item item17 = new Item(); |
| item17.setName("Sleeping Bag"); |
| item17.setWeight(0.38125); |
| item17.setVal(4); |
| Gene gene17 = new Gene(item17); |
| |
| Item item18 = new Item(); |
| item18.setName("Insect Repellent"); |
| item18.setWeight(1.15); |
| item18.setVal(3); |
| Gene gene18 = new Gene(item18); |
| |
| Item item19 = new Item(); |
| item19.setName("Trowel"); |
| item19.setWeight(0.31875); |
| item19.setVal(3); |
| Gene gene19 = new Gene(item19); |
| |
| Item item20 = new Item(); |
| item20.setName("Lighter"); |
| item20.setWeight(.2); |
| item20.setVal(4); |
| Gene gene20 = new Gene(item20); |
| |
| Item item21 = new Item(); |
| item21.setName("Safety Horn"); |
| item21.setWeight(.21); |
| item21.setVal(3); |
| Gene gene21 = new Gene(item21); |
| |
| Item item22 = new Item(); |
| item22.setName("Headlamp"); |
| item22.setWeight(.8); |
| item22.setVal(4); |
| Gene gene22 = new Gene(item22); |
| |
| Item item23 = new Item(); |
| item23.setName("Freeze Dried Food Kit"); |
| item23.setWeight(2); |
| item23.setVal(6); |
| Gene gene23 = new Gene(item23); |
| |
| Item item24 = new Item(); |
| item24.setName("Sunscreen"); |
| item24.setWeight(.5); |
| item24.setVal(4); |
| Gene gene24 = new Gene(item24); |
| |
| Item item25 = new Item(); |
| item25.setName("Trekking Pole (Adjustable)"); |
| item25.setWeight(1.3); |
| item25.setVal(4); |
| Gene gene25 = new Gene(item25); |
| |
| Item item26 = new Item(); |
| item26.setName("Counter Assault Bear Spray"); |
| item26.setWeight(.5); |
| item26.setVal(4); |
| Gene gene26 = new Gene(item26); |
| |
| Item item27 = new Item(); |
| item27.setName("Insect Spray"); |
| item27.setWeight(.5); |
| item27.setVal(3); |
| Gene gene27 = new Gene(item27); |
| |
| Item item28 = new Item(); |
| item28.setName("Hand sanitizer"); |
| item28.setWeight(.625); |
| item28.setVal(3); |
| Gene gene28 = new Gene(item28); |
| |
| Item item29 = new Item(); |
| item29.setName("Mirror"); |
| item29.setWeight(.5); |
| item29.setVal(3); |
| Gene gene29 = new Gene(item29); |
| |
| Item item30 = new Item(); |
| item30.setName("First Aid Kit"); |
| item30.setWeight(3); |
| item30.setVal(6); |
| Gene gene30 = new Gene(item30); |
| |
| 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); |
| list.add(gene11); |
| list.add(gene12); |
| list.add(gene13); |
| list.add(gene14); |
| list.add(gene15); |
| list.add(gene16); |
| list.add(gene17); |
| list.add(gene18); |
| list.add(gene19); |
| list.add(gene20); |
| list.add(gene21); |
| list.add(gene22); |
| list.add(gene23); |
| list.add(gene24); |
| list.add(gene25); |
| list.add(gene26); |
| list.add(gene27); |
| list.add(gene28); |
| list.add(gene29); |
| list.add(gene30); |
| |
| return list; |
| } |
| } |