运筹优化学习03:Lingo非唯一最优解问题--油气开采构造处最优选择问题

简介: 运筹优化学习03:Lingo非唯一最优解问题--油气开采构造处最优选择问题

某油田在10个有油气构造处要选择若干个钻探采油,设第j 个构造开采时需花费aj元,投产后预计年收益为cj元,若尤其投资总额为b元,问题应选择哪几个构造开采最为有利。

1 基本问题求解

1.1 示例数据:

image.png

B = 7200;

1.2 模型构建:

gif.gif

gif.gif

gif.gif

gif.gif

1.3 代码实现

1.3.1 Latex代码:

max = \sum_{i=1}^{10}x_i * c_i
\sum_{i=1}^{10}x_i * a_i \leq b
x_i \in \{0,1\}
a_i , c_i > 0 

1.3.2 Lingo代码:

model:
sets:
CONSTRUCT/1..10/: C, A, X;
endsets
data:
a = 1000  1300  1260  1500  1420  1670  1340  1190  1720  1640;
c = 800 940 920 880 960 1000  870 840 1020  980;
b = 7200;
enddata
max = @sum(CONSTRUCT : x * c);
@sum(CONSTRUCT : x * a) <= b;
@for(CONSTRUCT : @bin(X));
end

1.3.4 解决方案

Global optimal solution found.
  Objective value:                              4720.000
  Objective bound:                              4720.000
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                             0
                       Variable           Value        Reduced Cost
                              B        7200.000            0.000000
                          C( 1)        800.0000            0.000000
                          C( 2)        940.0000            0.000000
                          C( 3)        920.0000            0.000000
                          C( 4)        880.0000            0.000000
                          C( 5)        960.0000            0.000000
                          C( 6)        1000.000            0.000000
                          C( 7)        870.0000            0.000000
                          C( 8)        840.0000            0.000000
                          C( 9)        1020.000            0.000000
                         C( 10)        980.0000            0.000000
                          A( 1)        1000.000            0.000000
                          A( 2)        1300.000            0.000000
                          A( 3)        1260.000            0.000000
                          A( 4)        1500.000            0.000000
                          A( 5)        1420.000            0.000000
                          A( 6)        1670.000            0.000000
                          A( 7)        1340.000            0.000000
                          A( 8)        1190.000            0.000000
                          A( 9)        1720.000            0.000000
                         A( 10)        1640.000            0.000000
                          X( 1)        0.000000           -800.0000
                          X( 2)        1.000000           -940.0000
                          X( 3)        1.000000           -920.0000
                          X( 4)        1.000000           -880.0000
                          X( 5)        1.000000           -960.0000
                          X( 6)        0.000000           -1000.000
                          X( 7)        0.000000           -870.0000
                          X( 8)        0.000000           -840.0000
                          X( 9)        1.000000           -1020.000
                         X( 10)        0.000000           -980.0000
                            Row    Slack or Surplus      Dual Price
                              1        4720.000            1.000000
                              2        0.000000            0.000000

2 拓展问题求解--柴油发电或电网供电

20190613210719933.png

2.1 约束表达:

定义变量yj标识开采电力来源,若为柴油机发电取值为1;若为电网供电,取值为0

gif.gif

gif.gif

2.2 Latex代码:

\sum_{i=1}^{10} x_i * y_i * d_i \leq f
\sum_{i=1}^{10} 0.3 * x_i * (1 - y_i) * d_i \leq p

3 拓展问题--增加新约束

20190613211147981.png

3.1 约束表达:

image.png

3.2 Latex代码:

0 \leqslant  x_6 - x_8 \leq 1
0 \leqslant  x_5 + x_8 \leq 1
1 \leq x_2 + x_4 \leq 2
x_7 = x_8
x_1 + x_4 + x_6 + x_9 \leq 2

Lingo源码

model:
sets:
CONSTRUCT/1..10/: C, A, X;
endsets
data:
a = 1000  1300  1260  1500  1420  1670  1340  1190  1720  1640;
c = 800 940 920 880 960 1000  870 840 1020  980;
b = 7200;
enddata
max = @sum(CONSTRUCT : x * c);
@sum(CONSTRUCT : x * a) <= b;
@for(CONSTRUCT : @bin(X));
x6 - x8 <= 1;
x6 - x8 >= 0;
x5 + x3 <= 1;
(x4 + x2) >= 1;
x8 = x7;
x1 + x4 + x6 + x9 <= 2; 
end

