目录

数学建模之数学模型-3动态规划

数学建模之数学模型-3:动态规划

一个多阶段决策过程最优化问题的动态规划模型包括以下

6 6

6 个要素:

以下是对动态规划中阶段、状态、决策、策略、状态转移方程、指标函数和最优指标函数这些基本概念更详细的解释:

  • 阶段是对整个问题的求解过程进行的划分,将一个复杂的多阶段决策问题按照时间或空间等顺序,分解为一系列相互联系的子问题,每个子问题就是一个阶段。例如,在生产计划问题中,如果按照月份来安排生产,那么每个月就可以看作是一个阶段;在资源分配问题中,将资源依次分配给不同的项目,每分配一次资源就可以看作是一个阶段。通过这种划分,可以使问题的求解更加有条理和可操作。
  • 状态是描述每个阶段开始时系统所处状况的变量或变量组。它包含了在该阶段进行决策所需要的全部信息,并且具有无后效性,即一旦当前状态确定,后续的决策只取决于当前状态,而与之前是如何到达这个状态的过程无关。例如,在背包问题中,背包在每个阶段的剩余容量以及已经装入背包的物品组合情况就是状态;在最短路径问题中,某个节点表示的位置以及到达该节点时已经走过的路径长度等可以作为状态。
  • 决策是在每个阶段根据当前状态所做出的选择或决定。决策的结果会使系统从一个状态转移到另一个状态。例如,在背包问题中,决定是否将某个物品放入背包就是一个决策;在生产计划问题中,决定每个月生产多少产品也是决策。决策变量通常用数学符号表示,例如在资源分配问题中,设

    x i x_i

    x

    i

    表示分配给第

    i i

    i 个项目的资源数量,

    x i x_i

    x

    i

    就是决策变量,它的取值范围和具体取值取决于问题的约束条件和实际情况。

  • 策略是由各个阶段的决策所组成的一个决策序列。它是从问题的初始阶段开始,依次经过各个中间阶段,直到最终阶段的全过程决策方案。一个策略对应着一条从初始状态到最终状态的路径。例如,在背包问题中,“先放入物品A,再放入物品C,不放入物品B”就是一个策略;在多阶段投资问题中,“第一个阶段投资项目1,第二个阶段将资金从项目1撤出并投资项目3,第三个阶段继续持有项目3的投资”也是一个策略。在所有可能的策略中,使指标函数达到最优值的策略称为最优策略。
  • 状态转移方程是描述从一个阶段的状态通过决策转移到下一个阶段状态的数学表达式。它体现了状态与决策之间的关系,是动态规划算法的核心。一般形式为

    s k + 1

    T ( s k , x k ) s_{k + 1}=T(s_k, x_k)

    s

    k

1

=

T

(

s

k

,

x

k

) ,其中

s k s_k

s

k

表示第

k k

k 阶段的状态,

x k x_k

x

k

表示第

k k

k 阶段的决策,

s k + 1 s_{k + 1}

s

k

1

表示第

k + 1 k + 1

k

1 阶段的状态,

T T

T 是一个函数,表示状态转移的规则。例如,在库存管理问题中,设

s k s_k

s

k

为第

k k

k 个月初的库存数量,

x k x_k

x

k

为第

k k

k 个月的生产量,

d k d_k

d

k

为第

k k

k 个月的需求量,则状态转移方程为

s k + 1

s k + x k − d k s_{k + 1}=s_k + x_k - d_k

s

k

1

=

s

k

x

k

d

k

  • 指标函数是用于衡量每个阶段决策的优劣以及整个决策过程总体效果的函数。它是关于状态和决策的函数,通常表示为

    V ( s k , x k , s k + 1 , ⋯   , s n ) V(s_k, x_k, s_{k + 1}, \cdots, s_n)

    V

    (

    s

    k

    ,

    x

    k

    ,

    s

    k

1

,

,

s

n

) ,其中

s k , s k + 1 , ⋯   , s n s_k, s_{k + 1}, \cdots, s_n

s

k

,

s

k

1

,

,

s

n

是从第

k k

k 阶段到最终阶段的状态序列,

x k x_k

x

k

是第

k k

