{"id":286,"date":"2025-08-28T13:44:49","date_gmt":"2025-08-28T13:44:49","guid":{"rendered":"https:\/\/www.jecdm.cs.put.poznan.pl\/?page_id=286"},"modified":"2025-09-04T16:35:18","modified_gmt":"2025-09-04T16:35:18","slug":"configuring-the-nsga-ii-algorithm","status":"publish","type":"page","link":"https:\/\/www.jecdm.cs.put.poznan.pl\/?page_id=286","title":{"rendered":"Configuring the NSGA-II algorithm"},"content":{"rendered":"\n<p style=\"font-size:14px\">This quick-start tutorial demonstrates how to configure the NSGA-II algorithm and apply it to the DTLZ2 problem with two objectives. Furthermore, it is demonstrated how numerical results can be reported and how the visualization of the final population can be performed. The complete source code for this tutorial can be found in the Projects module: y2025.SoftwareX_JECDM.QuickStart1 (framework&#8217;s version at least<strong> <\/strong>1.7.0). In what follows, the relevant commented code blocks are presented, and the expected results are visualized for convenience. Note that a list of essential imports can be found at the end of this tutorial.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"font-size:18px\">The overview of the source code:<\/h2>\n\n\n\n<p style=\"font-size:14px\">Let us start with defininf the criteria\/objectives:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-f87b1132013544233f392ffe545e3b19\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-comment\">\/\/ The following line instantiates 2 criteria using a factory-like method.<\/span>\n\nCriteria C = Criteria.constructCriteria(\n        <span class=\"hljs-string\">\"C\"<\/span>, <span class=\"hljs-comment\">\/\/ denotes a prefix for criteria names (\"C0\", \"C1\")<\/span>\n        <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-comment\">\/\/ denotes the number of criteria to instantiate<\/span>\n        <span class=\"hljs-keyword\">false<\/span> <span class=\"hljs-comment\">\/\/indicates that the criteria are cost-type.<\/span>\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Now, we can define the problem-specifica data:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-6a74bec922944fcef78796cb31c633e5\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Now, let us instantiate a DTLZ2 packed in a bundle-like class. It comprises various auxiliary data, e.g., the Pareto front bounds, and delivers the evaluation procedure, while also providing default reproduction and initialization phases (SBX and PM operators; random vectors initialization; see the method's code for further information).<\/span>\n\nDTLZBundle dtlz2 = DTLZBundle.getBundle(\n        Problem.DTLZ2, <span class=\"hljs-comment\">\/\/ the problem id<\/span>\n        C._no, <span class=\"hljs-comment\">\/\/ the problem dimensionality<\/span>\n        DTLZBundle.getRecommendedNODistanceRelatedParameters(Problem.DTLZ2, C._no) <span class=\"hljs-comment\">\/\/ the number of<\/span>\n        <span class=\"hljs-comment\">\/\/ distance-related variables (10 + no. objectives - 1):<\/span>\n\n        <span class=\"hljs-comment\">\/\/ Alternatively, you can also supply your own operator constructors, as shown in the following example:<\/span>\n        <span class=\"hljs-comment\">\/\/ (problem, M, D) -&gt; new SBX(1.0d, 20.0d), \/\/ probability = 1.0; distribution index = 20.0<\/span>\n        <span class=\"hljs-comment\">\/\/ (problem, M, D) -&gt; new PM(1.0d \/ (double) (D + M), 20.0d) \/\/ probability = 1 \/ (the number of decision variables for this problem = 12); distribution index = 20.0)<\/span>\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Then, we can proceed to instantiating the NSGA-II algorithm:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-a0b170869cc59cb67cc8f754535b4171\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Now, instantiate the NSGA-II method, using the factory-like static method (it is recommended to examine other similar static methods in this class):<\/span>\n\nNSGAII nsgaii = NSGAII.getNSGAII(\n        <span class=\"hljs-literal\">true<\/span>, <span class=\"hljs-comment\">\/\/ This flag indicates that NSGA-II will be parameterized to dynamically update its internal data on the known Pareto front bounds during optimization (false = the data is fixed and derived from the bundle; in the case of DTLZ2, the bounds are &#91;0, 1] intervals; they are used primarily to properly normalize objectives when calculating crowding distances<\/span>\n        <span class=\"hljs-number\">30<\/span>, <span class=\"hljs-comment\">\/\/ the population size<\/span>\n        <span class=\"hljs-keyword\">new<\/span> L32_X64_MIX(<span class=\"hljs-number\">0<\/span>), <span class=\"hljs-comment\">\/\/ the random number generator instantiated with a seed of 0 for reproducibility<\/span>\n        dtlz2 <span class=\"hljs-comment\">\/\/ problem bundle (delivers by default dedicated operators, etc.; these can also be supplied by using other static methods of the NSGAII class)<\/span>\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Now, we can execute the method. Two means of doing that are presented:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-c95651498303941e230a131d90351d1c\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ The EA can be executed manually by calling its init and step methods. The former is associated with the 0th generation, during which mainly an initial population is constructed and evaluated. The step method executes a regular generation process that involves parent selection, reproduction, evaluation, and survival of the fittest, among other steps. Note that the method requires providing the current generation number as the input. These generation numbers should start from 1, as 0 is reserved for the init step.<\/span>\n\n<span class=\"hljs-keyword\">try<\/span>\n{\n    nsgaii.init();\n    <span class=\"hljs-keyword\">for<\/span> (int g = <span class=\"hljs-number\">1<\/span>; g &lt; <span class=\"hljs-number\">300<\/span>; g++) nsgaii.step(<span class=\"hljs-keyword\">new<\/span> EATimestamp(g));\n} <span class=\"hljs-keyword\">catch<\/span> (EAException e)\n{\n    <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(e);\n}\n\n<span class=\"hljs-comment\">\/\/ Alternatively, a dedicated runner object can be used to perform the evolution. It is worth noting that it can handle multiple EAs as well as coupling the simulation with visualization.<\/span>\n\n<span class=\"hljs-comment\">\/*IRunner runner = new Runner(new Runner.Params(nsgaii));\ntry\n{\n    runner.executeEvolution(200);\n} catch (RunnerException e)\n{\n    throw new RuntimeException(e);\n}*\/<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">The following piece of code accesses the specimens and prints the information on their objective and decision vectors:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-8493bf719728055a4636bc13071a55b8\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Now, let us print the population:<\/span>\n\n<span class=\"hljs-keyword\">for<\/span> (Specimen s : nsgaii.getSpecimensContainer().getPopulation())\n{\n    <span class=\"hljs-built_in\">String<\/span> sb = PrintUtils.getVectorOfDoubles(s.getEvaluations(), <span class=\"hljs-number\">3<\/span>) + <span class=\"hljs-comment\">\/\/ objective vector (precision of three decimal places)<\/span>\n            <span class=\"hljs-string\">\" : \"<\/span> + <span class=\"hljs-comment\">\/\/ separator<\/span>\n            PrintUtils.getVectorOfDoubles(s.getDoubleDecisionVector(), <span class=\"hljs-number\">3<\/span>); <span class=\"hljs-comment\">\/\/ decision vector (precision of three decimal places)<\/span>\n    System.out.println(sb);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Expected first lines of the console output:<\/p>\n\n\n\n<p class=\"has-text-align-left\" style=\"font-size:14px\">1.023 0.000 : 0.000 0.495 0.516 0.491 0.519 0.518 0.480 0.500 0.499 0.564 0.502 0.632<br>0.000 1.046 : 1.000 0.493 0.468 0.492 0.394 0.477 0.430 0.523 0.483 0.485 0.335 0.487<br>1.023 0.000 : 0.000 0.495 0.516 0.491 0.519 0.518 0.480 0.500 0.499 0.564 0.502 0.632<br>0.000 1.046 : 1.000 0.493 0.468 0.492 0.394 0.477 0.430 0.523 0.483 0.485 0.335 0.487<br>0.690 0.727 : 0.517 0.498 0.470 0.487 0.516 0.478 0.503 0.509 0.525 0.506 0.503 0.499<\/p>\n\n\n\n<p style=\"font-size:14px\">Additionally, we can calculate the hypervolume attained by the final population and compare it with the easy-to-calculate optimum:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-0709ba90ec565b7e5b04b44ab5401a48\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ We can also perform a simple performance assessment using a standard hypervolume metric.<\/span>\n\nHV.Params pHV = <span class=\"hljs-keyword\">new<\/span> HV.Params( <span class=\"hljs-comment\">\/\/ the parameterization of various objects in this framework is often conducted via an inner static class called Params, which is then passed via the constructor<\/span>\n        C._no, <span class=\"hljs-comment\">\/\/ the number of objectives considered<\/span>\n        dtlz2._normalizations, <span class=\"hljs-comment\">\/\/ functions used to normalize the input objective vectors into &#91;0,1] hypercube<\/span>\n        ArrayUtils.getDoubleArray(C._no, <span class=\"hljs-number\">1.1<\/span>d) <span class=\"hljs-comment\">\/\/ set the reference point (nadir) in the normalized space to &#91;1.1, 1.1]<\/span>\n);\n\n<span class=\"hljs-comment\">\/\/ Let us now instantiate the indicator:<\/span>\n\nIPerformanceIndicator indicator = <span class=\"hljs-keyword\">new<\/span> HV(pHV);\ndouble hv = indicator.evaluate(nsgaii); <span class=\"hljs-comment\">\/\/ calculate the hypervolume based on the current state of the algorithm<\/span>\n\n<span class=\"hljs-comment\">\/\/ We can easily calculate the optimal hypervolume in this setting (1.1^2 - one fourth of a 1-radius disk):<\/span>\ndouble optimalHV = <span class=\"hljs-number\">1.1<\/span>d * <span class=\"hljs-number\">1.1<\/span>d - <span class=\"hljs-built_in\">Math<\/span>.PI \/ <span class=\"hljs-number\">4.0<\/span>d;\nSystem.out.println(<span class=\"hljs-string\">\"HV = \"<\/span> + hv); <span class=\"hljs-comment\">\/\/ print the attained hypervolume<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Optimal HV = \"<\/span> + optimalHV); <span class=\"hljs-comment\">\/\/ print the optimal hypervolume<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Difference = \"<\/span> + (optimalHV - hv)); <span class=\"hljs-comment\">\/\/ print the difference<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Expected console output:<\/p>\n\n\n\n<p class=\"has-text-align-left\" style=\"font-size:14px\">HV = 0.40047534244224003<br>Optimal HV = 0.4246018366025519<br>Difference = 0.024126494160311873<\/p>\n\n\n\n<p style=\"font-size:14px\">We can finally visualize the last population constructed by NSGA-II. It begins by creating the plot:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-bd6fee46c533a80d433ddcf25a38bf88\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Finally, let us visualize the constructed population using a 2D plot. We will use the Plot2DFactory class for this purpose, which allows for the quick instantiation of simple 2D plots. Note that this class features numerous static factory methods, enabling various customizations.<\/span>\n\nPlot2D plot2D = Plot2DFactory.getPlot(\n        <span class=\"hljs-string\">\"f1\"<\/span>, <span class=\"hljs-comment\">\/\/ label for the x-axis<\/span>\n        <span class=\"hljs-string\">\"f2\"<\/span>, <span class=\"hljs-comment\">\/\/ label for the y-axis<\/span>\n        <span class=\"hljs-number\">1.5<\/span>d, <span class=\"hljs-comment\">\/\/ limit for both axes: &#91;0; limit]<\/span>\n        <span class=\"hljs-number\">1.2<\/span>f, <span class=\"hljs-comment\">\/\/ auxiliary parameter for relative font rescaling (1.0 = default value)<\/span>\n        scheme -&gt; scheme._colors.put(ColorFields.PLOT_BACKGROUND, Color.WHITE) <span class=\"hljs-comment\">\/\/ plot scheme adjuster can be<\/span>\n        <span class=\"hljs-comment\">\/\/ supplied via this argument; the plot look is mostly controlled by a Scheme object that can be altered<\/span>\n        <span class=\"hljs-comment\">\/\/ on the fly in this way; this piece of code sets the plot background color to white (transparent by default)<\/span>\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Then, a dedicated Frame object (extends the Java Swing&#8217;s Frame class) must be instantiated:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-4e2c7d9958edb195491f9ede7a239d2c\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ The plot object is displayed using a dedicated Frame (extension of JSwing's Frame):<\/span>\n\nFrame frame = <span class=\"hljs-keyword\">new<\/span> Frame(\n        plot2D, <span class=\"hljs-comment\">\/\/ plot to be displayed<\/span>\n        <span class=\"hljs-number\">800<\/span>, <span class=\"hljs-comment\">\/\/ plot width in pixels<\/span>\n        <span class=\"hljs-number\">800<\/span> <span class=\"hljs-comment\">\/\/ plot height in pixels<\/span>\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">After instantiating the plot and the frame, we can start preparing the data sets to be visualized:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-0990e6f70c9efd65bad620007ffc143d\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ We can now supply the plot with data sets to be visualized. Note that it can only be done after bounding the plot with the frame. We will visualize the Pareto front and the final population (objective vectors).<\/span>\n\nArrayList&lt;IDataSet&gt; dataSets = <span class=\"hljs-keyword\">new<\/span> ArrayList&lt;&gt;(<span class=\"hljs-number\">2<\/span>); <span class=\"hljs-comment\">\/\/ initialize an array of data sets<\/span>\n<span class=\"hljs-comment\">\/\/ Prepare the pareto front:<\/span>\ndataSets.add(\n        <span class=\"hljs-comment\">\/\/ ReferenceParetoFront class provides simple methods for quickly instantiating straightforward Pareto<\/span>\n        <span class=\"hljs-comment\">\/\/ fronts to be displayed. Here, we ask for a concave spherical 2D front.<\/span>\n        ReferenceParetoFront.getConcaveSpherical2DPF(\n                <span class=\"hljs-number\">1.0<\/span>d, <span class=\"hljs-comment\">\/\/ the radius of the sphere<\/span>\n                <span class=\"hljs-keyword\">new<\/span> LineStyle(<span class=\"hljs-number\">0.5<\/span>f, color.gradient.Color.BLACK) <span class=\"hljs-comment\">\/\/ line style (width and color)<\/span>\n        )\n);\n\n<span class=\"hljs-comment\">\/\/ Now, we can construct a data set representing the population. For this reason, we will use the primary way of instantiating data sets: a dedicated factory-like class, DSFactory2D.<\/span>\ndataSets.add(\n        DSFactory2D.getDS(\n                <span class=\"hljs-string\">\"Population\"<\/span>, <span class=\"hljs-comment\">\/\/ the data set name<\/span>\n                <span class=\"hljs-keyword\">new<\/span> EASource(nsgaii).createData(), <span class=\"hljs-comment\">\/\/ we need to provide objective vectors defined as double&#91;]&#91;]<\/span>\n                <span class=\"hljs-comment\">\/\/ matrix; for this purpose, we will use an auxiliary data processor: EASource<\/span>\n                <span class=\"hljs-keyword\">new<\/span> MarkerStyle( <span class=\"hljs-comment\">\/\/ finally, we can define the marker style<\/span>\n                        <span class=\"hljs-number\">3.0<\/span>f, <span class=\"hljs-comment\">\/\/ marker size<\/span>\n                        ColorPalettes.getFromDefaultPalette(<span class=\"hljs-number\">0<\/span>), <span class=\"hljs-comment\">\/\/ color obtained from the default color palette (bluish)<\/span>\n                        Marker.CIRCLE <span class=\"hljs-comment\">\/\/ marker style<\/span>\n                )\n        )\n);\n\n<span class=\"hljs-comment\">\/\/ The following line delivers the data sets to be displayed to the plot:<\/span>\nplot2D.getModel().setDataSets(dataSets);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">The following piece of code displays the rendered plot:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-973839e5486f84214e031cee62f2db56\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Finally, we can display the plot (ensure that the screen scaling in the OS is set to 1.0 for best outcomes; a different factor may result in visual artifacts):<\/span>\nframe.setVisible(<span class=\"hljs-literal\">true<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">Lastly, this tutorial showcases how to create the plot&#8217;s screenshot that can be then used, e.g., in one&#8217;s publication:<\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-210c4c9180de45e76fb3c35ba11b85a1\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ For this quick start tutorial, the screenshot of the plot is generated and stored. It can be accomplished in the following way:<\/span>\nScreenshot screenshot = plot2D.getModel().requestScreenshotCreation(\n        <span class=\"hljs-number\">1000<\/span>, <span class=\"hljs-comment\">\/\/ screenshot width (independent to the current plot width)<\/span>\n        <span class=\"hljs-number\">1000<\/span>,  <span class=\"hljs-comment\">\/\/ screenshot height (independent to the current plot height)<\/span>\n        <span class=\"hljs-keyword\">false<\/span>, <span class=\"hljs-comment\">\/\/ do not use the alpha channel<\/span>\n        <span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-comment\">\/\/ optional parameter that indicates that the plot will be clipped to its content by<\/span>\n        <span class=\"hljs-comment\">\/\/ removing the first\/last columns\/rows that match the given color (e.g., check Color.WHITE)<\/span>\n);\n\n<span class=\"hljs-comment\">\/\/ Generating the screenshot is asynchronous. We need to wait by calling .await() on the provided synchronization barrier:<\/span>\n<span class=\"hljs-keyword\">try<\/span>\n{\n    screenshot._barrier.await();\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e)\n{\n    <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(e);\n}\n\n<span class=\"hljs-comment\">\/\/ Finally, we can use the following method to save the screenshot.<\/span>\nImageSaver.saveImage(\n        screenshot._image, <span class=\"hljs-comment\">\/\/ screenshot to be saved<\/span>\n        <span class=\"hljs-string\">\"D:\"<\/span> + File.serparatorChar + <span class=\"hljs-string\">\"quickstart1\"<\/span>, <span class=\"hljs-comment\">\/\/ file path (excludes the extension; alter it according to your computer specification and needs)<\/span>\n        <span class=\"hljs-string\">\"jpg\"<\/span>, <span class=\"hljs-comment\">\/\/ file extension (only regular file types, e.g., bmp or jpg are supported; in the case of providing an unsupported extension, an error message will be printed)<\/span>\n        <span class=\"hljs-number\">1.0f<\/span> <span class=\"hljs-comment\">\/\/ image quality (1.0 = the best; not all extensions support this parameter)<\/span>\n);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p style=\"font-size:14px\">The expected final render is provided below. Note the poor performance in terms of distribution, which is often attributed to the classic NSGA-II algorithm.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"1000\" src=\"https:\/\/www.jecdm.cs.put.poznan.pl\/wp-content\/uploads\/2025\/08\/quickstart1-1.jpg\" alt=\"\" class=\"wp-image-322\" style=\"width:444px;height:auto\"\/><\/figure><\/div>\n\n\n<p style=\"font-size:18px\"><strong>Used imports:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code has-white-color has-text-color has-background has-link-color wp-elements-de217cd2d165a973f197a8ba87fa2358\" style=\"background-color:#2b2b2b;font-size:14px\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">color<\/span><span class=\"hljs-selector-class\">.Color<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">color<\/span><span class=\"hljs-selector-class\">.gradient<\/span><span class=\"hljs-selector-class\">.ColorPalettes<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">criterion<\/span><span class=\"hljs-selector-class\">.Criteria<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">dataset<\/span><span class=\"hljs-selector-class\">.DSFactory2D<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">dataset<\/span><span class=\"hljs-selector-class\">.IDataSet<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">dataset<\/span><span class=\"hljs-selector-class\">.painter<\/span><span class=\"hljs-selector-class\">.style<\/span><span class=\"hljs-selector-class\">.LineStyle<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">dataset<\/span><span class=\"hljs-selector-class\">.painter<\/span><span class=\"hljs-selector-class\">.style<\/span><span class=\"hljs-selector-class\">.MarkerStyle<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">dataset<\/span><span class=\"hljs-selector-class\">.painter<\/span><span class=\"hljs-selector-class\">.style<\/span><span class=\"hljs-selector-class\">.enums<\/span><span class=\"hljs-selector-class\">.Marker<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">ea<\/span><span class=\"hljs-selector-class\">.EATimestamp<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">emo<\/span><span class=\"hljs-selector-class\">.aposteriori<\/span><span class=\"hljs-selector-class\">.nsgaii<\/span><span class=\"hljs-selector-class\">.NSGAII<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">exception<\/span><span class=\"hljs-selector-class\">.EAException<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">exception<\/span><span class=\"hljs-selector-class\">.RunnerException<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">frame<\/span><span class=\"hljs-selector-class\">.Frame<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">indicator<\/span><span class=\"hljs-selector-class\">.IPerformanceIndicator<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">indicator<\/span><span class=\"hljs-selector-class\">.emo<\/span><span class=\"hljs-selector-class\">.HV<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">io<\/span><span class=\"hljs-selector-class\">.image<\/span><span class=\"hljs-selector-class\">.ImageSaver<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">plot<\/span><span class=\"hljs-selector-class\">.Plot2D<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">plot<\/span><span class=\"hljs-selector-class\">.Plot2DFactory<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">population<\/span><span class=\"hljs-selector-class\">.Specimen<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">print<\/span><span class=\"hljs-selector-class\">.PrintUtils<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">problem<\/span><span class=\"hljs-selector-class\">.Problem<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">problem<\/span><span class=\"hljs-selector-class\">.moo<\/span><span class=\"hljs-selector-class\">.dtlz<\/span><span class=\"hljs-selector-class\">.DTLZBundle<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">random<\/span><span class=\"hljs-selector-class\">.L32_X64_MIX<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">reproduction<\/span><span class=\"hljs-selector-class\">.operators<\/span><span class=\"hljs-selector-class\">.crossover<\/span><span class=\"hljs-selector-class\">.SBX<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">reproduction<\/span><span class=\"hljs-selector-class\">.operators<\/span><span class=\"hljs-selector-class\">.mutation<\/span><span class=\"hljs-selector-class\">.PM<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">runner<\/span><span class=\"hljs-selector-class\">.IRunner<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">runner<\/span><span class=\"hljs-selector-class\">.Runner<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">scheme<\/span><span class=\"hljs-selector-class\">.enums<\/span><span class=\"hljs-selector-class\">.ColorFields<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">utils<\/span><span class=\"hljs-selector-class\">.ArrayUtils<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">utils<\/span><span class=\"hljs-selector-class\">.Screenshot<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">visualization<\/span><span class=\"hljs-selector-class\">.updaters<\/span><span class=\"hljs-selector-class\">.sources<\/span><span class=\"hljs-selector-class\">.EASource<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">visualization<\/span><span class=\"hljs-selector-class\">.utils<\/span><span class=\"hljs-selector-class\">.ReferenceParetoFront<\/span>;\n\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">java<\/span><span class=\"hljs-selector-class\">.io<\/span><span class=\"hljs-selector-class\">.File<\/span>;\n<span class=\"hljs-selector-tag\">import<\/span> <span class=\"hljs-selector-tag\">java<\/span><span class=\"hljs-selector-class\">.util<\/span><span class=\"hljs-selector-class\">.ArrayList<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>","protected":false},"excerpt":{"rendered":"<p>This quick-start tutorial demonstrates how to configure the NSGA-II algorithm and apply it to the DTLZ2 problem with two objectives. Furthermore, it is demonstrated how numerical results can be reported and how the visualization of the final population can be performed. The complete source code for this tutorial can be found in the Projects module:\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.jecdm.cs.put.poznan.pl\/?page_id=286\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":276,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"page-templates\/full-width.php","meta":{"footnotes":""},"class_list":["post-286","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/pages\/286"}],"collection":[{"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=286"}],"version-history":[{"count":43,"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/pages\/286\/revisions"}],"predecessor-version":[{"id":408,"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/pages\/286\/revisions\/408"}],"up":[{"embeddable":true,"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=\/wp\/v2\/pages\/276"}],"wp:attachment":[{"href":"https:\/\/www.jecdm.cs.put.poznan.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}