具有标记方程和宽目标函数的标记线性规划

具有标记方程和宽目标函数的标记线性规划

有人能帮助我在乳胶中陈述一个满足以下要求的线性程序吗?

  1. LP 本身应在左侧编号(尽管在其余文档中,方程式的标签在右侧),并带有特定标记,例如“(P)”,该标记应与方程式标签相关联。

  2. LP部分由5列组成:

    • 对于“最大”和“受制于”
    • 对于约束的左侧
    • 对于关系 $\leq$ 等
    • 对于约束的右侧
    • 用于量化(例如 $\forall v \in V$)
  3. 目标函数(没有 lhs/rhs)可能很宽,并且应该跨越中间三个列。

  4. 每一行本身都应该有一个右对齐的方程标签。

到目前为止,我结合使用了方程式环境、数组环境和多列命令来获得正确的布局。但约束标签在这里不起作用。另一方面,使用对齐似乎没有帮助,因为即使是宽目标也不太好用(我使用了 \mathclap)。

下图显示了它的样子

这个http://www.math.uni-magdeburg.de/~walter/downloads/latex-lp-labels.png

这是 MWE 渲染居中部分 - 但我不知道如何添加单个方程标签或左对齐方程标签,因为其他方程都是右对齐的。

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{equation*}
  \begin{array}{lrcll}
    \max 
    & \multicolumn{4}{l}{\sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma } \\
    \text{s.t.}
    & x_v + x_w & \geq & 0 & \forall \{v,w\} \in E \\
    & y_e & \geq & 0 & \forall e \in E \\
    & y(\delta(U)) & \geq & \frac{1}{2}(|U|-1) & \forall U \subseteq V
  \end{array}
\end{equation*}
\end{document}

答案1

我在解释您在此处尝试实现的目标时做了一些改动。例如,我假设您将手动创建 LP 块的标签名称。此外,我认为我的解决方案缺乏一定的优雅性:特别是,每个这样的块都必须单独创建。我真的不喜欢这样。

总体思路如下:创建两个以基线为中心的相邻框,其中一个包含虚拟方程,用于为整个块创建标签。框后的间距有点奇怪。因此,我~在最后一个flalign环境后添加。(缺点:您还必须手动调整第一个环境的宽度,parbox以使标签正确定位。)

您似乎希望第一行以某种方式与 LP 对齐。我对此有两个解决方案。第一个将第一行放入零宽度的框中。(缺点:您必须在此框内重新进入数学模式。)第二个将第一行放在其自己的flalign环境中。(缺点:您必须调整两个环境之间的垂直间距。)

\documentclass{article}
\usepackage{amsmath,calc}
\newlength{\LPlhbox}
\begin{document}


\settowidth{\LPlhbox}{(P.1)}%
\noindent%
\parbox{\LPlhbox}{\begin{align}
               \tag{P.1}\label{My first LP Block}
               \end{align}}%
\hspace*{\fill}%
\begin{minipage}{\linewidth-2cm}
    \begin{flalign}\notag
     & \makebox[0pt][l]{$\displaystyle{}\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma$} \\
    \label{this line can be referenced}
     & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
     &             & y_3         & \geq 0                  && \forall e\in E        && \\
     &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
    \end{flalign}~
\end{minipage}

\settowidth{\LPlhbox}{(P.2)}%
\noindent%
\parbox{\LPlhbox}{\begin{align}
               \tag{P.2}\label{My second LP Block}
               \end{align}}%
\hspace*{\fill}%
\begin{minipage}{\linewidth-2cm}
   \begin{flalign}\notag
     \max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma &&
   \end{flalign}
    \vspace{-1.5\baselineskip}
   \begin{flalign}
    & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
    &             & y_3         & \geq 0                  && \forall e\in E        && \\
    &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
   \end{flalign}~
\end{minipage}

Notice that we can reference line~\ref{this line can be referenced}
and both block~\ref{My first LP Block} and block~\ref{My second LP Block}
\end{document}

如果有命令可以暂时覆盖文档默认值,那就太好\lefttag\righttag

您还可以轻松创建命令来执行左侧框的工作。

