summaryrefslogtreecommitdiffstats
path: root/nlpsolver/src/com/sun/star/comp/Calc/NLPSolver/DEPSSolverImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'nlpsolver/src/com/sun/star/comp/Calc/NLPSolver/DEPSSolverImpl.java')
-rw-r--r--nlpsolver/src/com/sun/star/comp/Calc/NLPSolver/DEPSSolverImpl.java212
1 files changed, 212 insertions, 0 deletions
diff --git a/nlpsolver/src/com/sun/star/comp/Calc/NLPSolver/DEPSSolverImpl.java b/nlpsolver/src/com/sun/star/comp/Calc/NLPSolver/DEPSSolverImpl.java
new file mode 100644
index 000000000..2b6c1ce36
--- /dev/null
+++ b/nlpsolver/src/com/sun/star/comp/Calc/NLPSolver/DEPSSolverImpl.java
@@ -0,0 +1,212 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2009 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.comp.Calc.NLPSolver;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import net.adaptivebox.deps.DEPSAgent;
+import net.adaptivebox.deps.behavior.DEGTBehavior;
+import net.adaptivebox.deps.behavior.PSGTBehavior;
+import net.adaptivebox.global.IUpdateCycleEngine;
+import net.adaptivebox.knowledge.Library;
+import net.adaptivebox.knowledge.SearchPoint;
+import net.adaptivebox.space.BasicPoint;
+
+import com.sun.star.comp.Calc.NLPSolver.dialogs.IEvolutionarySolverStatusDialog;
+import com.sun.star.lang.IllegalArgumentException;
+import com.sun.star.lang.XSingleComponentFactory;
+import com.sun.star.lib.uno.helper.Factory;
+import com.sun.star.registry.XRegistryKey;
+import com.sun.star.uno.XComponentContext;
+
+
+public final class DEPSSolverImpl extends BaseEvolutionarySolver
+ implements com.sun.star.lang.XServiceInfo
+{
+ private static final String m_implementationName = DEPSSolverImpl.class.getName();
+ private static final String[] m_serviceNames = {
+ "com.sun.star.sheet.Solver",
+ "com.sun.star.beans.PropertySet"
+ };
+
+ public DEPSSolverImpl( XComponentContext context )
+ {
+ super(context, "DEPS Evolutionary Algorithm");
+
+ registerProperty(m_agentSwitchRate);
+ registerProperty(m_minFactor);
+ registerProperty(m_maxFactor);
+ registerProperty(m_CR);
+ registerProperty(m_c1);
+ registerProperty(m_c2);
+ registerProperty(m_weight);
+ registerProperty(m_CL);
+ }
+
+ public static XSingleComponentFactory __getComponentFactory( String sImplementationName ) {
+ XSingleComponentFactory xFactory = null;
+
+ if ( sImplementationName.equals( m_implementationName ) )
+ xFactory = Factory.createComponentFactory(DEPSSolverImpl.class, m_serviceNames);
+ return xFactory;
+ }
+
+ public static boolean __writeRegistryServiceInfo( XRegistryKey xRegistryKey ) {
+ return Factory.writeRegistryServiceInfo(m_implementationName,
+ m_serviceNames,
+ xRegistryKey);
+ }
+
+ // com.sun.star.lang.XServiceInfo:
+ public String getImplementationName() {
+ return m_implementationName;
+ }
+
+ public boolean supportsService( String sService ) {
+ int len = m_serviceNames.length;
+
+ for( int i=0; i < len; i++) {
+ if (sService.equals(m_serviceNames[i]))
+ return true;
+ }
+ return false;
+ }
+
+ public String[] getSupportedServiceNames() {
+ return m_serviceNames;
+ }
+
+ private final PropertyInfo<Double> m_agentSwitchRate = new PropertyInfo<Double>("AgentSwitchRate", 0.5, "Agent Switch Rate (DE Probability)");
+ // --DE
+ private final PropertyInfo<Double> m_minFactor = new PropertyInfo<Double>("DEFactorMin", 0.5, "DE: Min Scaling Factor (0-1.2)");
+ private final PropertyInfo<Double> m_maxFactor = new PropertyInfo<Double>("DEFactorMax", 0.5, "DE: Max Scaling Factor (0-1.2)");
+ private final PropertyInfo<Double> m_CR = new PropertyInfo<Double>("DECR", 0.9, "DE: Crossover Probability (0-1)");
+ // --PS
+ private final PropertyInfo<Double> m_c1 = new PropertyInfo<Double>("PSC1", 1.494, "PS: Cognitive Constant");
+ private final PropertyInfo<Double> m_c2 = new PropertyInfo<Double>("PSC2", 1.494, "PS: Social Constant");
+ private final PropertyInfo<Double> m_weight = new PropertyInfo<Double>("PSWeight", 0.729, "PS: Constriction Coefficient");
+ private final PropertyInfo<Double> m_CL = new PropertyInfo<Double>("PSCL", 0.0, "PS: Mutation Probability (0-0.005)");
+
+ public void solve() {
+ try {
+ m_librarySize.setValue(m_swarmSize.getValue()); //DEPS' library is as large as the swarm
+ } catch (IllegalArgumentException ex) {
+ Logger.getLogger(DEPSSolverImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ initializeSolve();
+ if (m_problemEncoder == null)
+ {
+ return;
+ }
+
+ //Init:
+ DEPSAgent[] agents = new DEPSAgent[m_swarmSize.getValue()];
+ for (int i = 0; i < m_swarmSize.getValue(); i++) {
+ DEGTBehavior deGTBehavior = new DEGTBehavior();
+ deGTBehavior.MIN_FACTOR = Math.min(m_minFactor.getValue(), m_maxFactor.getValue());
+ deGTBehavior.MAX_FACTOR = Math.max(m_minFactor.getValue(), m_maxFactor.getValue());
+ deGTBehavior.CR = m_CR.getValue();
+ deGTBehavior.setLibrary(m_library);
+
+ PSGTBehavior psGTBehavior = new PSGTBehavior();
+ psGTBehavior.c1 = m_c1.getValue();
+ psGTBehavior.c2 = m_c2.getValue();
+ psGTBehavior.CL = m_CL.getValue();
+ psGTBehavior.weight = m_weight.getValue();
+ psGTBehavior.setLibrary(m_library);
+
+ agents[i] = new DEPSAgent(m_problemEncoder, deGTBehavior, psGTBehavior,
+ m_agentSwitchRate.getValue(), m_specCompareEngine,
+ m_library.getSelectedPoint(i));
+ }
+
+ //Learn:
+ m_solverStatusDialog.setVisible(true);
+ m_solverStatusDialog.setMaxIterations(m_learningCycles.getValue());
+ m_solverStatusDialog.setMaxStagnation(m_required.getValue());
+ int learningCycle = 1;
+ long runtime = 0;
+ do {
+ long startTime = System.nanoTime();
+
+ if (learningCycle >= m_learningCycles.getValue())
+ learningCycle = 1;
+
+ if (m_solverStatusDialog.getUserState() == IEvolutionarySolverStatusDialog.CONTINUE)
+ lockDocument();
+
+ m_toleratedCount = 0;
+ m_toleratedMin = -1.0 * m_tolerance.getValue();
+ m_toleratedMax = m_tolerance.getValue();
+ for (; learningCycle <= m_learningCycles.getValue() &&
+ m_toleratedCount < m_required.getValue() &&
+ m_solverStatusDialog.getUserState() != IEvolutionarySolverStatusDialog.CANCEL; learningCycle++) {
+ m_library.refreshGbest(m_specCompareEngine);
+
+ for (int i = 0; i < m_swarmSize.getValue(); i++)
+ agents[i].generatePoint();
+
+ for (int i = 0; i < m_swarmSize.getValue(); i++)
+ agents[i].learn();
+
+ for (int i = 0; i < m_swarmSize.getValue(); i++) {
+ SearchPoint agentPoint = agents[i].getMGState();
+ boolean inRange = (agentPoint.getObjectiveValue() >= m_toleratedMin && agentPoint.getObjectiveValue() <= m_toleratedMax);
+ if (Library.replace(m_envCompareEngine, agentPoint, m_totalBestPoint)) {
+ m_solverStatusDialog.setBestSolution(m_totalBestPoint.getObjectiveValue(), m_totalBestPoint.isFeasible());
+ if (!inRange) {
+ m_toleratedMin = agentPoint.getObjectiveValue() - m_tolerance.getValue();
+ m_toleratedMax = agentPoint.getObjectiveValue() + m_tolerance.getValue();
+ m_toleratedCount = 0;
+ }
+ }
+ }
+
+ if (m_specCompareEngine instanceof IUpdateCycleEngine)
+ ((IUpdateCycleEngine)m_specCompareEngine).updateCycle(learningCycle);
+
+ m_solverStatusDialog.setIteration(learningCycle);
+ m_solverStatusDialog.setStagnation(m_toleratedCount);
+ m_solverStatusDialog.setRuntime(runtime + (System.nanoTime() - startTime));
+ m_xReschedule.reschedule();
+ }
+
+ applySolution(); //show the current solution
+ unlockDocument(); //allow the solution to be displayed
+
+ runtime += (System.nanoTime() - startTime);
+ m_solverStatusDialog.setRuntime(runtime);
+ } while (m_solverStatusDialog.waitForUser() == IEvolutionarySolverStatusDialog.CONTINUE);
+
+ lockDocument();
+
+ finalizeSolve();
+ }
+
+}