k 阶段的决策。指标函数的形式根据具体问题而定,例如在背包问题中,指标函数可以是装入背包的物品总价值;在生产计划问题中,指标函数可以是生产成本、库存成本等各种成本的总和;在最短路径问题中,指标函数可以是路径的长度。

  • 最优指标函数是指从某个阶段的某个状态开始到过程结束的最优指标值所对应的函数,记为

    f k ( s k ) f_k(s_k)

    f

    k

    (

    s

    k

    ) 。它表示在第

    k k

    k 阶段处于状态

    s k s_k

    s

    k

    时,采取最优策略所能获得的最优指标值。例如,在背包问题中,

    f k ( s k ) f_k(s_k)

    f

    k

    (

    s

    k

    ) 表示在第

    k k

    k 个物品选择阶段,背包剩余容量为

    s k s_k

    s

    k

    时,能获得的最大价值;在生产计划问题中,

    f k ( s k ) f_k(s_k)

    f

    k

    (

    s

    k

    ) 表示在第

    k k

    k 个月初库存为

    s k s_k

    s

    k

    时,从第

    k k

    k 个月到最后一个月的最小成本。最优指标函数通常通过动态规划的递推关系来求解,即利用已知的后续阶段的最优指标函数值来计算当前阶段的最优指标函数值,逐步向前递推,直到求出初始阶段的最优指标函数值,从而得到整个问题的最优解。

动态规划的求解方法有前向算法和后向算法。

动态规划的前向算法和后向算法是求解动态规划问题的两种重要方法,以下从基本思想、计算过程和应用实例等方面进行介绍:

  • 基本思想 :前向算法是从问题的初始阶段开始,逐步向后推进,依次计算每个阶段的最优解,直到到达最终阶段。它基于这样的原理:对于一个多阶段决策问题,先确定第一个阶段的最优决策,然后在已知第一个阶段最优决策的基础上,确定第二个阶段的最优决策,以此类推,直到确定最后一个阶段的最优决策,从而得到整个问题的最优解。
  • 计算过程
    • 初始化 :确定初始阶段的状态和最优指标函数值。例如,在一个资源分配问题中,假设初始阶段资源总量为

      R R

      R ,则初始状态可以表示为

      s 1

      R s_1 = R

      s

      1

      =

      R ,并根据问题的具体情况确定

      f 1 ( s 1 ) f_1(s_1)

      f

      1

      (

      s

      1

      ) 的值,即初始阶段的最优指标函数值。

    • 递推计算 :对于第

      k k

      k 阶段(

      k

      1 k > 1

      k

      1 ),根据状态转移方程和指标函数的定义,利用已经计算出的第

      k − 1 k - 1

      k

      1 阶段的最优指标函数值

      f k − 1 ( s k − 1 ) f_{k - 1}(s_{k - 1})

      f

      k

      1

      (

      s

      k

      1

      ) 来计算

      f k ( s k ) f_k(s_k)

      f

      k

      (

      s

      k

      ) 。即对于每个可能的状态

      s k s_k

      s

      k

      和决策

      x k x_k

      x

      k

      ,计算

      f k ( s k )

      max ⁡ x k { V ( s k − 1 , x k ) + f k − 1 ( s k − 1 ) } f_k(s_k)=\max_{x_k}{V(s_{k - 1}, x_k)+f_{k - 1}(s_{k - 1})}

      f

      k

      (

      s

      k

      )

      =

      max

      x

      k

      {

      V

      (

      s

      k

      1

      ,

      x

      k

      )

f










k

−

1

​


(


s










k

−

1

​


)}
,其中

V
(
s
k
−
1
,
x
k
)
V(s_{k - 1}, x_k)





V

(


s










k

−

1

​


,




x









k

​


)
是第

k
−
1
k - 1





k



−





1
阶段状态为

s
k
−
1
s_{k - 1}






s










k

−

1

​

时采取决策

x
k
x_k






x









k

​

