All Downloads are FREE. Search and download functionalities are using the official Maven repository.

MOEAFramework-3.7.examples.Example6 Maven / Gradle / Ivy

/* Copyright 2009-2023 David Hadka
 *
 * This file is part of the MOEA Framework.
 *
 * The MOEA Framework is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 *
 * The MOEA Framework is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with the MOEA Framework.  If not, see .
 */
import org.moeaframework.algorithm.NSGAII;
import org.moeaframework.core.Problem;
import org.moeaframework.core.Solution;
import org.moeaframework.core.variable.EncodingUtils;
import org.moeaframework.core.variable.RealVariable;
import org.moeaframework.problem.AbstractProblem;

/**
 * It's also very easy to add your own test or real-world problems for use in the MOEA
 * Framework.  Here we recreate the Srinivas test problem and solve it using NSGA-II. 
 */
public class Example6 {

	public static class Srinivas extends AbstractProblem {

		/**
		 * Creates the problem with two decision variables, two objectives, and two constraints.
		 */
		public Srinivas() {
			super(2, 2, 2);
		}

		/**
		 * Function to evaluate each solution.
		 */
		@Override
		public void evaluate(Solution solution) {
			double[] x = EncodingUtils.getReal(solution);
			double f1 = Math.pow(x[0] - 2.0, 2.0) + Math.pow(x[1] - 1.0, 2.0) + 2.0;
			double f2 = 9.0*x[0] - Math.pow(x[1] - 1.0, 2.0);
			double c1 = Math.pow(x[0], 2.0) + Math.pow(x[1], 2.0) - 225.0;
			double c2 = x[0] - 3.0*x[1] + 10.0;
			
			// set the objective values - these are being minimized
			solution.setObjective(0, f1);
			solution.setObjective(1, f2);
			
			// set the constraint values - we treat any non-zero value as a constraint violation!
			solution.setConstraint(0, c1 <= 0.0 ? 0.0 : c1);
			solution.setConstraint(1, c2 <= 0.0 ? 0.0 : c2);
		}

		/**
		 * Function to create a new solution.  Here is where we define the types and
		 * bounds of each decision variables.  In this example, we have two real-valued
		 * variables ranging from -20 to 20.
		 */
		@Override
		public Solution newSolution() {
			Solution solution = new Solution(2, 2, 2);
			
			solution.setVariable(0, new RealVariable(-20.0, 20.0));
			solution.setVariable(1, new RealVariable(-20.0, 20.0));
			
			return solution;
		}
		
	}
	
	public static void main(String[] args) {
		Problem problem = new Srinivas();
		
		NSGAII algorithm = new NSGAII(problem);
		algorithm.run(10000);
		
		algorithm.getResult().display();
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy