明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1631|回复: 12

[其它] 河流穿越问题 算法实现

[复制链接]
发表于 2023-1-28 15:30:53 | 显示全部楼层 |阅读模式
本帖最后由 landsat99 于 2023-1-30 10:12 编辑

//   河流穿越模型
//   请给出解决方案、算法实现




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2023-2-7 13:53:42 | 显示全部楼层
原型问题:设备性能一定情况下(耗油率、载油量)的最小消耗。 并产生核心算法。


那么可以引申为另一个问题:
什么样的设备性能,对总消耗最为敏感? 降低设备耗油率、 增加设备载油量,对消耗的改善是否是线性关系?

分析如下

图形显示,
载油量接近拐点或更小,总消耗基本成 指数级增长,导致经济型极差。
耗油率,对最总消耗并不特别敏感。

因此增加油箱容量,是改善的关键因素。

  1. import numpy as np
  2. import matplotlib.pyplot as plt

  3. def boat(trip_all, fuel, wear):
  4.     dis_base = fuel / wear
  5.     dis = dis_base
  6.     n = 1
  7.     while dis < trip_all:
  8.         n = n + 1
  9.         dis = dis_base / (2 * n - 1) + dis
  10.         fuel = dis_base * n
  11.     dis = dis - dis_base / (2 * n - 1)
  12.     Rfuel = dis_base * (n - 1) + (trip_all - dis) * (2 * n - 1)
  13.     return round(Rfuel, 1)

  14. if __name__ == "__main__":
  15.     fig = plt.figure()
  16.     ax = fig.add_subplot(projection="3d")

  17.     wear = np.arange(0.8, 1.2, 0.02)
  18.     fuel = np.arange(600, 1200, 20)
  19.     wear, fuel = np.meshgrid(wear, fuel)

  20.     trip_all = 1500
  21.     rows = []
  22.     for Afuel in range(600, 1200, 20):
  23.         row = []
  24.         for Awear in range(80, 120, 2):
  25.             row.append(boat(trip_all, Afuel, Awear / 100))
  26.         rows.append(row)
  27.     total_fuel = np.array(rows)

  28.     ax.plot_surface(wear, fuel, total_fuel)
  29.     ax.set_xlabel("Oil Wear")
  30.     ax.set_ylabel("Space")
  31.     ax.set_zlabel("Total_fuel")
  32.     ax.set_title("Total Fuel Plot")
  33.     plt.show()




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2023-2-7 13:16:14 | 显示全部楼层
qjchen 发表于 2023-2-7 10:04
谢谢manhua兄的解答,不太懂是怎么能保证这个方法是最优的的证明

相关的问题网页及拓展问题

确实是有趣的问题。 感谢各位大咖朋友的交流和优秀见解

我个人理解:设备性能一定情况下(耗油率、载油量),最小消耗==最短的路径规划。
最短路径的约束条件,在终点最明显。从终点开始,倒推反向规划各节点位置及总里程,即为最小消耗。(如从其它位置开始施加约束条件,感觉难度较大。。)
发表于 2023-2-7 10:04:20 | 显示全部楼层
本帖最后由 qjchen 于 2023-2-7 17:11 编辑

谢谢mahuan兄的解答,不太懂是怎么能保证这个方法是最优的的证明

相关的问题网页及拓展问题
https://www.cnblogs.com/bugY/archive/2011/08/19/2146180.html

2020大学生建模竞赛
https://www.doc88.com/p-58861702038642.html?r=1

https://max.book118.com/html/2022/0714/5310304331004304.shtm

这些问题,都是有趣且困难,一直不太懂,学习下


发表于 2023-1-29 08:40:40 | 显示全部楼层
你的题是不是少条件了?最少就是2个加油站(出发满油)。至少消耗1500l油,也只会消耗这么多。我猜测你是不是想搞军队运粮草问题,因为军队运粮自己也会消耗粮食。或者少了时间条件。
 楼主| 发表于 2023-1-29 10:58:34 | 显示全部楼层
liuhe 发表于 2023-1-29 08:40
你的题是不是少条件了?最少就是2个加油站(出发满油)。至少消耗1500l油,也只会消耗这么多。我猜测你是不 ...

感谢您的问题反馈。为避免歧义,题目已加强修改了文字描述。

向储油点运油 也要消耗燃油。全程消耗的最小燃油量,是问题的求解。
发表于 2023-1-30 08:35:37 | 显示全部楼层
到达科考站后还回来吗?
 楼主| 发表于 2023-1-30 10:08:19 | 显示全部楼层
baitang36 发表于 2023-1-30 08:35
到达科考站后还回来吗?

感谢您的问题反馈。为避免歧义,题目已加强修改了文字描述。

科考站内有足够燃油储备,不考虑回程油料。
发表于 2023-2-3 14:42:39 | 显示全部楼层
本帖最后由 mahuan1279 于 2023-2-3 15:08 编辑

650+650/3+650/5+650/7+…+650/29=1518.317>1500,故总耗油最少为(29+1)/2*650=9750升。
 楼主| 发表于 2023-2-3 19:31:30 | 显示全部楼层
mahuan1279 发表于 2023-2-3 14:42
650+650/3+650/5+650/7+…+650/29=1518.317>1500,故总耗油最少为(29+1)/2*650=9750升。

您的模型合理。

需要注意的是:
推至最后一站(出发的第一站),是有剩余里程。 这个解貌似不是精确解。。
发表于 2023-2-3 22:31:37 来自手机 | 显示全部楼层
本帖最后由 mahuan1279 于 2023-2-3 22:33 编辑

精确解也好求。650*(27+1)/2+(1500-650-650/3-650/7-…-650/27)*29=总耗油最少

评分

参与人数 1明经币 +1 收起 理由
qjchen + 1 赞一个!

查看全部评分

 楼主| 发表于 2023-2-4 09:28:53 来自手机 | 显示全部楼层
mahuan1279 发表于 2023-2-3 22:31
精确解也好求。650*(27+1)/2+(1500-650-650/3-650/7-…-650/27)*29=总耗油最少

这组算法合理 清晰。赞一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 22:32 , Processed in 0.220388 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表