所获得的阶段指标值。
  • 得到最优解 :重复上述递推过程,直到计算出最后一个阶段

    n n

    n 的最优指标函数值

    f n ( s n ) f_n(s_n)

    f

    n

    (

    s

    n

    ) ,此时

    f n ( s n ) f_n(s_n)

    f

    n

    (

    s

    n

    ) 就是整个问题的最优解,对应的决策序列就是最优策略。

  • 应用实例 :在投资决策问题中,假设你有一定的资金,要在多个时间段内决定对不同项目的投资金额,以获取最大收益。可以使用前向算法,从第一个时间段开始,依次计算在每个时间段不同资金状态下的最优投资策略和最大收益,最终得到整个投资过程的最优方案。
  • 基本思想 :后向算法则是从问题的最终阶段开始,逐步向前回溯,依次计算每个阶段的最优解。它的核心思想是先考虑最后一个阶段的最优决策,然后在已知最后一个阶段最优决策的情况下,确定倒数第二个阶段的最优决策,以此类推,直到确定第一个阶段的最优决策,从而得到整个问题的最优解。
  • 计算过程
    • 初始化 :确定最终阶段的状态和最优指标函数值。例如,在一个生产计划问题中,假设最后一个阶段

      n n

      n 的需求为

      D n D_n

      D

      n

      ,生产能力为

      C n C_n

      C

      n

      ,则最终阶段的状态可以表示为

      s n

      D n s_n = D_n

      s

      n

      =

      D

      n

      ,并根据问题的实际情况确定

      f n ( s n ) f_n(s_n)

      f

      n

      (

      s

      n

      ) 的值,即最终阶段的最优指标函数值,通常

      f n ( s n )

      0 f_n(s_n)=0

      f

      n

      (

      s

      n

      )

      =

      0 或根据具体问题有特定的取值。

    • 递推计算 :对于第

      k k

      k 阶段(

      k < n k < n

      k

      <

      n ),根据状态转移方程和指标函数的定义,利用已经计算出的第

      k + 1 k + 1

      k

1
阶段的最优指标函数值

f
k
+
1
(
s
k
+
1
)
f_{k + 1}(s_{k + 1})






f










k

+

1

​


(


s










k

+

1

​


)
来计算

f
k
(
s
k
)
f_k(s_k)






f









k

​


(


s









k

​


)
。即对于每个可能的状态

s
k
s_k






s









k

​

和决策

x
k
x_k






x









k

​

,计算

f
k
(
s
k
)
=
max
⁡
x
k
{
V
(
s
k
,
x
k
)
+
f
k
+
1
(
s
k
+
1
)
}
f_k(s_k)=\max_{x_k}\{V(s_k, x_k)+f_{k + 1}(s_{k + 1})\}






f









k

​


(


s









k

​


)



=






max











x









k

​


​


{

V

(


s









k

​


,




x









k

​


)



+






f










k

+

1

​


(


s










k

+

1

​


)}
,其中

V
(
s
k
,
x
k
)
V(s_k, x_k)





V

(


s









k

​


,




x









k

​


)
是第

k
k





k
阶段状态为

s
k
s_k






s









k

​

时采取决策

x
k
x_k






x









k

​

所获得的阶段指标值,

s
k
+
1
=
T
(
s
k
,
x
k
)
s_{k + 1}=T(s_k, x_k)






s










k

+

1

​




=





T

(


s









k

​


,




x









k

​


)
是状态转移方程。
  • 得到最优解 :重复上述递推过程,直到计算出第一个阶段的最优指标函数值

    f 1 ( s 1 ) f_1(s_1)

    f

    1

    (

    s

    1

    ) ,此时

    f 1 ( s 1 ) f_1(s_1)

    f

    1

    (

    s

    1

    ) 就是整个问题的最优解,对应的决策序列就是最优策略。

  • 应用实例 :在背包问题中,假设有一个容量为

    W W

    W 的背包和

    n n

    n 个物品,每个物品有重量和价值。使用后向算法,从最后一个物品开始考虑,依次计算在不同背包剩余容量状态下,选择不同物品组合时的最大价值,最终确定在初始背包容量为

    W W

    W 时的最优物品选择方案。

  • 计算顺序 :前向算法是从前往后计算,先处理初始阶段,逐步向后推进;后向算法是从后往前计算,先处理最终阶段,逐步向前回溯。
  • 适用场景 :一般来说,当前阶段的决策依赖于之前阶段的结果,且问题的初始条件明确时,前向算法可能更自然和直观;而当问题的最终状态比较明确,且后续阶段的决策对当前阶段有较大影响时,后向算法可能更便于理解和计算。


贾利新

信息工程大学


基于动态规划,利用反向搜索的方法,通过计算词语的最大“花费”给出了中文文本的切分算法,从而建立了一个能够消除中文分词中切分歧义的中文分词模型。通过对模型中算法求解的运行效率及空间耗费进行分析得出,在统计意义上,该算法具有接近与文本规模成线性关系的复杂度,空间的耗费是常数规模的。

关键词: 自然语言;动态规划;算法;分词


自动分词是计算机中文信息处理领域中一个基础而困难的课题。对以英文为代表的西方语言进行分词比较便利,因为在这些语言中,其基础单位是单词,单词与单词之间有空格,按空格就能对语言进行切分。而中文词与词之间没有空格,机器的自动处理就会变得困难。

