文章目录

  • (1)间瞄火力的Lanchester方程
  • 公式
  • 参数说明
  • Python 代码实现
  • (2)平方律的Lanchester方程
  • 公式
  • 参数说明
  • Python 代码实现
  • (3)信息对抗因素的Lanchester方程
  • 公式
  • 参数说明
  • Python 代码实现
  • Python 代码
  • 源码如下
  • 代码解释
  • (1)模式选择
  • (2)进行仿真
  • 总结



利用差分的方法将连续域的Lanchester方程离散化,以得到战争双方的兵力损耗情况。

下面对间瞄火力的Lanchester方程、平方律的Lanchester方程和考虑了信息对抗因素的Lanchester方程进行离散化,并给出了对应的离散方程。

(1)间瞄火力的Lanchester方程

公式

离散化后的公式如下:
Python数值离散化后怎么使用apriori python求离散对数_算法

参数说明

  • Python数值离散化后怎么使用apriori python求离散对数_代码实现_02Python数值离散化后怎么使用apriori python求离散对数_算法_03 分别表示红、蓝双方在 Python数值离散化后怎么使用apriori python求离散对数_代码实现_04 的兵力情况,此处取初值为 Python数值离散化后怎么使用apriori python求离散对数_算法_05Python数值离散化后怎么使用apriori python求离散对数_代码实现_06
  • Python数值离散化后怎么使用apriori python求离散对数_Python_07Python数值离散化后怎么使用apriori python求离散对数_Python_08分别表示红、蓝双方战斗单位的作战效能,此处取 Python数值离散化后怎么使用apriori python求离散对数_代码实现_09Python数值离散化后怎么使用apriori python求离散对数_Python_10。(一定要注意这里!Python数值离散化后怎么使用apriori python求离散对数_Python_07Python数值离散化后怎么使用apriori python求离散对数_Python_08 的位置是反的!不是按照顺序给了红、蓝双方,这篇论文在引言和第1.2节中的定义有冲突,为写公式不出错,我采用了作者第1.2节的写法。)

Python 代码实现

定义了一个LinearLaw()函数来实现间瞄火力的Lanchester方程,代码如下。

def LinearLaw(R, B, b_l, a_l, t):
    R.append(R[t] - a_l * B[t] * R[t])
    B.append(B[t] - b_l * B[t] * R[t])
    return R, B

这里有个判断哪一方交战胜利的等式,如果红、蓝双方兵力满足下面等式
Python数值离散化后怎么使用apriori python求离散对数_Python_13

则说明红方必将获胜。代码如下

elif mode == "LinearLaw":                   # 根据间瞄火力的胜负条件做比较
    if R0 * b > B0 * a:
        print("红方将【取得胜利】!")
    else:
        print("蓝方将【取得胜利】!")

仿真结果如下图所示,源代码将在文章的末尾给出。

Python数值离散化后怎么使用apriori python求离散对数_代码实现_14

(2)平方律的Lanchester方程

公式

离散化后的公式如下:
Python数值离散化后怎么使用apriori python求离散对数_算法_15

参数说明

  • Python数值离散化后怎么使用apriori python求离散对数_代码实现_02Python数值离散化后怎么使用apriori python求离散对数_算法_03 分别表示红、蓝双方在 Python数值离散化后怎么使用apriori python求离散对数_代码实现_04 的兵力情况,此处取初值为 Python数值离散化后怎么使用apriori python求离散对数_算法_05Python数值离散化后怎么使用apriori python求离散对数_代码实现_06
  • Python数值离散化后怎么使用apriori python求离散对数_python_21Python数值离散化后怎么使用apriori python求离散对数_参数说明_22分别表示红、蓝双方战斗单位在单位时间内平均毁伤对方战斗成员的数量,此处取 Python数值离散化后怎么使用apriori python求离散对数_python_23Python数值离散化后怎么使用apriori python求离散对数_算法_24。(一定要注意这里!Python数值离散化后怎么使用apriori python求离散对数_python_21Python数值离散化后怎么使用apriori python求离散对数_参数说明_22 的位置是反的!不是按照顺序给了红、蓝双方,这篇论文在引言和第1.2节中的定义有冲突,为写公式不出错,我采用了作者第1.2节的写法。)

