【运筹学】线性规划数学模型标准形式 ( 标准形式 | 目标函数转化 | 决策变量转化 | 约束方程转化 | 固定转化顺序 | 标准形式转化实例 ) ★★





一、线性规划标准形式



线性规划标准形式 :

m a x Z = ∑ j = 1 n c j x j max Z = \sum_{j = 1}^{n} c_j x_j maxZ=j=1ncjxj
s . t { ∑ j = 1 n a i j x j = b i i = 1 , 2 , ⋯   , m x j ≥ 0 j = 1 , 2 , ⋯   , n s.t \begin{cases} \sum_{j = 1}^{n} a_{ij} x_j = b_i & i = 1,2,\cdots,m \\ \\ x_j \geq 0 & j= 1, 2,\cdots,n \end{cases} s.tj=1naijxj=bixj0i=1,2,,mj=1,2,,n


线性规划标准形式特点 :

  • 1. 目标函数 : 目标函数都是求最大值 , 如果出现最小值 , 那么将其转为求最大值的形式 ;
  • 2. 约束条件 : 约束条件都是等式方程 , 等式右侧的常数项 b i b_i bi 大于等于 0 0 0 ;
  • 3. 决策变量 : 决策变量 x j x_j xj 大于等于 0 ;

约定 : 决策变量个数为 n n n 个 , 约束条件不等式个数为 m m m 个 , 约束条件不等式的系数为一个 m × n m \times n m×n 矩阵 , m m m n n n 列的矩阵 ;





二、线性规划 普通形式 -> 标准形式 目标函数 转化



目标函数 转换 : 求极小值 转为 求极大值 ;

如果目标函数是
m i n W = ∑ c j x j \rm min W = \sum c_j x_j minW=cjxj
可以将目标函数乘以 − 1 -1 1 ,
− m i n W = − ∑ c j x j \rm - min W = -\sum c_j x_j minW=cjxj
W W W 是大于 0 0 0 的数 , W W W 的最小值时 , − W -W W 是最大值 , W W W 是最大值时 , − W -W W 是最小值 , 这里令 Z = − W Z = -W Z=W , 可以得到
m a x Z = − m i n W = − ∑ c j x j \rm max Z = -minW = -\sum c_j x_j maxZ=minW=cjxj





三、线性规划 普通形式 -> 标准形式 无约束的决策变量转化



无约束变量 转换 : 所有的决策变量必须 ≥ 0 \geq 0 0

如果某个决策变量 x j x_j xj 没有任何约束 , 在标准形式中 , 所有的决策变量必须都大于等于 0 ;

这里令 x j = x j ′ − x j ′ ′ x_j = x_j' - x_j'' xj=xjxj , 其中 x j ′ ≥ 0 x_j' \geq 0 xj0 , x j ′ ′ ≥ 0 x_j'' \geq 0 xj0





四、线性规划 普通形式 -> 标准形式 约束方程 转化



约束方程 转换 : 在线性规划中 , 约束方程都是等式 , 需要将不等式 ( ≤ \leq , ≥ \geq ) 转为 等式 ( = = = ) ;

1. 针对小于等于的不等式 :

∑ a i j x j ≤ b i \sum a_{ij} x_j \leq b_i aijxjbi

等式左边比右边小 , 左侧加上一个 变量 x n + i x_{n+i} xn+i 与右侧相等 ;

∑ a i j x j + x n i = b i \sum a_{ij} x_j + x_{ni} = b_i aijxj+xni=bi

这个 x n + i x_{n+i} xn+i 称为松弛变量 ;



2. 针对大于等于的不等式 :

∑ a i j x j ≥ b i \sum a_{ij} x_j \geq b_i aijxjbi

等式左边比右边小 , 左侧加上一个 变量 x n + i x_{n+i} xn+i 与右侧相等 ;

∑ a i j x j − x n i = b i \sum a_{ij} x_j - x_{ni} = b_i aijxjxni=bi

这个 x n + i x_{n+i} xn+i 称为剩余变量 ;





五、线性规划 普通形式 -> 标准形式 小于等于 0 的变量转化



如果出现 变量约束 x j ≤ 0 x_j \leq 0 xj0 , 需要将该变量约束转为大于等于 0 ( ≥ 0 \geq 0 0 ) 的情况 ;

当前 x j ≤ 0 x_j \leq 0 xj0 , 令 x j ′ = − x j x_j' = -x_j xj=xj , 此时 x j ′ ≥ 0 x_j' \geq 0 xj0 ;





六、线性规划 普通形式 -> 标准形式 转化顺序说明



① 先处理变量没有约束的问题 , 需要用两个 ≥ 0 \geq 0 0 的变量替换原来的变量 ;

这里特别注意 , 之后处理 约束方程 , 每个步骤都要讲该变量替换掉 ;
该步骤优先级最高 ;

② 在处理约束方程 , 如果是 ≤ \leq 不等式 , 需要在不等式左侧加入松弛变量 , 将不等式转为等式 ; 如果是 ≥ \geq 不等式 , 不等式左侧需要减去一个 剩余变量 , 将不等式转为等式 ;

该处理过程会增加新的变量 , 如松弛变量或剩余变量 , 优先级 低于 处理没有变量约束 的问题 ;

③ 约束方程等式右侧常数必须大于 0 0 0 , 如果右侧的常数小于 0 0 0 , 在等式左右两侧都乘以 − 1 -1 1 ;

④ 先将之前 替换 或 新增的变量加入到目标函数中 , 在处理最大值最小值的问题 , 如果目标函数求最大值 , 什么都不用做 , 如果目标函数求最小值 , 需要将 求最小值的目标函数转为求最大值的目标函数 , 两边乘以 − 1 -1 1 ;

目标函数需要将之前所有的变量都总结到一起 , 上述两个步骤都会增加新的变量 , 因此转换目标函数的工作放在最后 ;


自下而上 : 变量约束都大于等于 0 0 0 , 约束不等式转等式 , 约束方程右侧大于 0 0 0 , 目标函数必须求最大值 ;





七、线性规划 普通形式 -> 标准形式 转化实例



下面是线性规划问题模型 , 将其转化为标准形式 :

m i n W = − 2 x 1 + x 2 + 3 x 3 { 5 x 1 + x 2 + x 3 ≤ 7 x 1 − x 2 − 4 x 3 ≥ 2 − 3 x 1 + x 2 + 2 x 3 = − 5 x 1 ≥ 0 , x 2 ≥ 0 , x 3 无 约 束 \begin{array}{lcl}min W = -2x_1 + x_2 + 3x_3 \\ \\ \\ \begin{cases} 5x_1 + x_2 + x_3 \leq 7 \\ \\ x_1 - x_2 - 4x_3 \geq 2 \\ \\ -3x_1 + x_2 + 2x_3 = -5 \\ \\ x_1 \geq 0 , x_2 \geq 0 , x_3 无约束 \end{cases} \end{array} minW=2x1+x2+3x35x1+x2+x37x1x24x323x1+x2+2x3=5x10,x20,x3

1. 处理变量无约束的问题 ( 变量必须大于 0 )

处理决策变量 x 3 x_3 x3 无约束的问题 , 在标准形式中 , 所有的变量必须都 ≥ 0 \geq 0 0 ;
这里使用 x 3 ′ − x 3 ′ ′ x_3' - x_3'' x3x3 代替 x 3 x_3 x3 , 新增加的两个变量
x 3 ′ , x 3 ′ ′ ≥ 0 x_3' , x_3'' \geq 0 x3,x30

注意之后的每个步骤都要考虑 将 x 3 x_3 x3 转为 ( x 3 ′ − x 3 ′ ′ ) ( x_3' - x_3'' ) (x3x3) ;


2. 约束方程 5 x 1 + x 2 + x 3 ≤ 7 5x_1 + x_2 + x_3 \leq 7 5x1+x2+x37 转化 ( 松弛变量 )

该约束条件是 ≤ \leq 不等式 , 需要在左侧加上 松弛变量 x 4 x_4 x4 , 将 小于等于不等式 转为等式 ;
5 x 1 + x 2 + ( x 3 ′ − x 3 ′ ′ ) + x 4 = 7 5x_1 + x_2 + ( x_3' - x_3'' ) + x_4 = 7 5x1+x2+(x3x3)+x4=7


3. 约束方程 x 1 − x 2 − 4 x 3 ≥ 2 x_1 - x_2 - 4x_3 \geq 2 x1x24x32 转化 ( 剩余变量 )

该约束条件是 ≥ \geq 不等式 , 需要在左侧减去 剩余变量 x 5 x_5 x5 , 将 大于等于不等式 转为等式 ;
x 1 − x 2 − 4 ( x 3 ′ − x 3 ′ ′ ) − x 5 = 2 x_1 - x_2 - 4( x_3' - x_3'' ) - x_5 = 2 x1x24(x3x3)x5=2


4. 约束方程 − 3 x 1 + x 2 + 2 x 3 = − 5 -3x_1 + x_2 + 2x_3 = -5 3x1+x2+2x3=5 转化 ( 右侧常数转正数 )

该式子是等式 , 但是右侧常数小于 0 0 0 , 这里需要将右侧的常数转化为正数 , 在方程两边乘以 − 1 -1 1 ;

原 式 : − 3 x 1 + x 2 + 2 x 3 = − 5 两 边 乘 以 − 1 : ( − 1 ) × ( − 3 x 1 + x 2 + 2 x 3 ) = ( − 1 ) × ( − 5 ) 最 终 结 果 : 3 x 1 − x 2 − 2 ( x 3 ′ − x 3 ′ ′ ) = 5 \begin{array}{lcl}\\ 原式 : & -3x_1 + x_2 + 2x_3 = -5 \\ \\ 两边乘以 -1 : & (-1) \times ( -3x_1 + x_2 + 2x_3 ) = (-1) \times ( -5 ) \\ \\ 最终结果 : & 3x_1 - x_2 - 2( x_3' - x_3'' ) = 5 \end{array} :1::3x1+x2+2x3=5(1)×(3x1+x2+2x3)=(1)×(5)3x1x22(x3x3)=5


5. 目标函数转化

转化顺序说明 : 在处理上述转化时 , 需要加入新的变量 , 如 无约束的变量需要增加两个变量 , 约束方程的 松弛变量 和 剩余变量 , 因此目标函数最后转化 ;

( 1 ) 将新增的变量加入

原目标函数为 :
m i n W = − 2 x 1 + x 2 + 3 ( x 3 ′ − x 3 ′ ′ ) min W = -2x_1 + x_2 + 3( x_3' - x_3'' ) minW=2x1+x2+3(x3x3)
新增的变量 :

  • ① 之前 x 3 x_3 x3 没有约束变量 , 使用 x 3 ′ , x 3 ′ ′ x_3' , x_3'' x3,x3 代替 ;
  • ② 处理 ≤ \leq 不等式时 , 加入了 x 4 x_4 x4 松弛变量 ;
  • ③ 处理 ≥ \geq 不等式时 , 加入了 x 5 x_5 x5 剩余变量 ;

此时加入 新增变量 后的 目标函数 为 :

m i n W = − 2 x 1 + x 2 + 3 ( x 3 ′ − x 3 ′ ′ ) + 0 x 4 + 0 x 5 min W = -2x_1 + x_2 + 3 ( x_3' - x_3'' ) + 0x_4 + 0x_5 minW=2x1+x2+3(x3x3)+0x4+0x5

( 2 ) 最小值 转 最大值

标准形式的目标函数是求最大值 , 这里在上面加入变量的结果的基础上 , 两边乘以 − 1 -1 1 , 得到如下公式 :

m a x Z = 2 x 1 − x 2 − 3 ( x 3 ′ − x 3 ′ ′ ) + 0 x 4 + 0 x 5 max Z = 2x_1 - x_2 - 3( x_3' - x_3'' ) + 0x_4 + 0x_5 maxZ=2x1x23(x3x3)+0x4+0x5


6. 最终结果 :

m a x Z = 2 x 1 − x 2 − 3 ( x 3 ′ − x 3 ′ ′ ) + 0 x 4 + 0 x 5 { 5 x 1 + x 2 + ( x 3 ′ − x 3 ′ ′ ) + x 4 = 7 x 1 − x 2 − 4 ( x 3 ′ − x 3 ′ ′ ) − x 5 = 2 3 x 1 − x 2 − 2 ( x 3 ′ − x 3 ′ ′ ) = 5 x 1 , x 2 , x 3 ′ , x 3 ′ ′ , x 4 , x 5 ≥ 0 \begin{array}{lcl} max Z = 2x_1 - x_2 - 3( x_3' - x_3'' ) + 0x_4 + 0x_5 \\ \\ \\ \begin{cases} 5x_1 + x_2 + ( x_3' - x_3'' ) + x_4 = 7 \\ \\ x_1 - x_2 - 4( x_3' - x_3'' ) - x_5 = 2 \\ \\ 3x_1 - x_2 - 2( x_3' - x_3'' ) = 5 \\ \\ x_1 , x_2 , x_3' , x_3'', x_4 , x_5 \geq 0 \end{cases} \end{array} maxZ=2x1x23(x3x3)+0x4+0x55x1+x2+(x3x3)+x4=7x1x24(x3x3)x5=23x1x22(x3x3)=5x1,x2,x3,x3,x4,x50

Java 8 运筹学数学模型主要使用数学建模和线性规划算法等技术,来解决实际生活中的问题。以下是一个简单的 Java 8 运筹学数学模型的例子,用来解决货车配送问题。 假设有一家超市需要配送货物到不同的客户处,每个客户有不同的需求量和配送距离,每辆货车可以搭载的货物量和行驶距离也是有限制的。现在需要设计一种货车配送方案,使得成本最小,同时能够满足客户的需求,并且所有的车辆都能够在规定时间内完成配送任务。 问题建模 - 定义变量:$x_{ij}$ 表示将货车 $i$ 分配给客户 $j$ 的数量。 - 定义目标函数:$\min \sum_{i=1}^{m} \sum_{j=1}^{n} c_{ij} x_{ij}$,其中 $c_{ij}$ 表示将货车 $i$ 配送给客户 $j$ 的成本。 - 定义约束条件: 1. 每个客户只能由一辆货车配送:$\sum_{i=1}^{m} x_{ij} = 1$,$j=1,2,\cdots,n$。 2. 每辆货车分配的货物量不能超过其最大载重量:$\sum_{j=1}^{n} a_{ij} x_{ij} \leq b_i$,$i=1,2,\cdots,m$。 3. 每辆货车行驶距离不能超过其最大行驶距离:$\sum_{j=1}^{n} d_{ij} x_{ij} \leq e_i$,$i=1,2,\cdots,m$。 其中 $a_{ij}$ 表示将货车 $i$ 配送给客户 $j$ 的货物量,$b_i$ 表示货车 $i$ 的最大载重量,$d_{ij}$ 表示将货车 $i$ 配送给客户 $j$ 的行驶距离,$e_i$ 表示货车 $i$ 的最大行驶距离。 线性规划算法实现 使用 Java 8 的运筹学数学模型库 Apache Commons Math,可以很方便地实现线性规划算法。以下是 Java 8 货车配送问题的线性规划求解代码: ```java import org.apache.commons.math3.optim.linear.LinearConstraint; import org.apache.commons.math3.optim.linear.LinearObjectiveFunction; import org.apache.commons.math3.optim.linear.Relationship; import org.apache.commons.math3.optim.linear.SimplexSolver; import java.util.ArrayList; import java.util.List; public class VehicleRoutingProblem { private double[][] costs; // 配送成本矩阵 private double[] demands; // 客户需求量数组 private double[] capacities; // 货车载重量数组 private double[] distances; // 货车行驶距离数组 private double[] quantities; // 货车配送量数组 public VehicleRoutingProblem(double[][] costs, double[] demands, double[] capacities, double[] distances) { this.costs = costs; this.demands = demands; this.capacities = capacities; this.distances = distances; this.quantities = new double[capacities.length]; } public void solve() { int m = capacities.length; // 货车数量 int n = demands.length; // 客户数量 int numVariables = m * n; // 变量数量 int numConstraints = m + n + m; // 约束条件数量 LinearObjectiveFunction objective = new LinearObjectiveFunction(new double[numVariables], 0); // 目标函数 List<LinearConstraint> constraints = new ArrayList<>(); // 约束条件 // 客户只能被分配给一辆货车 for (int j = 0; j < n; j++) { double[] coeffs = new double[numVariables]; for (int i = 0; i < m; i++) { coeffs[i * n + j] = 1; } constraints.add(new LinearConstraint
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值