中文分词中比较难处理的问题是消除歧义。文献 [1] 描述了多种实用的字符串搜索方法,文献 [2, 3] 介绍了动态规划建模的普遍方法,文献 [4] 介绍了一种采用“长词优先”的方法消除歧义。本文采用动态规划,用反向搜索的方法,通过计算对词语描述“花费”的最大值,来切分中文文本。


设汉字的字符集为

σ \sigma

σ ,在本文中

x y xy

x

y 表示字符串

x x

x 和

y y

y 的拼接。给定字符串

x x

x 、

y y

y 、

z z

z ,则

x x

x 是

x y xy

x

y 的前缀,

y y

y 是

x y xy

x

y 的后缀,

x x

x 是

y x z yxz

y

x

z 的一个因子。

要分析的文本可以表述为:

T

a 1 a 2 ⋯ a n , a i ∈ σ , i

1 , 2 , ⋯   , n T = a_1a_2\cdots a_n, \quad a_i \in \sigma, \quad i = 1, 2, \cdots, n

T

=

a

1

a

2

a

n

,

a

i

σ

,

i

=

1

,

2

,

,

n

P

{ ( ω , V ( ω ) ) ∣ ω  表示字符串 , V ( ω ) ∈ R + } P = { (\omega, V(\omega)) \mid \omega \text{ 表示字符串}, V(\omega) \in \mathbb{R}^+ }

P

=

{(

ω

,

V

(

ω

))

ω

表示字符串

,

V

(

ω

)

R

} ,

V ( ω ) V(\omega)

V

(

ω

) 表示词语

ω \omega

ω 的花费。“花费”是对词语的词频取对数的绝对值得到的。因为后面计算用到的乘法使得积的位数过大,所以通过取对数,把词频的乘法计算变成了对“花费”的加法计算。

以词语“汽车和服装”为例,表 1 给出了这个词语中元素前后搭配的权重关系,竖向字符在前,横向字符在后。

13111
11111
11111
11213
13111

表 1:词语中元素前后搭配的权重关系表

将词语按照从样本中统计出的“花费”进行排序,经过整理得到词语的转移关系,示例见表 2。

词语组合花费
汽,车3.0
和,服2.0
服,装3.0
装,车3.0

表 2:词语的转移关系表

V ( a 1 , a 2 ) V(a_1, a_2)

V

(

a

1

,

a

2

) 表示词组的“花费”。从表 2 可以看出,存在以下有效的花费:

V ( 汽 , 车 )

3.0 V(\text{汽}, \text{车}) = 3.0

V

(

,

)

=

3.0 ,

V ( 和 , 服 )

2.0 V(\text{和}, \text{服}) = 2.0

V

(

,

)

=

2.0 ,

V ( 服 , 装 )

3.0 V(\text{服}, \text{装}) = 3.0

V

(

,

)

=

3.0 ,

V ( 装 , 车 )

3.0 V(\text{装}, \text{车}) = 3.0

V

(

,

)

=

3.0 ,其他的组合不构成词组。分词问题就是将文本

T T

T 规划成由多个词语组成的排列,以

T

ω 1 ω 2 ω 3 ⋯ ω l T = \omega_1\omega_2\omega_3\cdots\omega_l

T

=

ω

1

ω

2

ω

3

ω

l

表示,

l l

l 为切分后的词语数,使得指标函数:

V ( T )

∑ i

1 l V ( ω i ) , ( ω i , V ( ω i ) ) ∈ P V(T) = \sum_{i = 1}^l V(\omega_i), \quad (\omega_i, V(\omega_i)) \in P

V

(

T

)

=

i

=

1

l

V

(

ω

i

)

,

(

ω

i

,

V

(

ω

i

))

P

取到全局最大值。


用一个状态转换的自动机来处理文本。对于文本

T

a 1 a 2 a 3 ⋯ a n T = a_{1}a_{2}a_{3}\cdots a_{n}

T

=

a

1

a

2

a

3

a

n

,从文本的开始起,在第

k k

k 个位置,读入字符

a k a_{k}

a

k

,状态进行相应的变化。用

s k s_{k}

s

k

表示当处于读入字符

a k a_{k}

a

k

时的状态,

s k s_{k}

s

k

中包含了多个可选的元素,每个元素表示一种待选切分序列。通过设计决策函数和筛选条件,保证序列的马尔可夫性,从而消除后效性。


通过设计决策函数、筛选条件和递推公式,实现动态规划的最优化。状态转移方程为:

s k + 1