Python 代码实现

定义了一个SquareLaw()函数来实现平方律的Lanchester方程,代码如下。

def SquareLaw(R, B, b_s, a_s, t):
    R.append(R[t] - a_s * B[t])
    B.append(B[t] - b_s * R[t])
    return R, B

这里有个判断哪一方交战胜利的等式,如果红、蓝双方兵力满足下面等式
Python数值离散化后怎么使用apriori python求离散对数_Python_27

则说明红方必将获胜。代码如下

R0_square = R0 ** 2                     # 红方兵力的平方
B0_square = B0 ** 2                     # 蓝方兵力的平方
if R0_square * b > B0_square * a:       # 根据平方律的胜负条件做比较
    print("红方将【取得胜利】!")
else:
    print("蓝方将【取得胜利】!")

仿真结果如下图所示,源代码将在文章的末尾给出。

Python数值离散化后怎么使用apriori python求离散对数_参数说明_28

(3)信息对抗因素的Lanchester方程

公式

离散化后的公式如下:
Python数值离散化后怎么使用apriori python求离散对数_代码实现_29
注意:这篇论文给出的公式是错的,在计算 Python数值离散化后怎么使用apriori python求离散对数_python_30 时,下面的等式最后一项括号里面的符号应为Python数值离散化后怎么使用apriori python求离散对数_Python_31,而非原文中的Python数值离散化后怎么使用apriori python求离散对数_python_32

参数说明

  • Python数值离散化后怎么使用apriori python求离散对数_代码实现_02Python数值离散化后怎么使用apriori python求离散对数_算法_03 分别表示红、蓝双方在 Python数值离散化后怎么使用apriori python求离散对数_代码实现_04 的兵力情况,此处取初值为 Python数值离散化后怎么使用apriori python求离散对数_算法_05Python数值离散化后怎么使用apriori python求离散对数_代码实现_06
  • Python数值离散化后怎么使用apriori python求离散对数_Python_07Python数值离散化后怎么使用apriori python求离散对数_Python_08分别表示红、蓝双方战斗单位的作战效能,此处取 Python数值离散化后怎么使用apriori python求离散对数_代码实现_09Python数值离散化后怎么使用apriori python求离散对数_Python_10
  • Python数值离散化后怎么使用apriori python求离散对数_python_21Python数值离散化后怎么使用apriori python求离散对数_参数说明_22分别表示红、蓝双方战斗单位在单位时间内平均毁伤对方战斗成员的数量,此处取 Python数值离散化后怎么使用apriori python求离散对数_python_23Python数值离散化后怎么使用apriori python求离散对数_算法_24
  • Python数值离散化后怎么使用apriori python求离散对数_Python_46Python数值离散化后怎么使用apriori python求离散对数_python_47 为红、蓝双方的伪装能力系数,此处取 Python数值离散化后怎么使用apriori python求离散对数_参数说明_48Python数值离散化后怎么使用apriori python求离散对数_算法_49
  • Python数值离散化后怎么使用apriori python求离散对数_算法_50Python数值离散化后怎么使用apriori python求离散对数_算法_51 为红、蓝双方的侦察能力,此处取 Python数值离散化后怎么使用apriori python求离散对数_参数说明_52Python数值离散化后怎么使用apriori python求离散对数_代码实现_53
  • Python数值离散化后怎么使用apriori python求离散对数_python_54Python数值离散化后怎么使用apriori python求离散对数_参数说明_55 为红、蓝双方的信息作战能力系数,此处取 Python数值离散化后怎么使用apriori python求离散对数_参数说明_56Python数值离散化后怎么使用apriori python求离散对数_参数说明_57

Python 代码实现

定义了一个MoLanMdl()函数来实现间瞄火力的Lanchester方程,代码如下。

def MoLanMdl(R, B, b_s, a_s, b_l, a_l, f_r, s_r, f_b, s_b, e_r, e_b, t):
    rValue = R[t] - (1-f_r)*s_b*b_s*B[t]*e_b - (1-(1-f_r)*s_b)*b_l*B[t]*R[t]*e_b
    bValue = B[t] - (1-f_b)*s_r*a_s*R[t]*e_r - (1-(1-f_b)*s_r)*a_l*B[t]*R[t]*e_r
    R.append(rValue)
    B.append(bValue)
    return R, B