3.3 结果展示

 Local optimal solution found.
  Objective value:                              4720.000
  Objective bound:                              4720.000
  Infeasibilities:                              0.000000
  Extended solver steps:                               3
  Total solver iterations:                           375
                       Variable           Value        Reduced Cost
                              B        7200.000            0.000000
                             X6        0.000000            0.000000
                             X8        0.000000            0.000000
                             X5        0.000000            0.000000
                             X3        2.000000            0.000000
                             X4        0.000000            0.000000
                             X2       0.5000000E-03        0.000000
                             X7        0.000000            0.000000
                             X1        0.000000            0.000000
                             X9        0.000000            0.000000
                          C( 1)        800.0000            0.000000
                          C( 2)        940.0000            0.000000
                          C( 3)        920.0000            0.000000
                          C( 4)        880.0000            0.000000
                          C( 5)        960.0000            0.000000
                          C( 6)        1000.000            0.000000
                          C( 7)        870.0000            0.000000
                          C( 8)        840.0000            0.000000
                          C( 9)        1020.000            0.000000
                         C( 10)        980.0000            0.000000
                          A( 1)        1000.000            0.000000
                          A( 2)        1300.000            0.000000
                          A( 3)        1260.000            0.000000
                          A( 4)        1500.000            0.000000
                          A( 5)        1420.000            0.000000
                          A( 6)        1670.000            0.000000
                          A( 7)        1340.000            0.000000
                          A( 8)        1190.000            0.000000
                          A( 9)        1720.000            0.000000
                         A( 10)        1640.000            0.000000
                          X( 1)        1.000000           -800.0000
                          X( 2)        1.000000           -940.0000
                          X( 3)        0.000000           -920.0000
                          X( 4)        0.000000           -880.0000
                          X( 5)        1.000000           -960.0000
                          X( 6)        1.000000           -1000.000
                          X( 7)        0.000000           -870.0000
                          X( 8)        0.000000           -840.0000
                          X( 9)        1.000000           -1020.000
                         X( 10)        0.000000           -980.0000
                            Row    Slack or Surplus      Dual Price
                              1        4720.000            1.000000
                              2        90.00000            0.000000
                              3        1.000000            0.000000
                              4        0.000000            0.000000
                              5        0.000000            0.000000
                              6        0.000000            0.000000
                              7        0.000000            0.000000
                              8        2.000000            0.000000

4 总结梳理


(1)当两个二进制变量存在依赖关系,先决变量取值应不大于后继变量

(2)第一部分和第三部分得到两个相同最优解值,但解的表达形式不一样。应进一步探索,Lingo内部的实现机制,以获取更多形式的最优解。

更多精彩欢迎关注个人公众账号


相关文章
|
6月前
|
机器学习/深度学习
【机器学习】如何判断函数凸或非凸?(面试回答)
文章介绍了如何判断函数是凸函数还是非凸函数,包括凸函数的定义、几何意义、判定方法(一元函数通过二阶导数判断,多元函数通过Hessian矩阵的正定性判断),以及凸优化的概念和一些经典的凸优化问题。
354 1
【机器学习】如何判断函数凸或非凸?(面试回答)
|
9月前
|
存储 算法 Java
【算法设计与分析】— —实现最优载的贪心算法
【算法设计与分析】— —实现最优载的贪心算法
|
9月前
|
算法 Python
动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
101 0
|
机器学习/深度学习 算法 API
强化学习从基础到进阶-案例与实践[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代
强化学习从基础到进阶-案例与实践[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代
强化学习从基础到进阶-案例与实践[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代
强化学习从基础到进阶-常见问题和面试必知必答[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代
|
算法 Java
数学建模常用算法:迭代局部搜索算法求解tsp问题+att48算例测试【java实现--详细注释】
数学建模常用算法:迭代局部搜索算法求解tsp问题+att48算例测试【java实现--详细注释】
149 0
|
存储 算法
基于禁忌搜索的TSP问题求解仿真输出路线规划图和收敛曲线
基于禁忌搜索的TSP问题求解仿真输出路线规划图和收敛曲线
210 0
基于禁忌搜索的TSP问题求解仿真输出路线规划图和收敛曲线
|
算法 C++
【C/C++】阿克曼函数以及其数学的有限边界思维
## 在递归函数论和涉及集合的并的某些算法的复杂性研究中,有一个起重要作用的递归函数——阿克曼(Ackermann)函数,该函数是由希尔伯特的学生,德国著名数学家威尔海姆·阿克曼于1928年发现的。这是一个图灵机可计算的,但不是原始递归的函数。下面,我们介绍这个经典的递归函数,并给出其相应的计算过程。
534 0
【C/C++】阿克曼函数以及其数学的有限边界思维
|
决策智能
运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)(上)
运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)
运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)(上)
|
决策智能
运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)(下)
运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)