s k ∪ { u ( s k ) u ‾ ( s k ) } − { ( U 1 ∩ U 2 ) ∪ ( U 1 ∩ U 3 ) } s_{k + 1}=s_{k} \cup {u(s_{k})\overline{u}(s_{k})}-{(U_{1} \cap U_{2}) \cup (U_{1} \cap U_{3})}

s

k

1

=

s

k

{

u

(

s

k

)

u

(

s

k

)}

{(

U

1

U

2

)

(

U

1

U

3

)}

指标函数和递推公式为:

v k ( s k , u k )

{ 0 , U 1 ∩ U 2

∅ V ( u k ( s k ) ) , U 1 ∩ U 2 ≠ ∅ v_{k}(s_{k}, u_{k})=\begin{cases} 0, & U_{1} \cap U_{2}=\varnothing \ V(u_{k}(s_{k})), & U_{1} \cap U_{2} \neq \varnothing \end{cases}

v

k

(

s

k

,

u

k

)

=

{

0

,

V

(

u

k

(

s

k

))

,

U

1

U

2

=

U

1

U

2

=

f k ( s k )

v k ( s k , u k ) + f k − 1 ( s k − 1 ) f_{k}(s_{k})=v_{k}(s_{k}, u_{k})+f_{k - 1}(s_{k - 1})

f

k

(

s

k

)

=

v

k

(

s

k

,

u

k

)

f

k

1

(

s

k

1

)


算法步骤如下:

  1. 设定初始状态;
  2. 读入一个字符,若为终结符则输出结果,否则继续;
  3. 计算当前步骤的决策函数;
  4. 排除非最优中间方案,存储可选切分方案;
  5. 重复执行步骤 2-4。

以“汽车和服装$”为例,算法运行过程如下:

  1. 初始状态

    f 0 ( s 0 )

    0 f_0(s_0) = 0

    f

    0

    (

    s

    0

    )

    =

    0 ,读入“汽”字,

    s 1

    { ( 汽 ) } s_1 = {(\text{汽})}

    s

    1

    =

    {(

    )} ;

  2. 读入“车”字,

    s 2

    { ( 汽 , 车 ) , ( 汽车 ) } s_2 = {(\text{汽}, \text{车}), (\text{汽车})}

    s

    2

    =

    {(

    ,

    )

    ,

    (

    汽车

    )} ;

  3. 读入“和”字,

    s 3

    { ( 汽车 , 和 ) , ( 汽 , 车和 ) } s_3 = {(\text{汽车}, \text{和}), (\text{汽}, \text{车和})}

    s

    3

    =

    {(

    汽车

    ,

    )

    ,

    (

    ,

    车和

    )} ;

  4. 读入“服”字,

    s 4

    { ( 汽 , 车 , 和 , 服 ) , ( 汽 , 车 , 和服 ) } s_4 = {(\text{汽}, \text{车}, \text{和}, \text{服}), (\text{汽}, \text{车}, \text{和服})}

    s

    4

    =

    {(

    ,

    ,

    ,

    )

    ,

    (

    ,

    ,

    和服

    )} ;

  5. 读入“装”字,

    s 5

    { ( 汽 , 车 , 和 , 服装 ) } s_5 = {(\text{汽}, \text{车}, \text{和}, \text{服装})}

    s

    5

    =

    {(

    ,

    ,

    ,

    服装

    )} ;

  6. 读入终结符“$”,输出结果“汽车 和 服装”。


该动态规划模型的时间复杂度接近线性

O ( N ) O(N)

O

(

N

) ,空间复杂度为常数级,适合处理大规模文本。其优点包括流式处理能力和对长文本的高效支持,尤其适用于搜索引擎等场景。词频统计过程需独立运行,但结果可复用。


本文提出了一种基于动态规划的中文分词模型,通过局部极值优化和状态筛选,有效消除切分歧义。该模型具有实践意义,但实际应用和性能评测仍需进一步研究。


  1. Navarro G, Raffinot M. Flexible pattern matching in string: practical on - line search algorithms for texts and biological sequences[M]. 中科院计算所网络信息安全研究组译. 北京: 电子工业出版社, 2007.
  2. 运筹学教材编写组. 运筹学[M]. 北京: 清华大学出版社, 2005: 191 - 203.
  3. 韩中庚. 数学建模方法及其应用[M]. 北京: 高等教育出版社, 2005: 220 - 237.
  4. 王显芳, 杜利民. 一种能够检测所有交叉歧义的汉语分词算法[J]. 电子学报, 2004, 32(1): 51 - 54.