制定线性规划

制定线性规划

我想制定一个线性规划,但我找不到我想要的。它应该类似于此图:

在此处输入图片描述

主要区别在于我想要在右侧自动编号(像等式一样)并在左侧贴上标签,即(LP)

我需要至少 5 列(+编号)

我应该从哪里开始arrayequation,,alignatalign?如何实现这一点?

最终结果 这是最终的代码(Werner 代码的修改版本)。我写了一些新命令,现在每个人都可以使用这些简单的命令,而不必关心正确的对齐方式。谢谢 Werner。

\documentclass{article}
\usepackage[a4paper,margin=1in]{geometry}
\usepackage{mathtools,zref-savepos}

% Linear Programm Tex Example 
\newcommand{\objective}[2] { & \text{#1} \quad \mathrlap{#2}}
% includes s.t. in front
\newcommand{\stconstraint}[4] { & \text{s.t.} & #1 & \quad #2 \quad #3 && \quad  #4}
\newcommand{\constraint}[4] { & & #1 & \quad #2 \quad #3  && \quad #4}

\newcommand{\lpnamereset}{\noindent\zsavepos{text-left-margin}}
\newcommand{\lpnamebegin}{\zsavepos{top-lp}}
\newcommand{\lpnameend}[1]{ \zsavepos{bottom-lp}
    \raisebox{0.5\dimexpr\zposy{top-lp}sp-\zposy{bottom-lp}sp}[0pt][0pt]{%
      \makebox[0pt][r]{\rlap{(#1)}\hspace*{\dimexpr\zposx{bottom-lp}sp-\zposx{text-left-margin}sp}}}}
 % End Linear Programm Tex Example      


\begin{document}

\setlength{\jot}{10pt}
\lpnamereset
\begin{alignat}{4}
 \lpnamebegin
 \objective{min}{\sum_{a \in A} k_a u_a + \sum_{r \in R} \sum_{a \in A} f_a^r y_a^r}  \\
 \stconstraint{\smashoperator{\sum_{a \in \delta_i^+}} y_a^r - \smashoperator{\sum_{a \in \delta_i^-}} y_a^r}{=}{\left\{\begin{array}{@{}rl@{}}
       1, & \text{falls $i = O^r$} \\
      -1, & \text{falls $i = D^r$} \\
       0, & \text{sonst} \\
    \end{array}\right.}{(\forall r \in R)(\forall i \in V)} \\
    \constraint{y_a^r}{\leq}{ u_a}{ (\forall r \in R)(\forall a \in A)} \\
    \constraint{u_a}{\in}{\{0,1\}}{(\forall a \in A)} \\
    \constraint{y_a^r}{\in}{[0,1}{(\forall r \in R)(\forall a \in A)} 
     \lpnameend{LP}
\end{alignat}

\end{document}

答案1

线性规划的设置很简单,使用。如果您还想包含 提供的自动编号方程式样式,则 左侧alignat的放置会更困难。为此,我使用了中的模块(LP)alignatsaveposzref存储某些元素的水平位置,然后将标签移动(LP)到位;水平靠左边距(用作text-left-margin参考);垂直位于第一行/top-lp和最后一行/之间的中间位置bottom-lp):

在此处输入图片描述

\documentclass{article}

\usepackage[a4paper,margin=1in]{geometry}
\usepackage{mathtools,zref-savepos}

\begin{document}

\noindent\zsavepos{text-left-margin}%
Here is some text.

%\setlength{\jot}{10pt}
\begin{alignat}{4}
  & \zsavepos{top-lp}\text{min} \quad \mathrlap{\sum_{a \in A} k_a u_a + \sum_{r \in R} \sum_{a \in A} f_a^r y_a^r} \\
  & \text{s.t.} \quad & \smashoperator{\sum_{a \in \delta_i^+}} y_a^r - \smashoperator{\sum_{a \in \delta_i^-}} y_a^r
    &= \left\{\begin{array}{@{}rl@{}}
       1, & \text{falls $i = O^r$} \\
      -1, & \text{falls $i = D^r$} \\
       0, & \text{sonst}
    \end{array}\right. & \quad & (\forall r \in R)(\forall i \in V) \\
  & & y_a^r &\leq u_a && (\forall r \in R)(\forall a \in A) \\
  & &   u_a &\in \{0,1\} && (\forall a \in A) \\
  & & y_a^r &\in [0,1] && (\forall r \in R)(\forall a \in A)\zsavepos{bottom-lp}
    \raisebox{0.5\dimexpr\zposy{top-lp}sp-\zposy{bottom-lp}sp}[0pt][0pt]{%
      \makebox[0pt][r]{\rlap{(LP)}\hspace*{\dimexpr\zposx{bottom-lp}sp-\zposx{text-left-margin}sp}}}
\end{alignat}

\end{document}

由于zref使用 (La)TeX 的\label-\ref系统,因此第一次运行时至少需要编译两次。此后,只要有完整的.aux,一切就应该顺利运行。

答案2

我编写了一个名为的包,lpform它可以自动进行格式化和标记。

https://www.ctan.org/pkg/lpform

例子:

LaTeX 中 lpform 包的示例

答案3

systeme 包提供了一种编写显式方程组(或不等式)的方法。它的文档是法语的,如何完成一些工作远非直观。但它工作得很好。尝试:

\begin{equation}
    \sysdelim..  % No '{' or other decorations
    \systeme[x_1x_2s_1s_2s_3z]{  % Order for the variables
        x_1 +   x_2 + s_1     = \phantom{0}9,
        x_1 + 3 x_2 + s_2     = 12,
      - x_1 + 2 x_2 + s_3     = \phantom{0}2,
      - x_1 - 2 x_2       + z = \phantom{0}0
    }

相关内容