运筹优化学习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月前
|
机器学习/深度学习 人工智能 分布式计算
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
机器学习中的超参数调优是提升模型性能的关键步骤,包括网格搜索、随机搜索、贝叶斯优化和遗传算法等方法。网格搜索通过穷举所有可能的超参数组合找到最优,但计算成本高;随机搜索则在预设范围内随机采样,降低计算成本;贝叶斯优化使用代理模型智能选择超参数,效率高且适应性强;遗传算法模拟生物进化,全局搜索能力强。此外,还有多目标优化、异步并行优化等高级技术,以及Hyperopt、Optuna等优化库来提升调优效率。实践中,应结合模型类型、数据规模和计算资源选择合适的调优策略。
254 0
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
|
8月前
|
算法 调度
【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究
【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究
|
8月前
|
算法 Python
动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
动态规划法在汽车租赁问题中的实战(使用策略迭代法得到最优策略和最优价值 python实现 附源码)
101 0
【隐式动态求解】使用非线性纽马克方法的隐式动态求解研究(Matlab代码实现)
【隐式动态求解】使用非线性纽马克方法的隐式动态求解研究(Matlab代码实现)
103 0
|
算法 决策智能
投资组合优化的人工蜂群算法(Matlab代码实现)
投资组合优化的人工蜂群算法(Matlab代码实现)
150 0
|
机器学习/深度学习 算法
【路径优化】基于人工蜂群(ABC)算法和粒子群优化算法的组合求解路径优化问题(Matlab代码实现)
【路径优化】基于人工蜂群(ABC)算法和粒子群优化算法的组合求解路径优化问题(Matlab代码实现)
210 0
|
机器学习/深度学习 传感器 算法
【优化分配】基于粒子群算法和萤火虫算法求解二次分配优化问题附matlab代码
【优化分配】基于粒子群算法和萤火虫算法求解二次分配优化问题附matlab代码
|
机器学习/深度学习 传感器 算法
基于组合多策略改进的自适应哈里斯鹰算法求解单目标优化问题CEHHO附matlab代码
基于组合多策略改进的自适应哈里斯鹰算法求解单目标优化问题CEHHO附matlab代码
|
算法 Java
数学建模常用算法:迭代局部搜索算法求解tsp问题+att48算例测试【java实现--详细注释】
数学建模常用算法:迭代局部搜索算法求解tsp问题+att48算例测试【java实现--详细注释】
148 0
|
机器学习/深度学习 传感器 算法
【优化分配】基于萤火虫算法求解订单分批优化问题附Matlab代码
【优化分配】基于萤火虫算法求解订单分批优化问题附Matlab代码