这里没给双方交战胜利的判断条件。

仿真结果如下图所示,源代码将在文章的末尾给出。

Python数值离散化后怎么使用apriori python求离散对数_python_58

Python 代码

源码如下

# encoding: utf-8
"""
#-------------------------------------------------------------------#
#                      Li Lingwei's Python Code                     #     
#-------------------------------------------------------------------#
#                   @Project Name : Python代码                      #
#                   @File Name    : mainZhanDonghui.py              #
#                   @Programmer   : Li Lingwei                      #
#                   @Start Date   : 2021/5/11                       #
#                   @Last Update  : 2021/5/11                       #
#-------------------------------------------------------------------#
# Function:                                                         #
#         论文《现代化战争条件下的兰切斯特战斗模型》的代码复现          #
#-------------------------------------------------------------------#
"""
import numpy as np
import matplotlib.pyplot as plt


def predict(R0, B0, b, a, mode):
    print("——————————————————————————————————————————————")
    print("战斗过程预测结果为:")
    if mode == "SquareLaw":
        R0_square = R0 ** 2                     # 红方兵力的平方
        B0_square = B0 ** 2                     # 蓝方兵力的平方
        if R0_square * b > B0_square * a:       # 根据平方律的胜负条件做比较
            print("红方将【取得胜利】!")
        else:
            print("蓝方将【取得胜利】!")
    elif mode == "LinearLaw":
        if R0 * b > B0 * a:
            print("红方将【取得胜利】!")
        else:
            print("蓝方将【取得胜利】!")


def finalTroops(r, b):
    print("红方剩余兵力为【", r, "】")
    print("蓝方剩余兵力为【", b, "】")


def SquareLaw(R, B, b_s, a_s, t):
    R.append(R[t] - a_s * B[t])
    B.append(B[t] - b_s * R[t])
    return R, B


def LinearLaw(R, B, b_l, a_l, t):
    R.append(R[t] - a_l * B[t] * R[t])
    B.append(B[t] - b_l * B[t] * R[t])
    return R, B


def MoLanMdl(R, B, b_s, a_s, b_l, a_l, f_r, s_r, f_b, s_b, e_r, e_b, t):
    rValue = R[t] - (1-f_r)*s_b*b_s*B[t]*e_b - (1-(1-f_r)*s_b)*b_l*B[t]*R[t]*e_b
    bValue = B[t] - (1-f_b)*s_r*a_s*R[t]*e_r - (1-(1-f_b)*s_r)*a_l*B[t]*R[t]*e_r
    R.append(rValue)
    B.append(bValue)
    return R, B


