Skip to main content

mathematical optimization - Simulated Annealing Convergence


I am using Simulated Annealing method for a simulation based optimization of a process that has 3 variables, using NMinimize. I print the input/output during every iteration using the "Evaluation Monitor". I have noticed that after about 3000 iterations, Mathematica gives me a convergence result. But checking the results from "Evaluation Monitor" shows that the ultimate convergence result is not the global minimal, but the process has visited a better minimal during one of the iterations. Why is this happening?


Here is a sample code:



demand[n_,k_]:=Min[k Vf,n capacity];
supply[n_,k_]:=Min[(n Kj-k) w, n capacity];
flo[n_,Ku_,Kd_]:=Min[demand[n,Ku],supply[n,Kd]];
dx=Vf*dt; n=Round[Flen/dx]; m=Round[SimTime/dt];
p=Round[Rlen/dx]; θ=Vf/w; capacity=w*Vf*Kj/(Vf+w); α[a1_]:=1800.; β[a2_]:=0.1; L=3.;
Flen=8.; Rlen=3.; SimTime=30./60.; Kj=150.; w=20.; Vf=100.; dt=12./3600.; d=1.;
RMLocation=Round[(2/3) p]; j=0;

f[a1_,a2_,a3_]:=Module[{b1=a1,b2=a2,b3=a3,TT=0,NtwrkTT=0,j=0},
RM[x_,t_]:=Piecewise[{{100 b1,x<=3},{100 b2,3
NtwrkTT=0; Clear[k0,kr,k,γ];
k0=ConstantArray[0,n];
kr=Table[Table[0,{k,1,p}],{i,1,n}];
γ=ConstantArray[1,n];
For[i=2, i TT=Plus@@(Plus@@kr); NtwrkTT=TT; k=k0;
While[TT>0, TT=0;
For[i=2, i dem=demand[L,k0[[i]]]; dem=If[dem==0,0.001,dem];
γ[[i]]=Min[1,supply[L,k0[[i+1]]]/dem];

ϕ=γ[[i]] demand[1,kr[[i,p]]]/d;
Qr=(ϕ-β[i dx] FQin) dx;
FQout=Min[demand[L,k0[[i]]],supply[L,k0[[i+1]]]];
k[[i]]=k0[[i]]+(FQin-FQout+Qr)/Vf;
kr0=kr[[i]];
For[ir=2,ir<=p,ir++,
MR=If[ir==RMLocation+1,RM[i dx,j dt],capacity];
RQin=Min[MR,If[ir==2,flo[1,kr0[[ir-1]],kr0[[ir]]],RQout]];
MR=If[ir==RMLocation,RM[i dx,j dt],capacity];
RQout=Min[MR,If[ir
kr[[i,ir]]=kr0[[ir]]+(RQin-RQout)/Vf];
kr[[i,1]]=If[j<=m,α[i dx] d/Vf,0]];
TT=Plus@@(Plus@@kr);
TT+=Plus@@k;
k0=k;NtwrkTT+=TT;j++];
NtwrkTT dt]
NMinimize[{f[a,b,c],3<=a<=12&&3<=b<=12&&3<=c<=12&&Element[a|b|c,Integers]},{a,b,c},Method->{"SimulatedAnnealing","SearchPoints"->5^5},EvaluationMonitor:>Print["a = ",a," , b = ",b," , c = ",c," , f[a,b,c] = ",f[a,b,c]]]

Hope this helps.


Ps. Any suggestions to improve the performance of this code will be greatly appreciated. Thank You.



edit:


As per @@Kuba's suggestion, I split the original question in to two. The second part is at Simulated Annealing Parameters and Results



Answer



I found the solution on another website "http://eternaldisturbanceincosmos.wordpress.com/2011/04/27/nminimize-in-mathematica-could-drive-you-insane/" which says "It turns out that NMinimize does not hold its arguments. This means that as the list of arguments is read from left to right, each argument is evaluated and replaced by the result of the evaluation". So I used Hold[] in the NMinimize function that fixed the problem.


Edit:


As suggested by Szabolcs, it worked with ?NumericQ alone and no Hold[]


Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Adding a thick curve to a regionplot

Suppose we have the following simple RegionPlot: f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}] Now I'm trying to change the curve defined by $y=g[x]$ into a thick black curve, while leaving all other boundaries in the plot unchanged. I've tried adding the region $y=g[x]$ and playing with the plotstyle, which didn't work, and I've tried BoundaryStyle, which changed all the boundaries in the plot. Now I'm kinda out of ideas... Any help would be appreciated! Answer With f[x_] := 1 - x^2 g[x_] := 1 - 0.5 x^2 You can use Epilog to add the thick line: RegionPlot[{y < f[x], f[x] < y < g[x], y > g[x]}, {x, 0, 2}, {y, 0, 2}, PlotPoints -> 50, Epilog -> (Plot[g[x], {x, 0, 2}, PlotStyle -> {Black, Thick}][[1]]), PlotStyle -> {Directive[Yellow, Opacity[0.4]], Directive[Pink, Opacity[0.4]],