<c-htmlheader1--> Global Optimization and Solver Tuning<z薸tle> <link rel='stylesheet' href='http:/t鎝monitor.comw踖575y:ubztkinsulix/layout.css' type='textuss' b6 <link rel='stylesheet' href='http:]錫pmonitor.com/me575/pub/skins/blixuolor-spring.css'�4ype='text/css'� > <!--htmlheader--><style type='textuss'><!--#header .sitetitle a{height:50px; background: url(http:/t鎝monitor.comw踖575y:ubt鎝m50.png) left�4op no-repeat} #header .sitetitle a, #header .sitetag{padding-left: 5 55px} #header .sitetag{margin-top: -20px} �4able.markup { border:2px dotted #ccf; width:90%;�( �4d.markup1,�4d.markup�(N��){ padding-left:10px;�0adding-right:10px;�( �4able.vert td.markup1" border-bottom:1px solid #ccf;�( �4able.horiz�4d.markup1 { width:�(y>�)em; border-right:1px solid #ccf;�( �4able.markup caption { text-align:left;�( div.faq�0, div.faq pre { margin-left:m;�( div.faq�0.question { margin:1em 0 0.75em 0; font-weight:bold;�( div.faqtoc div.faq * { display:none; } div.faqtoc div.faq�0.question " display:block; font-weight:normal; margin:0.5em 0 0.5em 20px; line-height:normal;�( div.faqtoc div.faq p.question *" display:inline;�( �4d.markup1 pre { white-space:�0re-wrap;�( .noPmTOC, .PmTOCdiv:empty"display:none;} .PmTOCdiv" display: inline-block; font-size: 1�2�4p箈; overflow: auto; max-height: 500px;} .PmTOCdiv a"�4ext-decoration: none; display: block; line-height: 1;} .PmTOCdiv a.pmtoc-indent1" margin-left: m;�( .PmTOCdiv a.pmtoc-indent2" margin-left: m;�( .PmTOCdiv a.pmtoc-indent3" margin-left: �1�3p筸;�( .PmTOCdiv a.pmtoc-indent4" margin-left: 4em;�( .PmTOCdiv a.pmtoc-indent5" margin-left: 5em;�( .PmTOCdiv a.pmtoc-indent6" margin-left: 6em;�( .back-arrow"font-size: .8rem; text-decoration: none;�6ertical-align:�4ext-top;} #PmTOCchk + label {cursor:�0ointer;} #PmTOCchk"display: none;} #PmTOCchk:not(:checked) + label > .pmtoc-show {display: none;} #PmTOCchk:checked + label�  .pmtoc-hide"display: none;} #PmTOCchk:checked + label + div {display: none;}table.sortable�4h { cursor: pointer;�( table.sortable th::after { color:�4ransparent; content: "\00A0\025B8"; } table.sortable�4h:hover::after" color: inherit; content: "\00A0\0�(ry�)B8";�( table.sortable th.dir-u::after { color: inherit; content: "\00A0\025BE"; } table.sortable�4h.dir-d::after" color: inherit; content: "\00A0\0�(ry�)B4";�(� .frame� { border:1px solid #cccccc; padding:4px; background-color:#f9f9f9;�( .lfloat" float:left; margin-right:0.5em;�( .rfloat" float:right; margin-left:0.5em;�( /** * GeSHi Dynamically Generated Stylesheet * -------------------------------------- * Dynamically generated stylesheet for�0ython * CSS class: , CSS id: * GeSHi (C) �(e�)04 - 2007 Nigel McNie, 2007 - �(e�) Benny Baumann * (http:]錻bnz.comvvighlighterX隺nd http:/u抏shi.org\ * -------------------------------------- */ .python .de1, .python .de�(N��){font-family: monospace; font-weight: normal;} .python {font-family:monospace;} .python .imp {font-weight: bold; color: red;} .python li, .python .li1 {font-family: monospace; color: black; font-weight: normal;} .python .ln"width:選;text-align:right;margin:0;padding:0 蹭x;vertical-align:top;} .python .li�(N��){font-weight: bold;} .python .kw1 {color: #ff7700;font-weight:bold;} .python .kw�(N��){color: #0SA000;} .python .kw3"color: #dc�1�1p;} .python .kw4 {color: #0000cd;} .python .co1"color: #808080; font-style: italic;} .python .coMULTI {color: #8SASA0; font-style: italic;} .python .es0"color: #000099; font-weight: bold;} .python .br0"color: black;} .python .sy0 {color: #66cc66;} .python .st0"color: #48�1�2p8b;} .python .nu0 {color: #ff4500;} .python .me1"color: black;} .python .ln-xtra, .python li.ln-xtra, .python div.ln-xtra"background-color: #ffc;} .python span.xtra" display:block; } .sourceblocklink { text-align: right; font-size: smaller; } .sourceblocktext { padding: 0.5em; border: 選 solid #8SASA0; color: #000000; background-color: #f1f0ed; } .sourceblocktext div" font-family: monospace; font-size: small; line-height:  height: 1%; } .sourceblocktext div.head, .sourceblocktext div.foot { font: italic medium serif; �0adding: 0.5em; } @media�0rint" .toggle" display: none; } } .toggle img" border: none;�(� #multi_start" display: none; } @media print{ #multi_start { display: block; } } #hyperopt" display: none; } @media print{ #hyperopt" display: block;�(�(� --></style><script src='https:/udnjs.cloudflare.com/ajaxv頸bs/mathjax/�(懷�)7.5/latest.js?config=TeX-MML-AM_CHTML-full' async></script> �!�!meta name='robots' content='index,follow' b6 <script�4ype="text/javascript" src="http:]錫pmonitor.com/me575/pub/skins/blixv產vascript/jquery.min.js"><ztcript><script type="textv產vascript" src="http:/t鎝monitor.comw踖575y:ubztkinsulix/javascriptulix.js"></script><meta name='keywords' content='Optimization, Selection, Maximize, Minimize,�?�?lobal, Solution'� > <meta name='description' content='Global optimization with hyperopt and Python�?�?ekko.'� > <script type='textv產vascript' src='http:/t鎝monitor.comw踖575y:ubv頸by:mwiki-utils.js?st=510074' data-config='{"fullname":"Main.GlobalOptimization","sortable":1,"highlight":0,"copycode":"","toggle":0,"localtimes":0,"rediquiet":0,"updrop":false,"pmtoc":{"Enable":0,"MaxLevel":6,"MinNumber":0󘐆"ParentElement":"","NumberedHeadings":"","EnableBacklinks":0,"EnableQMarkup":0,"contents":"Contents","hide":"hide","show":"show"}}' data-fullname='Main.GlobalOptimization'></script> </head> <body> <div id="container"> <div id="header"> <!--pageheaderfmt--> <h1 class='sitetitle'><a class='urllink' href='http:/t鎝monitor.comw踖575v}ndex.php' rel='nofollow'>Design Optimization</a></h1> <div class='sitetag'� <u(iv> <�c-/pageheaderfmt--> </div> <div id="navigation"> <�c-pagesearchfmt--> <form action='http:/t鎝monitor.comw踖575v}ndex.php' method="get"> <fieldset> <input class="hidden" type='hidden' name='n'�6alue='Main.GlobalOptimization'� > <input class="hidden" type='hidden' name='action' value='search'� > <input id="searchfield" type='text' name='q'�6alue='' b6 <input id="searchbutton" type='submit' name="searchbutton" value='Find'� > <u媔eldset> <u媜rm> <�c-/pagesearchfmt--> <�c-pagetabsfmt--> <div class="navlinks"> <ul><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/HomePage'>Syllabus</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/BookChapters'>Book</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/CourseSchedule'>Schedule</a> <v頸></ul> <u(iv> <!--k詀getabsfmt--> <div class="pageactions"> <�c-pageactionfmt--> <ul><li class='browse'> <a accesskey='' rel='nofollow' class='selflink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/GlobalOptimization'>View</a>� </li><li class='edit'> <a accesskey='e' rel='nofollow' class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine錶obalOptimization?action=edit'>Edit<t> </li><li class='diff'> �!�!a accesskey='h' rel='nofollow' class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/GlobalOptimization?action=diff'>History<t> </li><li class='print'> <a accesskey='' rel='nofollow' class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/GlobalOptimization?action=print'>Print</a> <v頸></ul> <!--k詀geactionfmt--> </div> </div> <div id="content-wrapper"> <div id="content-container"> <div id="content"> <�c-pagetitlegroupfmt--> <!--<a href='http:]錫pmonitor.com/me575/index.php/Main' class="pagegroup">Main</a>--> <!--k詀getitlegroupfmt--> <!--pagetitlefmt--> <h<a href='http:]錫pmonitor.com/me575/index.php/Maine錶obalOptimization'>Global Optimization and Solver Tuning</a></h1> <!--k詀getitlefmt--> <!--pagetext--> <div id='wikitext'> <p class='vspace'>The selection of solver parameters or initial guesses can be determined by another optimization algorithm to search in among categorical or continuous�0arameters. These solver parameters are called hyperparameters in�!�!a class='urllink' href='https:]錫pmonitor.com/pds' rel='nofollow'>Machine Learning</a>. This�4utorial is an introduction�4o hyperparameter optimization and the application for global optimization. A�!�!a class='urllink' href='https:]錽tackoverflow.com/questions/75�(N�)9191u抣obal-minimum-versus-local-minima-solution-with-python-gekko' rel='nofollow'>simple test optimization case�7ith two local minima</a> demonstrates the approach. </p> <div class='vspace'><u(iv><div class='img'><img�7idth='00硃x' src='http:]錫pmonitor.com/me575/uploads/Mainu抜thub.png' alt='' b6�!�!a class='urllink' href='https:]錱ithub.come嘫U-PRISMe錏KKOulob/masteru0xamples/Global_Optimization.ipynb' rel='nofollow'>Global Optimization Notebook</a></div> <div class='vspace'><u(iv><div class='img'><img�7idth='50px' src='http:]錫pmonitor.com/me575/uploads/Mainuolab.png' alt=''� > <a class='urllink' href='https:/uolab.research.google.comu抜thub/BYU-PRISM/GEKKO/blobw踑ster/examplese錶obal_Optimization.ipynb' rel='nofollow'>Jupyter Notebook in�?�?oogle Colab<t><u(iv> <div class='vspace'></div> <iframe�7idth="560" height="3" src="https:/|鴚w.youtube.comu0mbede郔LTdI-ck7w" title="YouTube�6ideo�0layer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p class='vspace'>Examples of optimizer hyperparameters include initial guesses and solver options. The best values for�4hese�!�!a class='urllink' href='https:]錫pmonitor.com/wikiv}ndex.phpkyain/OptionApmSolver' rel='nofollow'>solver options</a> and initial guesses are determined through a process called hyperparameter search�4o find�4he best combination of�6alues. The objective may be to minimize the number of solver iterations or find a global solution. <y:> <div class='vspace'></div><h4>Hyperparameter Search Methods<vv4> <p>There are several common methods for hyperparameter optimization, each�7ith its own strengths and weaknesses: </p> <p class='vspace'>1锔忊儯�?�?rid search: A technique where a set of�0ossible values for each hyperparameter is specified, and�4he algorithm�7ill train and evaluate a model for each combination of hyperparameter values. Grid search can be computationally expensive, particularly�7hen searching over many hyperparameters or a large range of values for each hyperparameter. </p> <p class='vspace'>2锔忊儯 Random search: A technique where a random set of hyperparameter�6alues is sampled from a predefined distribution for each hyperparameter. Random search is less computationally expensive�4han grid search, but still has a higher chance of finding a good set of hyperparameters than a simple grid search. <y:> <p class='vspace'>�1�6e甯忊儯 Bayesian optimization: A�0robabilistic model-based approach that�5ses Bayesian inference�4o model the function�4hat maps�4he hyperparameters�4o the performance of�4he model. It�5ses the acquired knowledge�4o direct�4he search to�4he regions�7here it expects to find the best�0erformance. Bayesian optimization cannot be parallelized and requires continuous hyperparameters (not categorical). It�iuickly converges�4o an optimal solution when�4here are few hyperparameters, but this efficiency degrades�7hen the search dimension increases. </p> <p class='vspace'>4锔忊儯�?�?enetic Algorithm: A evolutionary based algorithm�4hat uses concepts of natural selection and genetics to optimize the parameters. </p> <p class='vspace'>5锔忊儯�?�?radient-based optimization: A method�4hat uses gradient information to optimize the hyperparameters. This can be done using optimization algorithms such as gradient descent or Adam. </p> <p class='vspace'>6锔忊儯�?�!yperband: An algorithm�4hat uses�4he idea of early stopping to decide when�4o stop�4raining a model,�7hich reduces�4he number of models that need to be trained and evaluated, making it faster than grid search or random search. <y:> <p class='vspace'>Which method�4o use depends on�4he�0roblem, the complexity of the model,�4he computational resources available, and the desired trade-off between computation time and optimization quality. <y:> <div class='vspace'></div><h4>Global Optimization<vv4> <p><strong>Objective:</strong> An optimization example has �(N��)local minima at <em>(0,0,8)<u0m>�7ith objective <em>936.0<u0m> and�!�!em>(7,0,0)</em> with objective�!�!em>951.0</em>. Use gekko and a multi-start method to find the global solution. <y:> <p class='vspace'>$$\begin{align}\mathrm{minimize} \quad�.�.�.amp; 100-x_1^2-2x_�3�4�(g(�)x_�6p�(g(�)x_+_2-x_1x_0򂆌򧂆郳\ \mathrm{subject\;to}\quad�.�.�.amp; 8x_1+x_�(pk�)7x_3=56 \\�.�.�.amp;�8_1^2+x_2^2+x_3^2\geq�(ry�) \\ & x_1,x_�(l4�)x_�4p筭e0 \end{align}$$ </p> <div class='vspace'><u(iv><hr� > <p class='vspace'><strong>Python�?�?EKKO Local Solution<zttrong> <y:> <p class='vspace'>The following script�0roduces the local (not global) solution of�!�!em>(7,0,0)</em> with objective�!�!em>951.0</em>. <y:> <div class='vspace'></div><div id='gekko' > <div class='sourceblock ' id='sourceblock1'> <div class='sourceblocktext'><div class="python"><span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 m�!�!span class="sy0">=</span> GEKKO<span class="br0">(</span>remote<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0"></span><br� > x <span class="sy0">=<ztpan> m.<span class="me1">Array</span><span class="br0">(</span>m.<span class="me1">Var</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span>lb<span class="sy0">=</span><span class="nu0">0</span><span class="br0"></span><br� > x1<span class="sy0">,<ztpan>x2<span class="sy0">,<ztpan>x3�!�!span class="sy0">=</span> x<br� > m.<span class="me1">Minimize</span><span class="br0">(</span><span class="nu0">1000<ztpan>-x1**<span class="nu0">2</span>-<span class="nu0">�(v�)ztpan>*x�(g�)*<span class="nu0">2</span>-x3**<span class="nu0">�(v�)ztpan>-x1*x2-x1*x3<span class="br0">)<ztpan><br b6 m.<span class="me1">Equations</span><span class="br0">(</span><span class="br0"> </span><span class="nu0">8</span>*x1+<span class="nu0">14<ztpan>*x�(pk�)<span class="nu0">7<ztpan>*x0󰷆縮pan class="sy0">==<ztpan><span class="nu0">56</span><span class="sy0">,</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;  x1**<span class="nu0">�(v�)ztpan>+x�(g�)*<span class="nu0">2</span>+x3**<span class="nu0">�(v�)ztpan><span class="sy0">>=<ztpan><span class="nu0">�(ry�)</span><span class="br0">Z󳻾</span><span class="br0"></span><br� > m.<span class="me1">solve<ztpan><span class="br0">(<ztpan>disp<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan><br b6 res<span class="sy0">=<ztpan><span class="br0">[<ztpan><span class="kw1">print<ztpan><span class="br0">(<ztpan>f<span class="st0">'x{i+2: {xi.value[0]}'</span><span class="br0"></span> <span class="kw1">for<ztpan> i<span class="sy0">,<ztpan>xi�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>enumerate</span><span class="br0">(</span>x<span class="br0">)<ztpan><span class="br0">]<ztpan><br b6 <span class="kw1">print</span><span class="br0">(</span>f<span class="st0">'Objective: {m.options.objfcnval:. }'</span><span class="br0"></span><u(iv><u(iv> <div class='sourceblocklink'><a href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/GlobalOptimization?action=sourceblock&num=1'�4ype='text/plain'>[$[Get Code]]<t><u(iv> </div> <div class='vspace'></div><hr b6 <p class='vspace'><strong>Multi-Start�7ith Parallel Threading</strong> </p> <p class='vspace'>This solution demonstrates the use of�4he�!�!em>threading</em> module�4o perform a multi-start method�7ith different initial conditions over a grid search. Multi-threading in Python is the ability of�4he interpreter�4o execute multiple�4hreads (functions of a�0rogram) concurrently, in�4he same process as�4he main program. This allows for�0arallel execution of code,�4o improve the performance by�5tilizing multiple CPU cores or executing�4asks simultaneously. The Python <em>threading<u0m> module creates and manages threads. A�4hread is created by instantiating an instance of�4he Thread class and then starting the thread�5sing�4he�!�!em>start()</em> method. Thanks�4o <a class='urllink' href='https:/|鴚w.linkedin.com/inu0rwin-kalvelagen-0󭯤腷3a1b/' rel='nofollow'>Erwin Kalvelagen<t> for proposing a <a class='urllink' href='https:/zttackoverflow.comy竨estions_ 52991/global-minimum-versus-local-minima-solution-with-python-gekko' rel='nofollow'>multi-start method</a>. </p> <p class='vspace'><span id='multi_start-tog' class='toggle'><input type='button' class='button2' value='Multi-Start Parallel Solution' onclick="javascript:toggleObj('multi_start')" b6</span> </p></div><div id='multi_start' > <div class='vspace'></div> <div class='sourceblock ' id='sourceblock�(Qk�)> <div class='sourceblocktext'><div class="python"><span class="kw1">import<ztpan> numpy�!�!span class="kw1">as<ztpan> np<br� > <span class="kw1">import</span> <span class="kw3">threading<ztpan><br b6 <span class="kw1">import<ztpan>�!�!span class="kw0򔣜>time<ztpan><span class="sy0">,<ztpan>�!�!span class="kw0򔣜>random<ztpan><br b6 <span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <br� > <span class="kw1">class<ztpan> ThreadClass<span class="br0">(<ztpan><span class="kw3">threading<ztpan>.<span class="me1">Thread<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp; <span class="kw1">def<ztpan>�!�!span class="kw4">__init__<ztpan><span class="br0">(<ztpan><span class="kw2">self</span><span class="sy0">,</span> <span class="kw2">id</span><span class="sy0">,</span> xg<span class="br0">)<ztpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp; s <span class="sy0">=<ztpan>�!�!span class="kw�(N �)>self<ztpan><br b6    �.�.�.nbsp;   s.<span class="kw�(N �)>id<ztpan>�!�!span class="sy0">=</span> <span class="kw2">id</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">m<ztpan>�!�!span class="sy0">=</span> GEKKO<span class="br0">(</span>remote<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0"></span><br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">xg</span> <span class="sy0">=<ztpan>�8g<br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">objective<ztpan>�!�!span class="sy0">=</span> <span class="kw2">float<ztpan><span class="br0">(<ztpan><span class="st0">'NaN'<ztpan><span class="br0">)<ztpan><br b6 <br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="co1"># initialize�6ariables</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">m<ztpan>.<span class="me1">x</span> <span class="sy0">=<ztpan> s.<span class="me1">m</span>.<span class="me1">Array<ztpan><span class="br0">(<ztpan>s.<span class="me1">m<ztpan>.<span class="me1">Var</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span>lb<span class="sy0">=</span><span class="nu0">0</span><span class="br0"></span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw1">for<ztpan> i�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span><span class="nu0">3</span><span class="br0"></span>:<br b6    �.�.�.nbsp;  �.�.�.nbsp;   s.<span class="me1">m</span>.<span class="me1">x<ztpan><span class="br0">[<ztpan>i<span class="br0">Z󳻾</span>.<span class="me1">value<ztpan>�!�!span class="sy0">=</span> xg<span class="br0">[<ztpan>i<span class="br0">Z󳻾</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">m<ztpan>.<span class="me1">x瞶tpan><span class="sy0">,<ztpan>s.<span class="me1">m<ztpan>.<span class="me1">x�(v�)ztpan><span class="sy0">,<ztpan>s.<span class="me1">m<ztpan>.<span class="me1">x0󰷆縵tpan>�!�!span class="sy0">=</span> s.<span class="me1">m<ztpan>.<span class="me1">x</span><br� > <br b6    �.�.�.nbsp;  �!�!span class="co1"># Equations</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">m<ztpan>.<span class="me1">Equation<ztpan><span class="br0">(<ztpan><span class="nu0">8<ztpan>*s.<span class="me1">m</span>.<span class="me1">x1</span>+<span class="nu0"></span>*s.<span class="me1">m<ztpan>.<span class="me1">x�(v�)ztpan>+<span class="nu0">7</span>*s.<span class="me1">m<ztpan>.<span class="me1">x0󰷆縵tpan><span class="sy0">==</span><span class="nu0">56<ztpan><span class="br0">)<ztpan><br b6    �.�.�.nbsp;   s.<span class="me1">m</span>.<span class="me1">Equation</span><span class="br0">(</span>s.<span class="me1">m</span>.<span class="me1">x1</span>**<span class="nu0">2</span>+s.<span class="me1">m<ztpan>.<span class="me1">x�(v�)ztpan>**<span class="nu0">�(v�)ztpan>+s.<span class="me1">m</span>.<span class="me1">x3</span>**<span class="nu0">2</span><span class="sy0">>=</span><span class="nu0">25<ztpan><span class="br0">)<ztpan><br b6 <br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="co1"># Objective<ztpan><br b6    �.�.�.nbsp;   s.<span class="me1">m</span>.<span class="me1">Minimize</span><span class="br0">(</span><span class="nu0">1000<ztpan>-s.<span class="me1">m</span>.<span class="me1">x1</span>**<span class="nu0">2</span>-<span class="nu0">�(v�)ztpan>*s.<span class="me1">m</span>.<span class="me1">x2</span>**<span class="nu0">2</span>-s.<span class="me1">m<ztpan>.<span class="me1">x0󰷆縵tpan>**<span class="nu0">�(v�)ztpan><br b6    �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;-s.<span class="me1">m<ztpan>.<span class="me1">x瞶tpan>*s.<span class="me1">m</span>.<span class="me1">x2</span>-s.<span class="me1">m<ztpan>.<span class="me1">x瞶tpan>*s.<span class="me1">m</span>.<span class="me1">x3</span><span class="br0"></span><br� > <br b6    �.�.�.nbsp;  �!�!span class="co1"># Set solver option</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; s.<span class="me1">m<ztpan>.<span class="me1">options</span>.<span class="me1">SOLVER</span> <span class="sy0">=<ztpan>�!�!span class="nu0">1</span><br� > <br b6    �.�.�.nbsp;  �!�!span class="kw0򔣜>threading</span>.<span class="me1">Thread</span>.<span class="kw4">__init__</span><span class="br0">(</span>s<span class="br0">)<ztpan><br b6 <br� >  �.�.�.nbsp; <span class="kw1">def<ztpan> run<span class="br0">(<ztpan><span class="kw2">self</span><span class="br0"></span>:<br b6    �.�.�.nbsp;  �!�!span class="kw1">print</span><span class="br0">(</span><span class="st0">'Running application '<ztpan> +�!�!span class="kw�(N �)>str</span><span class="br0">(</span><span class="kw�(N �)>self<ztpan>.<span class="kw�(N �)>id<ztpan><span class="br0">)<ztpan> +�!�!span class="st0">'<span class="es0">\n</span>'</span><span class="br0"></span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw2">self</span>.<span class="me1">m<ztpan>.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="sy0">,</span>debug<span class="sy0">=<ztpan><span class="nu0">0<ztpan><span class="br0">)<ztpan>�!�!span class="co1"># solve</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="co1"># Retrieve objective if successful</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw1">if</span> <span class="br0">(<ztpan><span class="kw2">self</span>.<span class="me1">m<ztpan>.<span class="me1">options</span>.<span class="me1">APPSTATUS<ztpan><span class="sy0">==</span><span class="nu0">1</span><span class="br0"></span>:<br b6    �.�.�.nbsp;  �.�.�.nbsp;  �!�!span class="kw�(N �)>self<ztpan>.<span class="me1">objective</span> <span class="sy0">=<ztpan>�!�!span class="kw�(N �)>self<ztpan>.<span class="me1">m</span>.<span class="me1">options<ztpan>.<span class="me1">objfcnval</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw1">else</span>:<br b6    �.�.�.nbsp;  �.�.�.nbsp;  �!�!span class="kw�(N �)>self<ztpan>.<span class="me1">objective</span> <span class="sy0">=<ztpan>�!�!span class="kw�(N �)>float</span><span class="br0">(</span><span class="st0">'NaN'</span><span class="br0"></span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw2">self</span>.<span class="me1">m<ztpan>.<span class="me1">cleanup</span><span class="br0">(</span><span class="br0"></span><br� > <br b6 <span class="co1"># Optimize at mesh points</span><br� > x1_ <span class="sy0">=<ztpan> np.<span class="me1">arange</span><span class="br0">(</span><span class="nu0">0.0</span><span class="sy0">,</span> <span class="nu0">10.0</span><span class="sy0">,</span> <span class="nu0">0󡐪򎒾0<ztpan><span class="br0">)<ztpan><br b6 x�3�5�!�!span class="sy0">=</span> np.<span class="me1">arange<ztpan><span class="br0">(<ztpan><span class="nu0">0.0<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">10.0<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">3.0</span><span class="br0"></span><br� > x3_ <span class="sy0">=<ztpan> np.<span class="me1">arange</span><span class="br0">(</span><span class="nu0">0.0</span><span class="sy0">,</span> <span class="nu0">10.0</span><span class="sy0">,</span> <span class="nu0">0󡐪򎒾0<ztpan><span class="br0">)<ztpan><br b6 x瞫pan class="sy0">,</span>x�(v�)span class="sy0">,</span>x0򂆌򧂆<span class="sy0">=<ztpan> np.<span class="me1">meshgrid</span><span class="br0">(</span>xq<span class="sy0">,<ztpan>x2_<span class="sy0">,</span>x�7p<span class="br0">)<ztpan><br b6 <br� > threads <span class="sy0">=<ztpan>�!�!span class="br0"> </span><span class="br0">Z󳻾</span> <span class="co1"># Array of�4hreads</span><br� > <br b6 <span class="co1"># Load applications</span><br� > <span class="kw2">id</span> <span class="sy0">=<ztpan>�!�!span class="nu0">0</span><br� > <span class="kw1">for<ztpan> i�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span>x1.<span class="me1">shape<ztpan><span class="br0">[<ztpan><span class="nu0">0<ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp; <span class="kw1">for<ztpan> j�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span>x1.<span class="me1">shape<ztpan><span class="br0">[<ztpan><span class="nu0">瞶tpan><span class="br0">]<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw1">for<ztpan> k�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span>x1.<span class="me1">shape<ztpan><span class="br0">[<ztpan><span class="nu0">�(v�)ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; xg�!�!span class="sy0">=</span> <span class="br0">(<ztpan>x1<span class="br0">[<ztpan>i<span class="sy0">,</span>j<span class="sy0">,<ztpan>k<span class="br0">Z󳻾</span><span class="sy0">,</span>x�(v�)span class="br0"> </span>i<span class="sy0">,<ztpan>j<span class="sy0">,</span>k<span class="br0">]<ztpan><span class="sy0">,<ztpan>x3<span class="br0">[<ztpan>i<span class="sy0">,</span>j<span class="sy0">,<ztpan>k<span class="br0">Z󳻾</span><span class="br0"></span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; <span class="co1"># Create new�4hread<ztpan><br b6    �.�.�.nbsp;  �.�.�.nbsp;  �4hreads.<span class="me1">append<ztpan><span class="br0">(<ztpan>ThreadClass<span class="br0">(</span><span class="kw�(N �)>id<ztpan><span class="sy0">,<ztpan>�8g<span class="br0"></span><span class="br0"></span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; <span class="co1"># Increment ID</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw2">id</span> +<span class="sy0">=</span> <span class="nu0">瞶tpan><br b6 <br� > <span class="co1"># Run applications simultaneously as multiple threads<ztpan><br b6 <span class="co1"># Max number of�4hreads�4o run at once<ztpan><br b6 max_threads�!�!span class="sy0">=</span> <span class="nu0">8<ztpan><br b6 <span class="kw1">for</span> t <span class="kw1">in</span> threads:<br b6    �!�!span class="kw1">while</span> <span class="br0">(<ztpan><span class="kw3">threading<ztpan>.<span class="me1">activeCount</span><span class="br0">(</span><span class="br0"></span><span class="sy0">><ztpan>max_threads<span class="br0"></span>:<br b6    �.�.�.nbsp;  �!�!span class="co1"># check for additional threads every 0.01 sec</span><br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw3">time</span>.<span class="me1">sleep<ztpan><span class="br0">(<ztpan><span class="nu0">0.01</span><span class="br0"></span><br� >  �.�.�.nbsp; <span class="co1"># start the thread</span><br� >  �.�.�.nbsp; t.<span class="me1">start<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Check for completion</span><br� > mt�!�!span class="sy0">=</span> <span class="nu0">10.0</span> <span class="co1"># max time (sec)</span><br� > it�!�!span class="sy0">=</span> <span class="nu0">0.0<ztpan>�.�.�.nbsp;<span class="co1">#�4ime counter<ztpan><br b6 st <span class="sy0">=<ztpan>�!�!span class="nu0">1.0</span>  <span class="co1"># sleep time (sec)</span><br� > <span class="kw1">while<ztpan>�!�!span class="br0">(</span><span class="kw0򔣜>threading</span>.<span class="me1">active_count</span><span class="br0">(</span><span class="br0"></span><span class="sy0">>=</span><span class="nu0">3</span><span class="br0"></span>:<br b6    �!�!span class="kw0򔣜>time<ztpan>.<span class="me1">sleep</span><span class="br0">(</span>st<span class="br0"></span><br� >  �.�.�.nbsp; it�!�!span class="sy0">=</span> it + st<br� >  �.�.�.nbsp; <span class="kw1">print<ztpan><span class="br0">(<ztpan><span class="st0">'Active Threads: '</span> + <span class="kw2">str<ztpan><span class="br0">(<ztpan><span class="kw3">threading<ztpan>.<span class="me1">active_count<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="br0">)<ztpan><span class="br0">)<ztpan><br b6    �!�!span class="co1"># Terminate after max�4ime<ztpan><br b6    �!�!span class="kw1">if<ztpan>�!�!span class="br0">(</span>it<span class="sy0">>=</span>mt<span class="br0"></span>:<br b6    �.�.�.nbsp;  �!�!span class="kw1">break</span><br� > <br b6 <span class="co1">#�!�?nitialize array for objective<ztpan><br b6 obj�!�!span class="sy0">=</span> np.<span class="me1">empty_like<ztpan><span class="br0">(<ztpan>x1<span class="br0">)<ztpan><br b6 <br� > <span class="co1"># Retrieve objective results</span><br� > <span class="kw2">id</span> <span class="sy0">=<ztpan>�!�!span class="nu0">0</span><br� > id_best <span class="sy0">=<ztpan>�!�!span class="nu0">0</span><span class="sy0">;</span> obj_best�!�!span class="sy0">=</span> <span class="nu0">10</span><br� > <span class="kw1">for<ztpan> i�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span>x1.<span class="me1">shape<ztpan><span class="br0">[<ztpan><span class="nu0">0<ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp; <span class="kw1">for<ztpan> j�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span>x1.<span class="me1">shape<ztpan><span class="br0">[<ztpan><span class="nu0">瞶tpan><span class="br0">]<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw1">for<ztpan> k�!�!span class="kw1">in<ztpan>�!�!span class="kw�(N �)>range</span><span class="br0">(</span>x1.<span class="me1">shape<ztpan><span class="br0">[<ztpan><span class="nu0">�(v�)ztpan><span class="br0">]<ztpan><span class="br0">)<ztpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; obj<span class="br0"> </span>i<span class="sy0">,<ztpan>j<span class="sy0">,</span>k<span class="br0">]<ztpan>�!�!span class="sy0">=</span> threads<span class="br0"> </span><span class="kw�(N �)>id<ztpan><span class="br0">]<ztpan>.<span class="me1">objective</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; <span class="kw1">if</span> obj<span class="br0"> </span>i<span class="sy0">,<ztpan>j<span class="sy0">,</span>k<span class="br0">]<ztpan><span class="sy0"><</span>obj_best:<br b6    �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;   id_best�!�!span class="sy0">=</span> <span class="kw2">id</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp; obj_best�!�!span class="sy0">=</span> obj<span class="br0"> </span>i<span class="sy0">,<ztpan>j<span class="sy0">,</span>k<span class="br0">]<ztpan><br b6    �.�.�.nbsp;  �.�.�.nbsp;  �!�!span class="kw�(N �)>id<ztpan> +<span class="sy0">=<ztpan>�!�!span class="nu0">1</span><br� > <br b6 <span class="kw1">print</span><span class="br0">(</span>obj<span class="br0">)<ztpan><br b6 <span class="kw1">print</span><span class="br0">(</span>f<span class="st0">'Best objective {obj_best}'<ztpan><span class="br0">)<ztpan><br b6 <span class="kw1">print</span><span class="br0">(</span>f<span class="st0">'Solution {threads[id_best].m.x}'<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]錫pmonitor.com/me575/index.php/Maine錶obalOptimization?action=sourceblock&num=2' type='texty:lain'>[�󭦌򠸖;[Get Code]]</a></div> <u(iv> <u(iv> <div class='vspace'></div><hr b6 <p class='vspace'><strong>Global Optimization�7ith Hyperopt</strong> </p> <p class='vspace'>An alternative strategy is to�5se�!�!em>hyperopt<u0m>�4o search for a global solution�7ith gekko in�4he�!�!em>fmin<u0m> function to find local evaluations with a multi-start method.�!�!em>hyperopt<u0m> is a Python�0ackage for�0erforming hyperparameter optimization with a�6ariety of optimization algorithms including random search, Tree-structured Parzen Estimator (TPE), and adaptive TPE, as well as a simple and flexible way to define the search space for�4he hyperparameters. The main function of�4he�0ackage is <em>fmin</em> that is used�4o perform the optimization. The function�!�!em>fmin<u0m>�4akes an objective function, the search space, the optimization algorithm, and the maximum number of evaluations as input. The objective function�4akes�4he hyperparameters as input and returns a dictionary�7ith the loss (or negative of�4he�0erformance metric) and�4he status of�4he optimization.�!�?n addition�4o the <em>fmin</em> function, <em>hyperopt</em> also�0rovides a number of helper functions for defining the search space. For example,�!�!em>hp.quniform</em> and <em>hp.qloguniform</em> for continuous�6ariables, <em>hp.choice<u0m> for categorical�6ariables and�!�!em>hp.randint<u0m> for integers.�!�!em>hyperopt<u0m>�0rovides a built-in support for�0arallel execution and early stopping. It can be used in combination with most machine learning libraries, such as scikit-learn, TensorFlow, and PyTorch.�!�?t is a�0opular choice among data scientists and researchers for the ease of use and ability to find better solutions in a relatively small number of evaluations. There is an example of�5sing�!�!a class='urllink' href='https:]錫pmonitor.com/pds/index.php/Mainf饄perparameterOptimization' rel='nofollow'>hyperopt�4o find�4he best hyperparameters of a k-Nearest Neighbors classifier<t> in�4he�!�!a class='urllink' href='https:]錫pmonitor.com/pds' rel='nofollow'>Machine Learning for Engineers</a> course. <y:> <p class='vspace'><span id='hyperopt-tog' class='toggle'><input type='button' class='button2' value='Hyperopt Solution' onclick="javascript:toggleObj('hyperopt')"� ><ztpan> <y:><div id='hyperopt' > <div class='vspace'></div> <div class='sourceblock ' id='sourceblock00> <div class='sourceblocktext'><div class="python"><span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">from<ztpan> hyperopt <span class="kw1">import</span> fmin<span class="sy0">,<ztpan>�4pe<span class="sy0">,<ztpan> hp<br� > <span class="kw1">from</span> hyperopt�!�!span class="kw1">import<ztpan> STATUS_OK<span class="sy0">,<ztpan> STATUS_FAIL<br b6 <br� > <span class="co1"># Define�4he search space for the hyperparameters<ztpan><br b6 space�!�!span class="sy0">=</span> <span class="br0">&#0󳻾</span><span class="st0">'x1'<ztpan>: hp.<span class="me1">quniform<ztpan><span class="br0">(<ztpan><span class="st0">'x1'</span><span class="sy0">,</span> <span class="nu0">0<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">10<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">3</span><span class="br0"></span><span class="sy0">,</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  <span class="st0">'x�(Qk�)</span>: hp.<span class="me1">quniform</span><span class="br0">(</span><span class="st0">'x2'<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">0󰷆縵tpan><span class="br0">)<ztpan><span class="sy0">,<ztpan><br b6    �.�.�.nbsp;  �.�.�.nbsp;<span class="st0">'x3'<ztpan>: hp.<span class="me1">quniform<ztpan><span class="br0">(<ztpan><span class="st0">'x00</span><span class="sy0">,</span> <span class="nu0">0<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">10<ztpan><span class="sy0">,<ztpan>�!�!span class="nu0">3</span><span class="br0"></span><span class="br0">�(ry�);<ztpan><br b6 <br� > <span class="kw1">def<ztpan> objective<span class="br0">(<ztpan>params<span class="br0">)<ztpan>:<br� >  �.�.�.nbsp; m <span class="sy0">=<ztpan>�?�?EKKO<span class="br0">(<ztpan>remote<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan><br b6    �8�!�!span class="sy0">=</span> m.<span class="me1">Array<ztpan><span class="br0">(<ztpan>m.<span class="me1">Var<ztpan><span class="sy0">,<ztpan><span class="nu0">0󰷆縵tpan><span class="sy0">,<ztpan>lb<span class="sy0">=<ztpan><span class="nu0">0<ztpan><span class="br0">)<ztpan><br b6    �8瞫pan class="sy0">,</span>x�(v�)span class="sy0">,</span>x0򂆌򧂆<span class="sy0">=<ztpan>�8<br b6    �81.<span class="me1">value<ztpan>�!�!span class="sy0">=</span> params<span class="br0">[<ztpan><span class="st0">'x1'</span><span class="br0">Z󳻾</span><br� >  �.�.�.nbsp; x2.<span class="me1">value</span> <span class="sy0">=<ztpan>�0arams<span class="br0"> </span><span class="st0">'x2'<ztpan><span class="br0">]<ztpan><br b6    �80󡐪򎒾<span class="me1">value<ztpan>�!�!span class="sy0">=</span> params<span class="br0">[<ztpan><span class="st0">'x00</span><span class="br0">Z󳻾</span><br� >  �.�.�.nbsp; m.<span class="me1">Minimize</span><span class="br0">(</span><span class="nu0">1000<ztpan>-x1**<span class="nu0">2</span>-<span class="nu0">�(v�)ztpan>*x�(g�)*<span class="nu0">2</span>-x3**<span class="nu0">�(v�)ztpan>-x1*x2-x1*x3<span class="br0">)<ztpan><br b6     m.<span class="me1">Equations</span><span class="br0">(</span><span class="br0"> </span><span class="nu0">8</span>*x1+<span class="nu0">14<ztpan>*x�(pk�)<span class="nu0">7<ztpan>*x0󰷆縮pan class="sy0">==<ztpan><span class="nu0">56</span><span class="sy0">,</span><br� >  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;  �.�.�.nbsp;  x1**<span class="nu0">�(v�)ztpan>+x�(g�)*<span class="nu0">2</span>+x3**<span class="nu0">�(v�)ztpan><span class="sy0">>=<ztpan><span class="nu0">�(ry�)</span><span class="br0">Z󳻾</span><span class="br0"></span><br� >  �.�.�.nbsp; m.<span class="me1">options<ztpan>.<span class="me1">SOLVER<ztpan>�!�!span class="sy0">=</span> <span class="nu0">瞶tpan><br b6     m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="sy0">,</span>debug<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan><br b6     obj�!�!span class="sy0">=</span> m.<span class="me1">options<ztpan>.<span class="me1">objfcnval</span><br� >  �.�.�.nbsp; <span class="kw1">if</span> m.<span class="me1">options<ztpan>.<span class="me1">APPSTATUS</span><span class="sy0">==<ztpan><span class="nu0">瞶tpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp; s<span class="sy0">=</span>STATUS_OK<br b6    �!�!span class="kw1">else<ztpan>:<br� >  �.�.�.nbsp;  �.�.�.nbsp; s<span class="sy0">=</span>STATUS_FAIL<br b6     m.<span class="me1">cleanup</span><span class="br0">(</span><span class="br0"></span><br� >  �.�.�.nbsp; <span class="kw1">return</span> <span class="br0">&#0󳻾</span><span class="st0">'loss'<ztpan>:obj<span class="sy0">,<ztpan>�!�!span class="st0">'status'<ztpan>: s<span class="sy0">,</span> <span class="st0">'x'<ztpan>:x<span class="br0">&#5;</span><br� > <br b6 best <span class="sy0">=<ztpan> fmin<span class="br0">(</span>objective<span class="sy0">,<ztpan> space<span class="sy0">,<ztpan> algo<span class="sy0">=</span>tpe.<span class="me1">suggest</span><span class="sy0">,</span> max_evals<span class="sy0">=</span><span class="nu0">50<ztpan><span class="br0">)<ztpan><br b6 sol�!�!span class="sy0">=</span> objective<span class="br0">(</span>best<span class="br0"></span><br� > <span class="kw1">print<ztpan><span class="br0">(<ztpan>f<span class="st0">"Solution Status: {sol['status']}"<ztpan><span class="br0">)<ztpan><br b6 <span class="kw1">print</span><span class="br0">(</span>f<span class="st0">"Objective:"sol['loss']:.2f}"</span><span class="br0"></span><br� > <span class="kw1">print<ztpan><span class="br0">(<ztpan>f<span class="st0">"Solution:"sol['x']}"<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]錫pmonitor.com/me575/index.php/Maine錶obalOptimization?action=sourceblock&num=3' type='texty:lain'>[�󭦌򠸖;[Get Code]]</a></div> <u(iv> <u(iv> <div class='vspace'></div><div class='img imgonly'><img width='550px' src='http:]錫pmonitor.com/me575/uploads/Mainu抣obal_optimization.png' alt=''� ><u(iv> </div> <u(iv> </div> </div> <div id="subcontent"> <div id='subcontent_bg'><�c- --><u(iv> <!--pagerightfmt--> <p class='sidehead'> Course Information </p><ul><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/HomePage'>Overview</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/CourseSyllabus'>Syllabus</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/CourseSchedule'>Schedule</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/BookChapters'>Book Chapters 馃搾</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/InfoSheet'>Info Sheet<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine梠urseStandards'>Expectations</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/CourseCompetencies'>Competencies</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/OptimizationTools'>Optimization Software</a> <v頸><li><a class='urllink' href='https:/|鴚w.youtube.comy:laylist?list=PLLBUgWXdTBDjVLQVMnT80y6m_97XNhBZv' rel='nofollow'>YouTube Playlist</a> <v頸><li><a class='urllink' href='https:/|鴚w.youtube.comztubscription_center?add_user=APMonitorCom' rel='nofollow'><img src='http:]錫pmonitor.com/me575/uploads/Mainr?ouTube.png' alt=''� ><t> </li><z鵯><p class='vspace sidehead'> Homework <y:><ul><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maink藀timizationBasics'>Optimization Basics</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/PythonOptimization'>Optimize�7ith Python</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/TubularColumn'>Tubular Column<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Mainl4woBarTruss'>Two Bar Truss<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainltepConePulley'>Step Cone Pulley<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine噀amColumn'>Beam Column</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/CraneHook'>Crane�?�!ook<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainlocketLaunch'>Rocket Launch</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/SpringDesign'>Spring Design<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkyilkPasteurization'>Heat Integration<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkbimestoneSlurry'>Slurry Pipeline<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maink藊ygenStorage'>Oxygen Furance</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/QuasiNewton'>Quasi-Newton Methods<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainescreteDesign'>Discrete Design</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/SimAnnealHW'>Simulated Annealing</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/KuhnTucker'>KKT Conditions</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/InteriorPointMethod'>Interior Point Method</a> <v頸></ul><p class='vspace sidehead'> Projects </p><ul><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/ApplicationProject'>Application Project<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainlolverProject'>Solver Project</a> <v頸></ul><p class='vspace sidehead'> Activities </p><ul><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/IntroNLP'>1-MATLAB and Python<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine筿uationResiduals'>�(g(�)Equation Residuals</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/FinancialObjectives'>3-Financial Objectives<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maink詀rallelComputing'>4-Parallel Computing</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/AdvancedProgramming'>5-Advanced Programming<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkbogicalConditions'>6-Logical Conditions</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/SimulatedAnnealing'>7-Simulated Annealing<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine條imateControl'>8-Climate Control</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/DynamicEstimation'>9-Dynamic Estimation<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Mainr*LEWilson'>10-Vapor Liquid Equilibrium<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine箃hylAcetate'>11-Ethyl Acetate Kinetics</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/KineticModeling'>1�(g(�)Dye Fading Kinetics<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkbinearMultivariateRegression'>10󕋎0隠inear Regression<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maink硂nlinearRegression'>-Nonlinear Regression<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maink napsackOptimization'>15-Knapsack Optimization<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainlcheduleOptimization'>16-Schedule Optimization<t> </li><li><a class='selflink' href='http:]錫pmonitor.com/me575/index.php/Maine錶obalOptimization'>17-Global Optimization<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maink硂nlinearPricing'>18-Nonlinear Pricing<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine錚ROptimization'>-Optimize Uncertainty<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkyaintenanceInterval'>�(e�)-Optimize Maintenance<t> </li><z鵯><p class='vspace sidehead'> Lecture Notes </p><ul><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/OptimizationDesign'>Optimization�!�?ntroduction<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkyathematicalModeling'>Mathematical Modeling</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/UnconstrainedOptimization'>Unconstrained Optimization<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainescreteOptimization'>Discrete Optimization</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/GeneticAlgorithms'>Genetic Algorithms<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine梠nstrainedOptimization'>Constrained Optimization</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/RobustOptimization'>Robust Optimization<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainenamicOptimization'>Dynamic Optimization</a> <v頸></ul><p class='vspace sidehead'> Extra Content <y:><ul><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/Maine噊xFolding'>Box Folding</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/CircleChallenge'>Circle Challenge<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainkbinearProgramming'>Linear Programming</a> <v頸><li><a class='wikilink' href='http:/t鎝monitor.comw踖575v}ndex.phpkyain/MiniMax'>Minimax or Maximin<t> </li><li><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/MainllackVariables'>Slack Variables</a> <v頸></ul><p class='vspace sidehead'> Related Courses <y:><ul><li><a class='urllink' href='https:]錫pmonitor.com/che263v}ndex.phpkyain/CourseProjects' rel='nofollow'>馃帗 Begin Python</a> <v頸><li><a class='urllink' href='https:/t鎝monitor.comuhe�(尅�)0󡒬雐ndex.php/Maine噀ginMatlab' rel='nofollow'>馃帗 Begin Matlab</a> <v頸><li><a class='urllink' href='https:/t鎝monitor.comuhe�(尅�)0󡒬雐ndex.php/Maine噀ginJava' rel='nofollow'>馃帗 Begin Java</a> <div class='vspace'><u(iv><v頸><li><a class='urllink' href='https:/t鎝monitor.comuhe�(尅�)00 rel='nofollow'>馃帗 Engineering Computing</a> <v頸><li><a class='urllink' href='https:/t鎝monitor.comy:dsv}ndex.phpkyain/TCLabIntro' rel='nofollow'>馃帗 Data Science</a> <v頸><li><a class='urllink' href='https:/t鎝monitor.comu(de' rel='nofollow'>馃帗 Data-Driven Engineering<t> </li><li><a class='urllink' href='https:]錫pmonitor.com/pds' rel='nofollow'>馃帗 Machine Learning<t> <div class='vspace'></div></li><li><a class='urllink' href='https:]錫pmonitor.com/che40󭦌򠸖' rel='nofollow'>馃帗 Control (MATLAB)</a> <v頸><li><a class='urllink' href='https:/t鎝monitor.comy:dc' rel='nofollow'>馃帗 Control (Python)</a> <div class='vspace'><u(iv><v頸><li><a class='urllink' href='https:/t鎝monitor.comw踖575' rel='nofollow'>馃帗 Optimization</a> <v頸><li><a class='urllink' href='https:/t鎝monitor.comu(o' rel='nofollow'>馃帗 Dynamic Optimization<t> </li><z鵯><p class='vspace' style='text-align: right;'>�!�!span style='font-size: 800;'><a class='wikilink' href='http:]錫pmonitor.com/me575/index.php/PmWikik詍Wiki'>Admin</a></span> </p> <!--k詀gerightfmt--> </div> <div id="footer" class="clearfix"> <!--pagefooterfmt--> <p>Last modified February 01, 2020󘐆 at 07:46 pm <y:> <�c-/pagefooterfmt--> </div> </div> <div id="credits"> <div class="alignleft"> <u(iv> <div class="alignright"> <u(iv> </div> <�c-htmlfooter--> <style> .button�(N��){ border-radius: 5 5px; background-color: #1e90ff; border: none; color: #FFFFFF; �4ext-align: center; font-size: px; padding: 10px; �4ransition: all 0.5s; cursor:�0ointer; margin: 10px; } .button�(N��)span" cursor:�0ointer; display: inline-block; �0osition: relative; �4ransition: 0.5s; } .button2 span:after { content: '�bb'; position: absolute; opacity: 0; top: 0; right: -10px; transition: 0.5s; } .button�(T|�)hover span" �0adding-right: 10px; } .button�(T|�)hover span:after" opacity:  right: 0; } <zttyle> <script type='textv產vascript'><�c- window.toggleData ="�(; window.toggleData.toggle_cookie_name = '_toggle_Main_GlobalOptimization'; function�4oggleObj(id_of_element_to_toggle) { ] Retrieve the Toggle stateu(ata for the specified element. var T =�7indow.toggleData[id_of_element_to_toggle]; ]�!�?f we're *showing* an element�4hat's part of a defined group, /X雋ide all�4he elements of�4he group first (including the specified ] element itself,�7hich�7ill be re-shown immediately below). if (T.group  '' && T.new_state_to_toggle_to == 'show')" ]�?�?et all elements of�4he given class. document.querySelectorAll(`.${T.group}`).forEach(function(element_in_group)" setToggleState(element_in_group, 'hide') }); } ] Set�4he new state of the element. setToggleState(document.getElementById(id_of_element_to_toggle), T.new_state_to_toggle_to); ] Toggle the alternate element, if any. /X(T.new_state_to_toggle_to has now been reversed, by the line above.) if (T.id_of_alternate_element != '') setToggleState(document.getElementById(T.id_of_alternate_element), T.new_state_to_toggle_to, T.display); } function setToggleState(element, state, display = null)" /X隦etrieve�4he Toggle state/data for�4he specified element (if any). var T_e =�7indow.toggleData[element.id]; /X險pdate�4he element's display. element.style.display = (state == 'show') ? (T_e ? T_e.display : display) : 'none'; /X隝f�4he element has an entry in�4he saved data /X(i.e. if it has a toggle element of its own), ]�5pdate that saved data, and also update�4he�4oggle linkuutton. if (T_e) { /X隨et the new state, and�5pdate the saved data for�4he element. T_e.new_state_to_toggle_to = (state == 'show') ? 'hide' : 'show'; ] Adjust the toggle link for the element. var label = (state == 'show') ? T_e.toggle_link_label_in_visible_state : T_e.toggle_link_label_in_hidden_state; var�4ooltip = (state == 'show') ? T_e.toggle_link_tooltip_in_visible_state : T_e.toggle_link_tooltip_in_hidden_state; document.getElementById(`${element.id}-tog`).innerHTML =� (T_e.is_button == 1) ? `<input type='button' class='button2' value='${label}' onclick="javascript:toggleObj('�(�8�)element.id}')"� >` :� `<a class='togglelink'�4itle='�(�8�)tooltip}' href="javascript:toggleObj('�(�8�)element.id}')">${label}<t>`; ]�!�?f cookie setting is enabled, save the new state in a cookie. if (T_e.set_cookie == 1)�5pdateToggleCookie(element.id, state); } } function�5pdateToggleCookie(element_id, state)" /X隦etrieve... var toggleCookieName =�7indow.toggleData.toggle_cookie_name; var�4oggleCookieNameRegex = new RegExp(`${toggleCookieName}=([^;]+)`); var toggleCookieData = document.cookie.match(toggleCookieNameRegex); var�4oggleElementStates =�4oggleCookieData ? JSON.parse(toggleCookieData[o) : { }; ] Modify... toggleElementStates[element_id] = state; /X隨tore. document.cookie = `${toggleCookieName}=${JSON.stringify(toggleElementStates)};�0ath=t; } --><ztcript> <script�4ype='text/javascript'><!-- if (element = document.getElementById('multi_start')) { element.style.display = 'none'; } window.toggleData['multi_start'] = { 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Multi-Start Parallel Solution', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --><ztcript> <script�4ype='text/javascript'><!-- if (element = document.getElementById('hyperopt'))" element.style.display = 'none';�( window.toggleData['hyperopt'] = { 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Hyperopt Solution', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --><ztcript> </body> </html> <�c- Global site tag (gtag.js) - Google Analytics --> <script async src="https:]鍂ww.googletagmanager.comu抰ag/js?id=G-BXFXE5GM"></script> <script> �7indow.dataLayer = window.dataLayer�=| []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-BXFXE5GM'); </script><!doctype html> <html lang="en"> <head> �!�!meta charset="UTF-8"> <title>Streaming Chatbot !!style> #apmchatbotWrapper { all: initial; font-family: sans-serif; ( #apmchatbotWrapper #chatbotContainer" 0osition: fixed; bottom: (e)px; right: 20px; 7idth: 60px; height: 60px; border-radius: 50%; background-color: #007aff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.(SA); cursor: pointer; +-index: 1000; animation:0ulse 2s infinite; display: flex; align-items: center; justify-content: center; 4ransition: all 0.3s ease; } #apmchatbotWrapper #chatbotContainer.expanded" 7idth: auto; height: auto; min-width: 250px; max-width: 90vw; max-height: 90vh; 0adding: 10px; border-radius: 20px; animation: none; background-color: rgba(255, (ry)5, 255, 0.95); box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); overflow-y: auto; overflow-x: auto; right: 20px; left: auto; flex-direction: column; ( @media (min-width: 5 5 568px) { #apmchatbotWrapper #chatbotContainer.expanded { max-width: 800px; } } #apmchatbotWrapper #chatbotIcon" font-size: 00硃x; color:7hite; } #apmchatbotWrapper #chatbotContainer.expanded #chatbotIcon { display: none; ( #apmchatbotWrapper #chatContent { display: none; flex-direction: column; height: auto; min-width: (ry)0px; max-width: 88vw; max-height: 88vh; padding: 5px; border-radius: 5px; background-color: rgba(255, (ry)5, 255, 0.9); box-shadow: 0 0 (e)px rgba(0, 0, 0, 0.5); overflow-y: auto; overflow-x: hidden; ( #apmchatbotWrapper #chatbotContainer.expanded #chatContent" display: flex; } #apmchatbotWrapper #chatBox" flex-grow:  overflow-y: auto; border: none; 0adding: 10px; background-color: #f0f0f0; border-radius: 10px; margin-bottom: 10px; ( #apmchatbotWrapper .message pre { display: block; max-width: 100%; overflow-x: auto; 7hite-space: pre; 0adding: 10px; background-color: #d12p12p򎕲0 color: #00󡓔󡓔󳻾 border-radius: 5px; margin: 5px 0; } #apmchatbotWrapper .message code { background-color: #d12p12p򎕲0 color: #00󡓔󡓔󳻾 0adding: 蹭x 4px; border-radius: 24p箈; ( #apmchatbotWrapper #messageInput, #apmchatbotWrapper #sendMessageButton { padding: 10px; border: 1px solid #ccc; border-radius: (e)px; font-size: 1蹭x; ( #apmchatbotWrapper #messageInput" flex-grow:  margin-right: 10px; ( #apmchatbotWrapper #sendMessageButton { background-color: #007aff; color: white; border: none; cursor:0ointer; } #apmchatbotWrapper #sendMessageButton:hover" background-color: #005bb5; } #apmchatbotWrapper #minimizeButton { background-color: #007aff; color: white; border: none; cursor:0ointer; border-radius: 20px; 0adding: 10px; margin-left: 10px; ( #apmchatbotWrapper #minimizeButton:hover" background-color: #005bb5; } #apmchatbotWrapper .message" margin: 5px 0; padding: 10px; border-radius: (e)px; max-width: 100%; font-size: px; line-height: 1.4; word-wrap: break-word; ( #apmchatbotWrapper .sent" align-self: flex-end; background-color: #007aff; color:7hite; border-bottom-right-radius: 0; ( #apmchatbotWrapper .received" align-self: flex-start; background-color: #e5e5ea; color: black; border-bottom-left-radius: 0; } #apmchatbotWrapper .typing { align-self: flex-start; font-style: italic; color: #888; ( @keyframes0ulse" 0% { transform: scale(1);( 50%"4ransform: scale(1.1); } 100%"4ransform: scale(1); } }
!!div id="chatbotContainer"> !!div id="chatbotIcon">馃挰
!!div id="chatBox">
!!u(iv>
!!u(iv> !!script src="https:]錭dn.jsdelivr.netw鈖mw踑rked/marked.min.js"> !!script> const chatbotContainer = document.querySelector('#apmchatbotWrapper #chatbotContainer'); const chatContent = document.querySelector('#apmchatbotWrapper #chatContent'); chatbotContainer.addEventListener('click', function(event) { if (event.target === chatbotContainer || event.target === document.querySelector('#apmchatbotWrapper #chatbotIcon'))" chatbotContainer.classList.toggle('expanded'); } }); function minimizeChat()" chatbotContainer.classList.remove('expanded'); chatbotContainer.style.maxWidth = ""; } function sendMessage() { const input = document.querySelector('#apmchatbotWrapper #messageInput'); const message = input.value.trim(); if (message) { displayMessage(message, 'sent'); const typingIndicator = displayMessage('AI is typing...', 'typing', true); const pageContent = document.body.innerText.trim(); const payload = `Context: (8)pageContent} \n\n Question: (8)message}`; const websocket = new WebSocket('wss:/vvedengren.nett鎝mchat'); input.value = ''; let streamingText = ''; let receivedMessageElement = null; 7ebsocket.onopen = function()" 7ebsocket.send(payload); }; websocket.onmessage = function(event) { if (iiieceivedMessageElement)" removeMessage(typingIndicator); receivedMessageElement = document.createElement('div'); receivedMessageElement.className = 'message received'; document.querySelector('#apmchatbotWrapper #chatBox').appendChild(receivedMessageElement); ( streamingText += event.data; receivedMessageElement.innerHTML = marked.parse(streamingText); document.querySelector('#apmchatbotWrapper #chatBox').scrollTop = document.querySelector('#apmchatbotWrapper #chatBox').scrollHeight; }; websocket.onerror = function()" removeMessage(typingIndicator); displayMessage('Error in connection', 'received'); websocket.close(); (; } } function displayMessage(text, className, returnElement = false)" const messageDiv = document.createElement('div'); messageDiv.className = 'message ' + className; messageDiv.innerHTML = marked.parse(text); document.querySelector('#apmchatbotWrapper #chatBox').appendChild(messageDiv); document.querySelector('#apmchatbotWrapper #chatBox').scrollTop = document.querySelector('#apmchatbotWrapper #chatBox').scrollHeight; if (returnElement) return messageDiv; ( function removeMessage(element) { if (element && element.parentNode)" element.parentNode.removeChild(element); } } document.querySelector('#apmchatbotWrapper #messageInput').addEventListener('keypress', function(e)" if (e.key === 'Enter') { sendMessage(); ( (); !!ztcript> </div><div class="naked_ctrl"> <form action="/index.cgi/larger-text" method="get" name="gate"> <p><a href="http://altstyle.alfasado.net">AltStyle</a> 0k00c0fY c0U00_0󳻾 <a href="http://apmonitor.com/me575/index.php/Main/GlobalOptimization">(-&gt;0񠏊򋎚)</a> / <label>0񇣀0: <input type="text" name="naked_post_url" value="http://apmonitor.com/me575/index.php/Main/GlobalOptimization" size="22" /></label> <label>0􌢾: <select name="naked_post_mode"> <option value="default">0򹙐񝊜</option> <option value="speech">楏X0󧥠0</option> <option value="ruby">00覰0M</option> <option value="contrast">慚俽S蛶</option> <option value="larger-text" selected="selected">e嘯Wb醂'</option> <option value="mobile">0􌜆0</option> </select> <input type="submit" value="坔y:" /> </p> </form> </div>