\newcommand{\LPblocktag}[2]{\settowidth{\LPlhbox}{(#1)}%
                            \parbox{\LPlhbox}{\begin{align}\tag{#1}#2\end{align}}%
                            \hspace*{\fill}}

我已经写了第二个参数,因为我不想假设你会引用每个这样的块。

因此上面的第一个块可以写成

\noindent%
\LPblocktag{P.3}{\label{My third LP Block}}%
\begin{minipage}{\linewidth-2cm}
    \begin{flalign}\notag
     & \makebox[0pt][l]{$\displaystyle{}\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma$} \\
    \label{this line can be referenced}
     & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
     &             & y_3         & \geq 0                  && \forall e\in E        && \\
     &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
    \end{flalign}~
\end{minipage}

I can reference \ref{My third LP Block}

在此处输入图片描述

答案2

我已经修改了上述内容,以创建一个新的环境,该环境将围绕数学方程式环境。我保留了上面的旧解决方案,因为在这里我使用xkeyval包来允许用户将参数传递给新环境,但也因为此解决方案的方法风格截然不同。我认为这种方法更加通用,并建议进行其他可能有用的修改。

此外,我还采纳了 cmhughes 建议的用法mathtools。最后,正如所写,此环境似乎需要明确命名左侧框的标签。似乎应该有某种默认方法。但是,我也会将其留给其他人去构思。

这是我重新设想的解决方案:

\documentclass{article}
\usepackage{amsmath,mathtools,calc}
%..%
\usepackage{xkeyval}
\makeatletter
\newlength{\LP@lh@boxwidth}      %% width of first box, set automatically within environment
\setlength{\LP@lh@boxwidth}{0pt}
\newlength{\LP@lh@boxsep}        %% distance between two boxes.  Default is `2em`.  Can be overridden by using key `boxsep=<length>`
\setlength{\LP@lh@boxsep}{2em}
\newcommand{\LP@lh@content}{}
\newcommand{\LP@lh@tagname}{}    %% set by user using key `tagname=<name of tag>`
\define@key[LP]{lhbox}{boxsep}[2em]{\setlength{\LP@lh@boxsep}{#1}}
\define@key[LP]{lhbox}{content}[]{\renewcommand{\LP@lh@content}{#1}}
\define@key[LP]{lhbox}{tagname}[]{\renewcommand{\LP@lh@tagname}{#1}}
\newenvironment{tagblock}[1][]%
                         {\setkeys[LP]{lhbox}{tagname,boxsep,#1}\relax%
                          \settowidth{\LP@lh@boxwidth}{\tagform@\LP@lh@tagname}%
                          \noindent%
                          \parbox{\LP@lh@boxwidth}{\begin{align}\tag{\LP@lh@tagname}\LP@lh@content\end{align}}%
                          \hspace*{\LP@lh@boxsep}%
                          \begin{minipage}{\linewidth-\LP@lh@boxwidth-\LP@lh@boxsep}}%
                         {~\end{minipage}}
\makeatother
%..%
\begin{document}

\begin{tagblock}[tagname={P.1},content={\label{My first LP Block}}]
    \begin{flalign}\notag
     & \mathrlap{\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma} \\
    \label{eq01:first_line}
     & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
     &             & y_3         & \geq 0                  && \forall e\in E        && \\
     &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
    \end{flalign}
\end{tagblock}

\begin{tagblock}[tagname={P.2},content=\label{My second LP Block}]
    \begin{flalign}\notag
     & \mathrlap{\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma} \\
     & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
     \label{eq02:second_line}
     &             & y_3         & \geq 0                  && \forall e\in E        && \\
     &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
    \end{flalign}
\end{tagblock}


Notice that we can reference line~\ref{eq01:first_line} and line~\ref{eq02:second_line}
and both block~\ref{My first LP Block} and block~\ref{My second LP Block}

\end{document}

在此处输入图片描述

答案3

我认为另一个答案会给你你想要的输出。

我的答案满足了您 4 个请求中的 3 个,但(P)在左侧标记多余的部分比较棘手;我的代码只是演示了如何使用它alignat来满足您的大部分需求。

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}
\begin{document}

\subsection*{Original}
\begin{equation*}
    \begin{array}{lrcll}
        \max 
        & \multicolumn{4}{l}{\sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma } \\
        \text{s.t.}
        & x_v + x_w & \geq & 0 & \forall \{v,w\} \in E \\
        & y_e & \geq & 0 & \forall e \in E \\
        & y(\delta(U)) & \geq & \frac{1}{2}(|U|-1) & \forall U \subseteq V
    \end{array}
\end{equation*}

\subsection*{New}
\begin{alignat}{3}
    \max              &   & \sum_{v \in V} x_v  + & \sum_{e \in E}  y_e + 10000\gamma  &   & \nonumber             \\
    \text{s.t.}\qquad &   & x_v + x_w             & \geq            0                  &   & \forall \{v,w\} \in E \\
                      &   & y_e                   & \geq            0                  &   & \forall e \in E       \\
                      &   & y(\delta(U))          & \geq            \frac{1}{2}(|U|-1) &   & \forall U \subseteq V 
\end{alignat}
\end{document}

相关内容