用LaTeX寫線性規划


線性規划由目標函數和若干約束構成,Latex中並沒有直接的命令來寫線性規划。簡單的做法是使用\begin{eqnarray} … \end{eqnarray}命令,但eqnarray命令是使若干方程按照中間的二元關系符(如等號)垂直對齊的,而線性規划的約束條件上雖然有二元關系符,但約束條件后面往往還有量詞符號,它們也需要垂直對齊。也就是說,線性規划中有不止一個位置需要垂直對齊。或者干脆使用\begin{array} …\end{array}命令,這樣可以做到多個位置垂直對齊,但又遇到公式無法自動編號、表格中若干數學符號(如\sigma)不能按照數學格式顯示,而只能顯示成文本格式等若干問題。總之,雖然可以使用一些辦法“湊”出線性規划,但許多地方不能做到盡如人意。

直到有一天偶然看到了amsmath包中的\begin{alignat} …\end{alignat}命令,才發現線性規划可以使用這個命令得到較好的解決。下面直接給出代碼:

\documentclass{article}

\usepackage{amsmath}

\begin{document}

\title{LinearProgram}

\maketitle

 

\begin{alignat}{2}

\min\quad & \sum_{\ell\in L}x_{\ell} &{}& \tag{LP1} \label{eqn - lp}\\

\mbox{s.t.}\quad

&\sum_{e \in P} x_{f(e)} \geq 1, &\quad& \forall P \in \mathcal{P}_{st}\\

&x_{\ell} \geq 0, &{}& \forall \ell \in L \nonumber

\end{alignat}

 

Inthe linear program (\ref{eqn - lp}), ...

\end{document}

產生的線性規划如下圖所示:

有幾個要點解釋一下。

(1)整個線性規划看上去由4列組成。即最左邊的“min”和“s.t.”,第2列的約束條件,第3列的約束條件量詞,和第4列的編號。其中,第2列和第3列是靠左對齊的,這樣看上去就比較美觀。

當然,線性規划還有一種常見的寫法是約束條件按照二元關系符垂直對齊,相信看完本文后,大家會自己構造出這樣的線性規划。對於大量的線性規划而言,兩種格式各有優缺點。

(2)線性規划的目標函數和約束條件都可以按照標准的\ref{}命令進行引用。對於那些不需要引用的約束條件,只需要在相應的行中寫上\nonumber,其右端就沒有編號了。

值得一提的是目標函數的編號,在上例中是“(LP1)”,而不是和約束條件統一編號的。這個(LP1)是和Latex產生標准編號一樣出現在頁面最右端,並且它也和標准編號一樣使用\ref{}命令引用。正如例中所示,這是使用\tag命令實現的。(知道\tag命令可以實現這樣的功能,也是大量閱讀后偶然發現的,花費了相當長的時間…)

(3)下面簡單解釋一下上例的具體實現。整個線性規划實際上是划分成了如下圖所示的4列,因此在alignat命令中需要使用3個“&”符號來隔開這些列。其中,第C列存在的目的是讓量詞與約束條件之間隔開一定距離。

按照alignat命令的用法,這4列實際上構成了alingat命令觀點下的兩列方程組。其中AB是第1列方程組,CD是第2列方程組。也就是說,eqnarray命令是用來對齊一列方程組的,而alignat命令是用來對齊多列方程組的。這也說明了為什么上例代碼中alignat命令后面有一個參數{2}。關於alignat命令這里不做進一步的贅述,大家有興趣可以參考amsmath包的資料。

當然,上述寫線性規划的方法也可以推廣到一般的數學規划。謹以志之,共享共勉。

   (請將文中的全角“\”全部更換為半角的反斜線。)

 

from: http://blog.sciencenet.cn/blog-482332-749340.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM