{ "cells": [ { "cell_type": "markdown", "id": "e9b43d48", "metadata": {}, "source": [ "October 3 2021" ] }, { "cell_type": "code", "execution_count": 1, "id": "d457eb0a", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from collections import Counter\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "bc924833", "metadata": {}, "source": [ "Build random adjacency matrix" ] }, { "cell_type": "code", "execution_count": 2, "id": "adff5db6", "metadata": {}, "outputs": [], "source": [ "N = 300\n", "p = 1/500" ] }, { "cell_type": "code", "execution_count": 3, "id": "2d2ca984", "metadata": {}, "outputs": [], "source": [ "def get_A():\n", " A = (np.random.random((N, N)) < p).astype('float')\n", " for i in range(N):\n", " A[i,i] = 0\n", "\n", " for i in range(N):\n", " for j in range(N):\n", " A[i,j] = A[j,i]\n", " return A" ] }, { "cell_type": "markdown", "id": "e851af65", "metadata": {}, "source": [ "Start with random state" ] }, { "cell_type": "code", "execution_count": 4, "id": "bc753e2b", "metadata": {}, "outputs": [], "source": [ "def random_state():\n", " return 2*((np.random.random(N) > 0.5).astype('float') - 0.5)" ] }, { "cell_type": "code", "execution_count": 5, "id": "2791c6bd", "metadata": {}, "outputs": [], "source": [ "def cost(E, A, x):\n", " return E + x.T @ A @ x" ] }, { "cell_type": "markdown", "id": "b2bf4888", "metadata": {}, "source": [ "Test values that we get from random states" ] }, { "cell_type": "code", "execution_count": 6, "id": "8911b677", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[92.0, 100.0, 108.0, 112.0, 116.0]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctr = Counter()\n", "A = get_A()\n", "E = np.sum(A)\n", "for _ in range(1000):\n", " c = cost(E, A, random_state())\n", " ctr[c] += 1\n", "sorted(ctr.keys())[:5]" ] }, { "cell_type": "markdown", "id": "15e53821", "metadata": {}, "source": [ "Try minimizing with simple local search" ] }, { "cell_type": "code", "execution_count": 7, "id": "c048ca68", "metadata": {}, "outputs": [], "source": [ "def local_search(A, f, x):\n", " E = np.sum(A)\n", " best = f(E, A, x)\n", " loops = 0\n", " print('-')\n", " print('start cost:', best)\n", " while True:\n", " if loops % 20 == 0:\n", " print('loop', loops, 'cost:', best)\n", " bestpos = None\n", " for i in range(N):\n", " x[i] *= -1\n", " newcost = f(E, A, x)\n", " if newcost < best:\n", " best = newcost\n", " bestpos = i\n", " x[i] *= -1\n", " if bestpos == None:\n", " break\n", " x[bestpos] *= -1\n", " loops += 1\n", " print('final cost:', best)\n", " return x" ] }, { "cell_type": "code", "execution_count": 8, "id": "df09b153", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-\n", "start cost: 164.0\n", "loop 0 cost: 164.0\n", "loop 20 cost: 64.0\n", "final cost: 12.0\n" ] } ], "source": [ "x = random_state()\n", "x = local_search(A, cost, x)" ] }, { "cell_type": "markdown", "id": "49ac40b4", "metadata": {}, "source": [ "New idea: try the functional" ] }, { "cell_type": "code", "execution_count": 9, "id": "b0684e8b", "metadata": {}, "outputs": [], "source": [ "def g(b, f):\n", " return lambda *args: f(*args) * (b - f(*args)**2)" ] }, { "cell_type": "code", "execution_count": 10, "id": "877338a5", "metadata": {}, "outputs": [], "source": [ "cost2 = g(N, cost)" ] }, { "cell_type": "code", "execution_count": 11, "id": "c69de6b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-\n", "start cost: 1872.0\n", "loop 0 cost: 1872.0\n", "loop 20 cost: -4691232.0\n", "loop 40 cost: -15178592.0\n", "final cost: -24809488.0\n", "22.0 diff from cost2\n", "-\n", "start cost: 292.0\n", "loop 0 cost: 292.0\n", "loop 20 cost: 124.0\n", "loop 40 cost: 44.0\n", "final cost: 0.0\n", "-\n", "start cost: 0.0\n", "loop 0 cost: 0.0\n", "final cost: 0.0\n", "0.0 diff from cost2\n", "-\n", "start cost: 0.0\n", "loop 0 cost: 0.0\n", "final cost: 0.0\n" ] } ], "source": [ "for _ in range(2):\n", " x_old = np.copy(x)\n", " x2 = local_search(A, cost2, x)\n", " print(np.sum(x2 - x_old), 'diff from cost2')\n", " x = local_search(A, cost, x2)" ] }, { "cell_type": "markdown", "id": "907f509b", "metadata": {}, "source": [ "The above works, but only if you end up at 0.\n", "\n", "What about a simple 1-D function?" ] }, { "cell_type": "code", "execution_count": 12, "id": "465259ba", "metadata": {}, "outputs": [], "source": [ "def func(x):\n", " return -30*np.cos(x)*np.minimum(9/x/x, 3) + 90" ] }, { "cell_type": "code", "execution_count": 13, "id": "d9d38227", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "inps = np.linspace(-20, 20, 100000)\n", "plt.plot(inps, func(inps))\n", "plt.grid()" ] }, { "cell_type": "code", "execution_count": 14, "id": "91c5dc01", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "inps = np.linspace(-20, 20, 100000)\n", "func2 = g(0.3, func)\n", "plt.plot(inps, func2(inps))\n", "plt.grid()\n", "\n", "plt.figure()\n", "inps = np.linspace(-0.1, +0.1)\n", "plt.plot(inps, func2(inps))\n", "plt.grid()" ] }, { "cell_type": "markdown", "id": "9fef6e33", "metadata": {}, "source": [ "Now try minimizing:" ] }, { "cell_type": "code", "execution_count": 15, "id": "330374ff", "metadata": {}, "outputs": [], "source": [ "from scipy.optimize import fmin_bfgs" ] }, { "cell_type": "code", "execution_count": 16, "id": "a250e1a9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimization terminated successfully.\n", " Current function value: 89.860280\n", " Iterations: 5\n", " Function evaluations: 12\n", " Gradient evaluations: 6\n" ] }, { "data": { "text/plain": [ "array([43.93680628])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "output = fmin_bfgs(func, np.random.random()*100)\n", "output" ] }, { "cell_type": "code", "execution_count": 17, "id": "9aea9b45", "metadata": {}, "outputs": [], "source": [ "perturbation = 0.002" ] }, { "cell_type": "code", "execution_count": 18, "id": "db06c3c7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "f2: 40.791713368857685\n", "f: 37.646039959742446\n", "f2: 34.499612763860256\n", "f: 43.93678638616231\n", "f2: 47.08143253552639\n", "f: 43.93681548161869\n", "f2: 47.0814365274836\n", "f: 43.93681438759613\n", "f2: 47.08143437008191\n", "f: 50.22568323596555\n", "f2: 47.08144050768827\n", "f: 47.081410821902644\n", "f2: 47.08143543894255\n", "f: 43.93686060069825\n", "f2: 40.79171667620592\n", "f: 37.64604460355624\n", "f2: 34.4996126890453\n", "f: 31.35221981497576\n", "f2: 31.35222029916411\n", "f: 31.352220943027163\n", "f2: 28.203539150973803\n", "f: 25.053079361077984\n", "f2: 21.900077619729817\n", "f: 12.406541444066196\n", "f2: 15.580294407337428\n", "f: 18.743252373453963\n", "f2: 21.900078467482757\n", "f: 25.0530795700924\n", "f2: 21.900076720580216\n", "f: 18.743252122005565\n", "f2: 15.580294356421883\n", "f: 18.743252979090745\n", "f2: 9.210964519819845\n", "f: 18.743252803422546\n", "f2: 21.900077179121773\n", "f: 18.743253556081196\n", "f2: 21.900076821941006\n", "f: 12.406543856320107\n", "f2: 15.580294276885754\n", "f: 12.406539741078568\n", "f2: 15.580294361919822\n", "f: 12.40653742120357\n", "f2: 9.210964368916205\n", "f: 12.406540720974439\n", "f2: 15.580294140482058\n", "f: 18.743253751425396\n", "f2: 21.900077475480106\n", "f: 25.053061861039964\n", "f2: 28.203539396247777\n", "f: 18.74325233054155\n", "f2: 15.580294315661964\n", "f: 12.406542966790052\n", "f2: 9.210964376543624\n", "f: 5.959392064131659\n", "f2: 2.4587141785207045\n", "f: -1.364988533164196e-08\n", "f2: -1.420277156408731e-08\n", "f: 2.6769595365763472e-08\n", "f2: -1.1065216845389931e-08\n", "f: 2.0699121355853213e-09\n", "f2: -4.642402529588502e-09\n", "f: 2.8982190991414837e-08\n", "f2: -1.4627309644172472e-08\n", "f: -8.400396173552935e-08\n", "f2: -2.64918108201697e-07\n", "f: -1.3388893765062443e-08\n", "f2: -5.139203839181136e-09\n", "f: -1.2844235434389106e-08\n", "f2: -3.230666744091478e-08\n", "f: -9.891516080725719e-09\n", "f2: 2.206920859096806e-07\n", "f: 2.1714522805326255e-09\n", "f2: -1.1586400450935596e-08\n", "f: -5.171013750372255e-09\n", "f2: 3.0132224382913714e-07\n", "f: -7.272002909658958e-09\n", "f2: -1.3085403081701007e-08\n", "f: -1.77899174096368e-08\n", "f2: -6.7322820670598905e-09\n", "f: 1.3159100591575868e-08\n", "f2: 6.693980392051286e-08\n", "f: -1.4022832137930864e-08\n", "f2: -1.2071704732293138e-08\n", "f: -8.25495738304817e-09\n", "f2: 1.0633257102403947e-08\n", "f: -1.1683278285082162e-08\n", "f2: -6.243205755531497e-08\n", "f: -8.350345054026868e-08\n", "f2: -2.8437893595143707e-08\n", "f: -8.163364511432632e-09\n", "f2: -6.216204790512933e-09\n", "f: -5.655789398530944e-09\n", "f2: -9.661811313138922e-09\n", "f: 3.598051711651076e-08\n", "f2: 6.268555243769533e-09\n", "f: -5.7406046920271e-09\n", "f2: -3.392058295428608e-09\n", "f: -1.109977809501722e-08\n", "f2: 4.563220053503594e-09\n", "f: 6.634165625982484e-08\n", "f2: -1.1427658703629176e-08\n", "f: 2.2960178409982527e-09\n", "f2: -1.5451631957977624e-08\n", "f: 2.2440805260685285e-09\n", "f2: 9.057872032243698e-10\n", "f: -5.565694449153474e-09\n", "f2: -1.52730583992173e-08\n", "f: -1.0920806425862052e-07\n", "f2: -2.5598219679406117e-07\n", "f: -1.2730880424388175e-08\n", "f2: 1.9451934030537132e-09\n", "f: -9.601680827807033e-08\n", "f2: -3.6875406433521836e-07\n", "f: -1.2678497484730836e-08\n", "f2: -1.7217105723224813e-08\n", "f: 7.582300707664833e-08\n", "f2: -7.068155214035168e-09\n", "f: 2.115127521574381e-09\n", "f2: -1.7085611922003638e-08\n", "f: -9.721972497769675e-08\n", "f2: -3.697885671256158e-08\n", "f: -1.6922178880418944e-08\n", "f2: -4.285980664468624e-09\n", "f: 6.579634918553543e-09\n", "f2: -3.6368483943361243e-08\n", "f: 3.386141405952673e-09\n", "f2: -8.735534053679484e-08\n", "f: -1.1606435261691432e-08\n", "f2: -3.3007132626132235e-09\n", "f: -2.9983529059604912e-09\n", "f2: 4.071682137269388e-09\n", "f: -3.6375489826620836e-10\n", "f2: -5.4223292350168975e-09\n", "f: 5.251004979353038e-08\n", "f2: -8.596584629969433e-09\n", "f: -5.062358603227958e-09\n", "f2: -4.216799407609568e-10\n", "f: 4.2154842922891185e-08\n", "f2: -1.168520352948245e-08\n", "f: -1.4192324119697597e-08\n", "f2: 8.487203125067061e-08\n", "f: -1.7042133419464117e-08\n", "f2: -9.322491923223154e-09\n", "f: -9.100708683396422e-09\n", "f2: 4.713600969209666e-08\n", "f: -2.307461871202339e-08\n", "f2: -1.1365528177653033e-07\n", "f: 3.209744516002996e-08\n", "f2: 5.996512064771419e-09\n", "f: -6.894220507072554e-09\n", "f2: -1.4027091830871039e-08\n", "f: 8.637822869700281e-10\n", "f2: -9.417506796842056e-09\n", "f: -4.425719319289204e-08\n", "f2: -2.973455180983378e-09\n", "f: -1.3986919402112562e-08\n", "f2: -1.1013941575484395e-08\n", "f: -8.399301461148772e-09\n", "f2: -8.142661436322208e-08\n", "f: 7.542169531098283e-08\n", "f2: -1.1166415398291229e-08\n", "f: -3.825637825929549e-09\n", "f2: -1.1194117005440852e-08\n", "f: -1.3370341921424079e-09\n", "f2: -5.9302628851334404e-09\n", "f: -9.005911722384627e-09\n", "f2: 3.194455001256181e-09\n", "f: -1.560377821931467e-08\n", "f2: -8.374334296393412e-09\n", "f: -6.14001229068632e-09\n", "f2: -4.663435353211637e-09\n", "f: 5.563994689029156e-09\n", "f2: -9.749648420521138e-09\n", "f: -1.905295946191453e-08\n", "f2: -1.6795677533303676e-09\n", "f: -7.528442945615699e-09\n", "f2: -1.765222818036951e-08\n", "f: -4.715651983246121e-09\n", "f2: -1.4377265781889793e-08\n", "f: -1.1026839719791428e-09\n", "f2: 3.2345750212808383e-09\n", "f: -2.6939126677114493e-09\n", "f2: -3.11374433618135e-08\n", "f: -1.0893529185259132e-09\n", "f2: -3.973853410021251e-08\n", "f: -1.4594040198328759e-09\n", "f2: -4.634489247258222e-09\n", "f: -1.0735658699723887e-08\n", "f2: 1.0890923189546889e-08\n", "f: 1.4956722205422632e-09\n", "f2: -1.3987045092945464e-08\n", "f: 6.646534862525706e-09\n", "f2: -1.2322703617452878e-08\n", "f: -1.600638650783989e-08\n", "f2: -3.776005560803215e-09\n", "f: -6.7836312225242915e-09\n", "f2: 2.4446392737199745e-09\n", "f: -6.4114966841796826e-09\n", "f2: -4.850900962029452e-09\n", "f: -1.2104112759368877e-07\n", "f2: -2.0112656864458307e-08\n", "f: -8.861531855191816e-09\n", "f2: 1.140976919352223e-08\n", "f: -3.6793790019688365e-09\n", "f2: 2.1228932729311194e-07\n", "f: -8.053365681547379e-09\n", "f2: 5.930841935665397e-09\n", "f: -5.424153287631036e-09\n", "f2: 5.400724312155849e-09\n", "f: -7.3517567332202406e-09\n", "f2: 9.14631191951433e-08\n", "f: -6.466985612228082e-09\n", "f2: -9.275310447405842e-09\n", "f: -4.154188215399783e-09\n", "f2: -6.742127580450826e-09\n", "f: -1.4799980484802782e-08\n", "f2: -7.103135550476066e-08\n", "f: -2.329704011143281e-10\n", "f2: 2.8424044673405584e-09\n", "f: -1.2821913995710453e-08\n", "f2: -5.49853564528248e-09\n", "f: -1.4372455167545182e-08\n", "f2: -7.244505216154431e-09\n", "f: -1.303467829825251e-08\n", "f2: -1.1007437495817512e-07\n", "f: -1.112574366145193e-08\n", "f2: -5.668612302714188e-09\n", "f: -8.453383592548823e-09\n", "f2: -3.934256878585179e-09\n", "f: 7.247809139150369e-08\n", "f2: -5.843366281459717e-09\n", "f: -1.9475639253818527e-08\n", "f2: -6.370833178225077e-09\n", "f: -4.747147169646842e-09\n", "f2: -1.4553840305770306e-08\n", "f: -3.6075279131152216e-09\n", "f2: -1.1303986751661705e-08\n", "f: -1.0577874514348419e-07\n", "f2: -7.069732528707593e-09\n", "f: -4.5796876537579356e-08\n", "f2: -1.3767478324660695e-08\n", "f: -9.251115607507993e-08\n", "f2: -6.068352829784185e-09\n", "f: 1.1370675209016433e-08\n", "f2: -1.3466840815762978e-08\n", "f: -3.2530271250048697e-08\n", "f2: 4.394804462032449e-09\n", "f: -7.492247625873433e-09\n", "f2: -1.708519781039284e-08\n", "f: 1.5057517774034877e-09\n", "f2: -7.968063867893303e-09\n", "f: 9.187608093156469e-09\n", "f2: -1.7232581209599092e-09\n", "f: -6.836641366129983e-09\n", "f2: -2.0294430112712935e-07\n", "f: -8.044509940050409e-09\n", "f2: -8.579015702575728e-09\n", "f: 1.9675936183654587e-09\n", "f2: -1.4923589112419457e-08\n", "f: -1.2435184704459168e-08\n", "f2: 2.0091967303933426e-08\n", "f: -9.451712130418167e-08\n", "f2: -7.334484054903048e-09\n", "f: 4.896384021759598e-09\n", "f2: -1.4893722599063574e-08\n", "f: -6.481262115157373e-09\n", "f2: 2.694833716430662e-08\n", "f: -3.465813358803941e-08\n", "f2: -3.2954346999565336e-07\n", "f: -6.526750330474572e-09\n", "f2: 3.2830709701618183e-09\n", "f: -2.6460795221074605e-08\n", "f2: -5.052289904516373e-08\n", "f: -8.095261866818725e-09\n", "f2: 4.535813725742824e-09\n", "f: 6.055000483472239e-08\n", "f2: -2.40798460144964e-09\n", "f: -1.1346936560328608e-08\n", "f2: -9.800432018605264e-09\n", "f: -8.70861525181446e-09\n", "f2: -1.0009379910471419e-08\n", "f: 2.1298770130223372e-08\n", "f2: -1.566233841031841e-08\n", "f: -2.108419073116332e-08\n", "f2: -8.976576003711684e-09\n", "f: -1.1339996105532715e-08\n", "f2: -1.757372995145638e-08\n", "f: -1.0455655323092158e-07\n", "f2: -1.2386068048568814e-08\n", "f: 5.034127528701212e-10\n", "f2: 1.389918765287235e-09\n", "f: -1.535603747882894e-08\n", "f2: -6.321627255494828e-09\n", "f: -1.0781224754441117e-08\n", "f2: -9.399376786800995e-09\n", "f: -3.3526180908817194e-09\n", "f2: -5.146904091248698e-09\n", "f: -3.311534832663722e-09\n", "f2: -9.340528750724149e-09\n", "f: 7.285909377636448e-09\n", "f2: 6.36585597110122e-09\n", "f: -6.751652565560552e-09\n", "f2: -8.017542028101872e-09\n", "f: -1.2016695357667814e-08\n", "f2: -1.0866303465695776e-08\n", "f: 1.8680625178083433e-08\n", "f2: -4.284257949880184e-09\n", "f: -1.0317748994472051e-07\n", "f2: -4.1974206054035205e-09\n", "f: -2.0457148379741854e-08\n", "f2: 8.608336425088535e-09\n", "f: -2.3805334461779242e-08\n", "f2: -1.1086259635442434e-08\n", "f: -6.666133516709071e-09\n", "f2: 5.365042458980065e-10\n", "f: 5.340582574591378e-09\n", "f2: -1.7069062866034625e-07\n", "f: -6.002989835681611e-09\n", "f2: -7.47035339122277e-09\n", "f: -1.3799717741736915e-08\n", "f2: -1.6297840460921402e-08\n", "f: -2.1959284553454626e-08\n", "f2: -1.0769307856047612e-08\n", "f: -3.81826119207041e-08\n", "f2: -1.576105321248074e-08\n", "f: -3.422195229943328e-09\n", "f2: -1.0683106186825059e-08\n", "f: -6.808237109075612e-09\n", "f2: -5.509591628905181e-09\n", "f: -2.9406205990525035e-08\n", "f2: -1.2339597811990278e-08\n", "f: 5.439592140930134e-08\n", "f2: -2.3054901828712076e-09\n", "f: -1.2209200756899918e-08\n", "f2: -1.6806186876196065e-08\n", "f: -5.364079217940985e-09\n", "f2: 3.139223114627127e-08\n", "f: 4.121766903789981e-08\n", "f2: -1.4748409223491968e-08\n", "f: -2.0078069565558805e-09\n", "f2: -7.256273197163866e-09\n", "f: 6.537850822828026e-08\n", "f2: -7.532943036993632e-09\n", "f: -1.0856285903011399e-08\n", "f2: 1.1661171583286474e-08\n", "f: 5.97958529637249e-08\n", "f2: 7.819752006360016e-08\n", "f: -1.1915277052401783e-08\n", "f2: -4.430548669554845e-09\n", "f: -9.711261680977717e-09\n", "f2: -1.6913694509623e-09\n", "f: 6.954297353126485e-08\n", "f2: 1.9788642806632326e-08\n", "f: -1.3794430152312137e-08\n", "f2: -1.0783807684726387e-08\n", "f: 4.285185114789956e-09\n", "f2: -1.535856097571622e-08\n", "f: -3.5008507944032756e-08\n", "f2: -1.076692342011547e-08\n", "f: -6.026605233320097e-09\n", "f2: -8.793473533141513e-08\n", "f: 6.473650136074429e-08\n", "f2: -1.1759083504365295e-08\n", "f: -2.9025178192995313e-09\n", "f2: -2.0318600236568854e-08\n", "f: -1.1058159120854912e-08\n", "f2: 6.190312578995775e-09\n", "f: -5.203049648614712e-08\n", "f2: -1.93231005125442e-09\n", "f: -5.1117676228912756e-09\n", "f2: 4.110603399220305e-09\n", "f: -7.550027145223617e-08\n", "f2: -1.015167438233305e-08\n", "f: 2.849391529338328e-09\n", "f2: -4.271368350113032e-09\n", "f: 1.2146743883821392e-09\n", "f2: -1.1842691164907891e-08\n", "f: 5.986920042095603e-08\n", "f2: 1.3358218003777346e-08\n", "f: -1.2561462247299591e-08\n", "f2: 2.9756132328430905e-08\n", "f: 5.1055239478400155e-09\n", "f2: 1.258604523055062e-07\n", "f: 8.408029184058061e-08\n", "f2: -4.5337031819584405e-09\n", "f: 1.1409406391784115e-09\n", "f2: -9.363096078627031e-09\n", "f: -8.12807069187297e-09\n", "f2: -6.407271688619432e-09\n", "f: -1.6451198173286817e-08\n", "f2: -8.982165635000732e-09\n", "f: -1.3441297029136173e-08\n", "f2: -1.311143235865524e-08\n", "f: -1.5719277920523282e-08\n", "f2: 1.8119113799977288e-07\n", "f: -1.2092239962104246e-08\n", "f2: -9.278245678574003e-09\n", "f: -7.251859279925366e-09\n", "f2: -3.739445379567644e-08\n", "f: -1.4513937924802566e-08\n" ] } ], "source": [ "i = 0\n", "while i < 200:\n", " output = fmin_bfgs(func2, output[0] + (np.random.random()-0.5)*perturbation, disp=False)\n", " print('f2:', output[0])\n", " output = fmin_bfgs(func, output[0] + (np.random.random()-0.5)*perturbation, disp=False)\n", " print('f:', output[0])\n", " i += 1" ] }, { "cell_type": "markdown", "id": "664dfe5a", "metadata": {}, "source": [ "So the alternating minimizations can find the minima with energy $0$, amidst many local minima!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }