Class TspDemoView
- All Implemented Interfaces:
IFeedbackProvider,ISimulationHost,IAcceptedMoveListener,ITspDemoResettable,SimulationListener,IFileDropHandler,ComponentListener,FocusListener,MouseListener,ImageObserver,MenuContainer,Serializable,EventListener,Accessible,RootPaneContainer,WindowConstants
SimulationView.
What this demo shows
The view displays a set of randomly placed cities connected by their current best tour (a closed Hamiltonian cycle). As the annealer runs, the tour progressively untangles from its initial random spaghetti into a near-optimal route. The optional "river" (a vertical blue line) adds a configurable penalty or bonus for each edge that crosses it, changing the shape of the optimal solution.
An Energy vs. Temperature scatter plot in the right-hand diagnostics panel shows accepted moves as a gray point cloud and best solutions as connected red squares. Together these reveal the Metropolis acceptance criterion operating across the full temperature range.
Layout
The view uses the standard SimulationView diagnostics split:
- Left (60%): world-coordinate canvas showing cities and tour.
- Right (40%):
EvsTPlotPanel(E vs T scatter plot). - South:
TspDemoControlPanelwith media buttons, city/penalty sliders, and a Reset button.
Threading model
The annealing algorithm runs on the simulation thread. The view receives two kinds of callbacks on the EDT:
onSimulationProgress(edu.cnu.mdi.sim.SimulationContext, edu.cnu.mdi.sim.ProgressInfo)— updatesbestTourSnapshotfrom the simulation's best solution, throttled bySimulatedAnnealingConfig.progressEverySteps().newBest(double, double)(IAcceptedMoveListener) — updatesbestTourSnapshotimmediately when a new best is found, giving more responsive visual feedback during the early fast-improving phase of annealing. The volatile write tobestTourSnapshotis safe because it is a single reference assignment.
The before/after draw hooks run on the EDT during each repaint and read only
the volatile model and bestTourSnapshot snapshots — they
never touch mutable simulation internals directly.
Construction pattern
Because super(...) must be the first statement and the
SimulationEngine holds its Simulation as a
final field, the simulation and model must be created before
super() is called. A ThreadLocal (BUNDLE_TL) is
used to smuggle the newly created TspModel across the
super() boundary so the constructor can retrieve it immediately
after.
Reset
Reset is handled by SimulationView.requestEngineReset(java.util.function.Supplier<edu.cnu.mdi.sim.Simulation>, java.util.function.Consumer<edu.cnu.mdi.sim.SimulationEngine>, boolean, boolean), which stops
the current engine (if running), builds a new simulation via the supplied
factory, swaps it in, and restarts. The after-swap hook detaches the
IAcceptedMoveListener from the old simulation and attaches it to the
new one, ensuring the E vs T plot continues to receive data correctly.
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class edu.cnu.mdi.sim.ui.SimulationView
SimulationView.ControlPanelFactory, SimulationView.DiagnosticFactoryNested classes/interfaces inherited from class javax.swing.JInternalFrame
JInternalFrame.AccessibleJInternalFrame, JInternalFrame.JDesktopIconNested classes/interfaces inherited from class javax.swing.JComponent
JComponent.AccessibleJComponentNested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainerNested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intDefault number of cities for a new random problem.static final floatDefault river crossing penalty (positive = penalty, negative = bonus).Fields inherited from class edu.cnu.mdi.sim.ui.SimulationView
controlPanel, diagnostics, diagnosticsSplitPane, engineFields inherited from class edu.cnu.mdi.view.BaseView
container, desktop, infoDialog, properties, scrollPane, statusWP, viewPopupMenu, VIEWPROPNAME, virtualItemFields inherited from class javax.swing.JInternalFrame
closable, CONTENT_PANE_PROPERTY, desktopIcon, FRAME_ICON_PROPERTY, frameIcon, GLASS_PANE_PROPERTY, iconable, IS_CLOSED_PROPERTY, IS_ICON_PROPERTY, IS_MAXIMUM_PROPERTY, IS_SELECTED_PROPERTY, isClosed, isIcon, isMaximum, isSelected, LAYERED_PANE_PROPERTY, maximizable, MENU_BAR_PROPERTY, resizable, ROOT_PANE_PROPERTY, rootPane, rootPaneCheckingEnabled, title, TITLE_PROPERTYFields inherited from class javax.swing.JComponent
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOWFields inherited from class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENTFields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTHFields inherited from interface javax.swing.WindowConstants
DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidacceptedMove(double temperature, double energy) Called on the Swing EDT for the latest coalesced accepted move.Get an information object describing this view, used in the UI and for help.voidnewBest(double temperature, double energy) Called on the Swing EDT for the latest coalesced new-best notification.protected voidonSimulationProgress(SimulationContext ctx, ProgressInfo progress) Refresh the best tour snapshot from the simulation's current best solution.voidrequestReset(int cityCount, double riverPenalty) Request a reset/reinitialization of the demo with the provided parameters.Methods inherited from class edu.cnu.mdi.sim.ui.SimulationView
getDiagnosticsComponent, getSimulationEngine, onCancelRequested, onDone, onFail, onInit, onMessage, onPause, onProgress, onReady, onRefresh, onResume, onRun, onSimulationCancelRequested, onSimulationDone, onSimulationFail, onSimulationInit, onSimulationMessage, onSimulationPause, onSimulationReady, onSimulationRefresh, onSimulationResume, onSimulationRun, onSimulationStateChange, onStateChange, replaceEngine, requestEngineReset, startAndRunMethods inherited from class edu.cnu.mdi.view.BaseView
addWestPanel, applyFocusFix, center, checkBooleanProperty, componentHidden, componentMoved, componentResized, componentShown, enableFileDrop, enableFileDrop, filesDropped, focusGained, focusLost, getAnnotationLayer, getCenterComponent, getConfigurationProperties, getConnectionLayer, getDefaultLayer, getFeedbackStrings, getFileFilter, getIContainer, getImageComponent, getInfoButton, getInsets, getIntProperty, getName, getParentFrame, getProperties, getPropertyName, getScrollPane, getSpecialClip, getToolBar, getViewPopupMenu, getVirtualItem, handleMagnify, hoverClosed, hoverUpdate, initFeedback, initFeedback, isOnTop, isScrollable, isViewVisible, mouseClicked, mouseEntered, mouseExited, mousePressed, mouseReleased, offset, onFirstRealize, prepareForExit, refresh, resolveContainer, rightClicked, setAfterDraw, setBeforeDraw, setBooleanProperty, setFileFilter, setFromProperties, setIntProperty, setVirtualItem, viewInfoMethods inherited from class javax.swing.JInternalFrame
addImpl, addInternalFrameListener, createRootPane, dispose, doDefaultCloseAction, fireInternalFrameEvent, getAccessibleContext, getContentPane, getDefaultCloseOperation, getDesktopIcon, getDesktopPane, getFocusCycleRootAncestor, getFocusOwner, getFrameIcon, getGlassPane, getInternalFrameListeners, getJMenuBar, getLastCursor, getLayer, getLayeredPane, getMenuBar, getMostRecentFocusOwner, getNormalBounds, getRootPane, getTitle, getUI, getUIClassID, getWarningString, hide, isClosable, isClosed, isFocusCycleRoot, isIcon, isIconifiable, isMaximizable, isMaximum, isResizable, isRootPaneCheckingEnabled, isSelected, moveToBack, moveToFront, pack, paintComponent, paramString, remove, removeInternalFrameListener, reshape, restoreSubcomponentFocus, setClosable, setClosed, setContentPane, setCursor, setDefaultCloseOperation, setDesktopIcon, setFocusCycleRoot, setFrameIcon, setGlassPane, setIcon, setIconifiable, setJMenuBar, setLayer, setLayer, setLayeredPane, setLayout, setMaximizable, setMaximum, setMenuBar, setNormalBounds, setResizable, setRootPane, setRootPaneCheckingEnabled, setSelected, setTitle, setUI, show, toBack, toFront, updateUIMethods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, updateMethods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, transferFocusDownCycle, validate, validateTreeMethods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycleMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface edu.cnu.mdi.sim.ISimulationHost
cancelSimulation, getSimulationContext, getSimulationState, pauseSimulation, resumeSimulation, runSimulation, startSimulation, stopSimulationMethods inherited from interface edu.cnu.mdi.sim.SimulationListener
onCompleted
-
Field Details
-
DEFAULT_NUM_CITY
public static final int DEFAULT_NUM_CITYDefault number of cities for a new random problem.- See Also:
-
DEFAULT_RIVER_PENALTY
public static final float DEFAULT_RIVER_PENALTYDefault river crossing penalty (positive = penalty, negative = bonus).- See Also:
-
-
Constructor Details
-
TspDemoView
Create the TSP demo view.The constructor calls
createSimulationAndStashBundle(int, double, long)to build the initial simulation and stash the model inBUNDLE_TL, then passes the simulation tosuper(...). Aftersuper()returns it recovers the model from the thread-local and wires up the remaining references.- Parameters:
keyVals- standardBaseViewkey-value args
-
-
Method Details
-
getViewInfo
Get an information object describing this view, used in the UI and for help.- Overrides:
getViewInfoin classBaseView- Returns:
- view info, or
null
-
requestReset
public void requestReset(int cityCount, double riverPenalty) Request a reset/reinitialization of the demo with the provided parameters.Implementations should only honor this request when the simulation is in a safe state (typically READY or TERMINATED).
Clears the E vs T plot immediately (before the engine stops, so stale data disappears at once), then delegates to
SimulationView.requestEngineReset(java.util.function.Supplier<edu.cnu.mdi.sim.Simulation>, java.util.function.Consumer<edu.cnu.mdi.sim.SimulationEngine>, boolean, boolean). The after-swap hook:- Recovers the new model from
BUNDLE_TL. - Moves the
IAcceptedMoveListenerfrom the old simulation to the new one. - Updates
model,sim, andbestTourSnapshot. - Attaches an engine-backed feedback channel to the new simulation.
- Specified by:
requestResetin interfaceITspDemoResettable- Parameters:
cityCount- number of cities (e.g. 10..500)riverPenalty- penalty/bonus for crossing the river (e.g. -1..+1)
- Recovers the new model from
-
onSimulationProgress
Refresh the best tour snapshot from the simulation's current best solution.Called on the EDT at the rate set by
SimulatedAnnealingConfig.progressEverySteps(), providing a backstop refresh in casenewBest(double, double)misses a repaint. This also handles the initial state wherebestTourSnapshotis null — the first progress callback will always populate it.- Overrides:
onSimulationProgressin classSimulationView- Parameters:
ctx- simulation contextprogress- current progress info
-
acceptedMove
public void acceptedMove(double temperature, double energy) Called on the Swing EDT for the latest coalesced accepted move.Forwards the (temperature, energy) point to the E vs T scatter plot as a gray accepted-move point.
- Specified by:
acceptedMovein interfaceIAcceptedMoveListener- Parameters:
temperature- current annealing temperatureenergy- current solution energy (may be higher than best)
-
newBest
public void newBest(double temperature, double energy) Called on the Swing EDT for the latest coalesced new-best notification.Two things happen here:
- The best tour snapshot is updated immediately via a volatile reference write, so the next repaint shows the improved tour without waiting for the next progress callback. This gives responsive visual feedback during the early fast-improving phase of annealing when new bests arrive frequently.
- The (temperature, energy) point is added to the E vs T plot as a red best-solution square.
- Specified by:
newBestin interfaceIAcceptedMoveListener- Parameters:
temperature- temperature at which the new best was foundenergy- energy of the new best solution
-