if __name__ == '__main__':
    # 初始参数
    R0 = 8000                                   # 红方兵力
    B0 = 10000                                  # 蓝方兵力
    b_l = 0.00001                               # 红方战斗单位作战效能
    a_l = 0.00002                               # 蓝方战斗单位作战效能
    b_s = 0.2                                   # 红方战斗单位在单位时间平均毁伤对方战斗成员的数量
    a_s = 0.1                                   # 蓝方战斗单位在单位时间平均毁伤对方战斗成员的数量

    R = [R0, ]                                  # 用于记录红方兵力变化的列表
    B = [B0, ]                                  # 用于记录蓝方病理变化的列表

    T = 100                                     # 仿真总步长
    dt = 1                                      # 时间间隔

    # mode = "SquareLaw"
    # mode = "LinearLaw"
    mode = "ModernizedLanchesterModel"

    if mode == "SquareLaw":                     # 采用平方律的战斗过程
        # 预测战斗进程
        predict(R0, B0, b_s, a_s, mode)
        for t in np.arange(0, T, dt):
            SquareLaw(R, B, b_s, a_s, t)
            if R[-1] < 1e-6 or B[-1] < 1e-6:
                break
    elif mode == "LinearLaw":                   # 采用线性律的战斗过程
        predict(R0, B0, b_l, a_l, mode)
        for t in np.arange(0, T, dt):
            LinearLaw(R, B, b_l, a_l, t)
            if R[-1] < 1e-6 or B[-1] < 1e-6:
                break
    elif mode == "ModernizedLanchesterModel":
        # 初始化参数
        f_r = 0.6                               # 红方的伪装能力系数
        s_r = 0.6                               # 红方的侦察能力
        f_b = 0.2                               # 蓝方的伪装能力系数
        s_b = 0.2                               # 蓝方的侦察能力
        epsilon_r = 4                           # 红方信息作战能力系数
        epsilon_b = 4                           # 蓝方信息作战能力系数
        for t in np.arange(0, T, dt):
            MoLanMdl(R, B, b_s, a_s, b_l, a_l, f_r, s_r, f_b, s_b, epsilon_r, epsilon_b, t)
            if R[-1] < 1e-6 or B[-1] < 1e-6:
                break
        print("——————————————————————————————————————————————")
        print("战斗过程预测结果为:")
        if R[-1] > B[-1]:
            print("红方将【取得胜利】!")
        else:
            print("蓝方将【取得胜利】!")
    print("——————————————————————————————————————————————")
    finalTroops(R[-1], B[-1])                   # 打印红、蓝双方最终剩余兵力
    print("——————————————————————————————————————————————")

    '''画图'''
    tPlot = np.arange(0, len(R) * dt, dt)
    plt.figure(1)
    plt.plot(tPlot, R, '--r', label='Attribution of red forces')
    plt.plot(tPlot, B, 'b', label='Attribution of blue forces')
    plt.xlabel("Time (round)")
    plt.ylabel("The number of forces")
    # plt.xlim(0, len(R) * dt)
    # plt.ylim(0, B0 + 0.5)
    plt.title("Lanchester Model Simulation"+" ("+mode+")")
    plt.legend()
    plt.show()

代码解释

(1)模式选择

# mode = "SquareLaw"
# mode = "LinearLaw"
mode = "ModernizedLanchesterModel"

这三行代码用来选择要仿真的模式。

mode = "SquareLaw"

即仿真验证平方律的Lanchester方程。

mode = "LinearLaw"

即仿真验证间瞄火力的Lanchester方程。

mode = "ModernizedLanchesterModel"

即仿真验证现代战争模式下的Lanchester方程

(2)进行仿真

if mode == "SquareLaw":                     # 采用平方律的战斗过程
    # 预测战斗进程
    predict(R0, B0, b_s, a_s, mode)
    for t in np.arange(0, T, dt):
        SquareLaw(R, B, b_s, a_s, t)
        if R[-1] < 1e-6 or B[-1] < 1e-6:
            break
elif mode == "LinearLaw":                   # 采用线性律的战斗过程
    predict(R0, B0, b_l, a_l, mode)
    for t in np.arange(0, T, dt):
        LinearLaw(R, B, b_l, a_l, t)
        if R[-1] < 1e-6 or B[-1] < 1e-6:
            break
elif mode == "ModernizedLanchesterModel":
    # 初始化参数
    f_r = 0.6                               # 红方的伪装能力系数
    s_r = 0.6                               # 红方的侦察能力
    f_b = 0.2                               # 蓝方的伪装能力系数
    s_b = 0.2                               # 蓝方的侦察能力
    epsilon_r = 4                           # 红方信息作战能力系数
    epsilon_b = 4                           # 蓝方信息作战能力系数
    for t in np.arange(0, T, dt):
        MoLanMdl(R, B, b_s, a_s, b_l, a_l, f_r, s_r, f_b, s_b, epsilon_r, epsilon_b, t)
        if R[-1] < 1e-6 or B[-1] < 1e-6:
            break

这里的三个if()判断就是用来判断执行何种模式的Lanchester方程仿真验证的。

总结

  • 这篇论文没有给出如何将连续域的Lanchester方程转换为离散域的差分方程,得研究一下如何将微分方程转换成差分方程的方法。
  • 不过,微分方程转换成离散方程再用代码来进行仿真验证,就不用费心费力地去算微分方程的解了,值得学习一下思路。

Python数值离散化后怎么使用apriori python求离散对数_算法_59