LaTex 关于优化问题公式排版及算法格式排版例子

宏包

写算法别忘记导入算法的宏包:

\usepackage{algorithm}
\usepackage{algorithmic}

LaTex公式书写

推荐一个LaTex在线公式编辑器,神器非常好用。link

公式对齐

标准单个公式环境

\begin{equation}
...	
\end{equation}

对于优化问题来说,往往优化的约束条件多而复杂时,多个公式如何排列整齐美观对于新手来说就是一个问题,下面从自己碰到的例子来说明这些问题。
当然也有许多其他的进行参考,linklinklink,互相学习互相进步。
优化问题排版往往要求的是min,s.t.对齐且约束最好等号对齐。

aligned

\begin{equation}
\begin{aligned} \label{P}
&\min_{c_{m,j}^{L},c_{i,j}^{V}} \quad \tau_{av}\\
&\begin{array}{r@{\quad}r@{}l@{\quad}l}
s.t. &\sum_{j=1}^{J}c_{i,j}^{V}&\leq S^V \\
     &\sum_{j=1}^{J}c_{m,j}^{L}&\leq S^L\\
     &c_{i,j}^{V}&\in \left \{0,1\right \}\\
     &c_{m,j}^{L}&\in \left \{0,1\right \}\\
\end{array}
\end{aligned}
\end{equation}

效果如下(等号对齐):
min和s.t.还是感觉稍微没对齐的样子

split

如果觉得等号对齐很别扭,也可以试试split:

\begin{equation*}
\begin{split}
&\min_{c_{m,j}^{L},c_{i,j}^{V}} \,\, \tau_{av}\\
&s.t.\quad  \left\{\begin{array}{lc}
\sum_{j=1}^{J}c_{i,j}^{V}\leq S^V\\
\sum_{j=1}^{J}c_{m,j}^{L}\leq S^L\\
c_{i,j}^{V}\in \left \{0,1\right \}\\
c_{m,j}^{L}\in \left \{0,1\right \}\\
\end{array}\right.
\end{split}
\end{equation*}

效果如下(约束条件左对齐):
在这里插入图片描述

算法格式排版

需要改变一定命令的定义时,需要在导言区加入语句,可以改为任何你想描述的语言,如下(改成中文也是可以的,前提是在中文环境下):

\renewcommand{\algorithmicrequire}{ \textbf{  Input:}}     % use Input in the format of Algorithm  
\renewcommand{\algorithmicensure}{ \textbf{ Output: }} % use Initialize in the format of Algorithm  
%\renewcommand{\algorithmicreturn}{ \textbf{输出}}     % use Output in the format of Algorithm  

算法代码如下(更多的例子可以看link):

\begin{algorithm}[htb] 
\caption{Simulated Anneal Algorithm} 
\label{SA} 
\begin{algorithmic}[1] %这个1 表示每一行都显示数字
\REQUIRE ~~\\ %算法的输入参数:Input
Initial $T_{max}$,$T_{min}$,$K_{in}$,$C_{N_L\times J}^{L}$;\\
$T=T_{max}$;\\
$C^{old}=C_{N_L\times J}^{L}$;\\
Solve \ref{tau_av},and get $\tau _{av\_old}=\tau _{av}\left ( C^{old}\right )$;
\ENSURE ~~\\ %算法的输出:Output
$C^{new}$;
\WHILE{$T\geq T_{min}$}
\FOR{$k = 1:K_{in}$}
\label{ code:fram:extract }%对此行的标记,方便在文中引用算法的某个步骤
\STATE Select $m$ randomly from 1 to $N_L$;\ 
\label{code:fram:trainbase}
\STATE Reassign the elements in the $m$-th row of $C^{old}$ and get a new caching placement matrix $C^{new}$;\ 
\label{code:fram:add}
\STATE Slove \ref{tau_av} and let $\tau _{av\_new}=\tau _{av}\left ( C^{new}\right )$; \
\label{code:fram:classify}
\STATE Let $\delta =\tau _{av\_new}-\tau _{av\_old}$; \
\label{code:fram:select}
\IF{$\delta > 0$}
\STATE $Pe = exp\left ( -\delta /T\right )$, and $A=rand\left ( 1\right )$; \
\IF{$A>Pe$}
\STATE $C^{new}=C^{old}$;\
\STATE $\tau _{av\_new}=\tau _{av\_old}$;\
\ENDIF
\ENDIF
\STATE $C^{old}=C^{new}$;\
\STATE $\tau _{av\_old}=\tau _{av\_new}$;\
\ENDFOR
\STATE $T=T-1$;\
\ENDWHILE
\end{algorithmic}
\end{algorithm}

来看看效果:
在这里插入图片描述
Tips:公式中如果想要输入下划线’’,而在公式中下划线’‘表示下标的意思,这时只需要前面加上’‘即可。’_’,比如代码中的 \tau _{av_old}。

模拟退火算法

下面就再简单介绍一下模拟退火算法吧,上面算法排版的例子就是一个模拟退火算法。模拟退火算法来源于固体退火原理的基于概率的算法,本质也是一种贪婪算法,会以一定的概率来接受一个比当前解更差的解,因此有可能跳出某个局部的最优解,以达到全局的最优解。核心思想是,在一定的循环次数内,随机选取某个值为最优解,循环次数为一个定值,与初始设置的温度和退火次数有关。可以将复杂度控制在一个较小的范围内,但缺点是随机性过大,当系统规模较大时,很难在较少退火次数内得到最优解。详细的内容大家可以参考link

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