2022年深圳杯タイトルC自動運転用スワップステーションの会場選定とスケジューリングスキーム

2022年深圳カップC 自動運転電材車両スワップステーション 会場選定・スケジューリングスキーム

  2030 年までに「カーボン ピーキング」、2060 年までに「カーボン ニュートラル」という私の国の目標を達成するために、環境に優しい自動運転の電気自動車を物資輸送に使用することが開発トレンドになっています。電気自動車の配車計画を策定する際には、バッテリーの充電と交換にかかる時間コストを考慮する必要があり、新しい車両輸送場所の選択と配車の問題が提案されています。
  質問 1 自動運転の電気材料トラックのバッチが材料をポイント P からポイント D に輸送し、空荷で戻ってくる、
というように続きます。ポイント P とポイント D の間の双方向の同じ場所にある (高速休憩所のような) スワップ ステーションの場所、および対応する車両とバッテリー パックのスケジューリング スキームを決定するには、数学的プログラミング モデルを確立する必要があります。指定された期間内に配達を最大化する. 材料の量は、リソースの制約とバッテリーの動作モードの制約を満たしています. 付録に示されているデータに従って、計画モデルを解き、スワップ ステーションの場所を与え、1000 時間で輸送される材料の量、使用された車両の数、バッテリー パックの数、および特定のスケジューリング スキームを与えます。車両とそのバッテリーパックの。
  設問2 設問1において、ステーション建設条件を「P地点とD地点の間の各方向における電力交換所の位置を決定する」に変更し、その他の条件とタスクは質問1と同じです。
  質問 3 電力料金のピークと谷間、バッテリー パックの購入、充電および交換ステーションの建設などのコストを考慮して、1 日の最小輸送量と最低の投資および運用コストを保証するステーション建設とバッテリー パックのスケジューリング計画を策定します。 3年間の決済サイクルで。付録に記載されているデータ(デフォルトのデータはそれ自体で補足されます)に従って、具体的な計算例が示されます。問題 4 複数のピックアップ ポイントと 1 つの荷降ろしポイントについて、上記のスワップ ステーションのサイト選択と車両とバッテリー グループのスケジューリングの問題を調べます。
付録:データ形式(限定)
計算例データは、以下の形式制限の下で独自にまとめたものであり、統一試験計算例データは本選前に公開する。
  (1)P地点~D地点:走行距離10km、往復1台(レール)専用車線、車間距離200m以上
  (2)車両:1台125台、時速60km定格は 6 個のバッテリー パックです。最初はスワップ ステーションの無負荷状態で、搭載されている各バッテリー パックの SoC (充電状​​態) は 100% です。
  (3) バッテリー: 900 グループ、単一のバッテリー グループは独立して計測され、車両内の 6 つのバッテリー グループの電力消費は一貫しており、各バッテリー グループの SoC は空の車両を 3 分運転するごとに 1% 減少します。各バッテリーグループの SoC は、トラックが 2 分ごとに 1% 減少します バッテリーパックの SoC は 1% 減少します. オンボードバッテリーパックの SoC は、それが間隔内にあるときに交換できます [10 %, 25%]. 交換用バッテリ パックの SoC は 100%
  です. 各バッテリ パックが充電され、交換後に検出されてスタンバイ状態になるまでに 20 秒かかります. ロードおよびアンロードには、それぞれ 1 分かかります.
  . 自動バッテリー交換装置代金、バッテリー代金、車両代金です。

モデルの確立とソリューションの分析:

  最初に考えるべきことは、この質問です: 電力交換所からポイント P、ポイント D、ポイント P まで、バッテリー容量が 10% から 25% になるまで、バッテリー交換のために電力交換所に行き
  ます. ここに回路を描くことができます.ダイアグラム

  南側二車線道路の長さは 10km、つまり 10,000m
  で、車間距離は 200m 以上ですが、これはどういう意味ですか?
ここに画像の説明を挿入
車の長さを考慮せずに道路上に最大100台のベンツトラムがあります.
ここに画像の説明を挿入
質問は、バッテリー:900グループ、単一のバッテリーグループが独立して測定され、6つのオンボードバッテリーグループが同じ量の電力を消費すると述べました. .

  IQバランスが足りない. 6個のバッテリーをまとめて充電し、バッテリーをまとめて交換する状況を考慮していない. モデルの仮定を直接書く.単一のバッテリーが個別に交換されることを無視して、バッテリーパックは一緒に交換されます。

  バッテリーの一括交換でもあり、交換ステーションの場所、最大貨物量、時間1000h=60000min、6個のバッテリーを10%近く使用して一括交換した場合の差が影響することが分かっています。全体で 900 グループ バッテリーの使用率ですが、このバッテリー交換プログラムは計算が簡単ではありません。この質問の意味は、整数計画法と線形計画法の組み合わせを使用することを求めることです. 道路には 100 台の路面電車が走っており、残りのバッテリーはできるだけ無駄なく充電されます. そうすると、バッテリーはちょうど完全に充電されます.車が 10% になると充電されます。このサイクルは行ったり来たりします。バッテリーの交換方法は?最大の貨物量を達成できます。

  発電所の場所は簡単に計算できるのに、バッテリー交換の配電方式はそうではない理由を教えてください. これは、6 個のバッテリーがある場合、バッテリー交換方式がある場合、C6 で 1 つを選択する必要があるためです。 、 6つのバッテリー交換スキームを比較して、最適なバッテリー交換ソリューションを展開するのはIQ. なぜ6つのソリューションがあるのですか? 電力の 25%-10%=15% を行ったり来たりして、別の電力を追加したり、電力を返したりすることができますが、発電所に行くために残りの電力があることを確認する必要があります。 2回目は、正直に電気しか変えられませんよね?
ここに画像の説明を挿入

最終結果

  最初の質問と最後に、スワップ ステーションが P から D まで 5 km の場所にスワップ ステーションを建設することであることを確認します。バッテリーの交換計画についてですが、効率を最大化するためにバッテリー全体をどのように使用できると思いますか? 輸送量は車両の数と路面電車が P に到達する回数に関係し、バッテリーは車両の数と P に到達する回数に影響します。読者の皆様、この角を曲がりましたか?
  2番目の質問の最終結果は、行きと帰りの20/3kmに電力交換所を建設することです。
  3番目の質問の結果は、変化点の時点、昼と夜を変更する方法、産業用電力の時間の使用方法、電力交換戦略計画の最低価格と最高価格を
  考慮する必要があります.4番目の質問の結果は、キューイング理論アルゴリズムの
  アイデアが最終的に完成したと考える

上記は、主題に関する私の個人的な理解を表しているにすぎません
ここに画像の説明を挿入

プログラムコード例:

import math # 导⼊模块
import random # 导⼊模块
import pandas as pd # 导⼊模块 YouCans, XUPT
import numpy as np # 导⼊模块 numpy,并简写成 np
import matplotlib.pyplot as plt
from datetime import datetime
# ⼦程序:定义优化问题的⽬标函数
def cal_Energy(X, nVar, mk): # m(k):惩罚因⼦,随迭代次数 k 逐渐增⼤
p1 = (max(0, 6*X[0]+5*X[1]-60))**2
p2 = (max(0, 10*X[0]+20*X[1]-150))**2
fx = -(10*X[0]+9*X[1])
return fx+mk*(p1+p2)
# ⼦程序:模拟退⽕算法的参数设置
def ParameterSetting():
cName = "funcOpt" # 定义问题名称 YouCans, XUPT
nVar = 2 # 给定⾃变量数量,y=f(x1,..xn)
xMin = [0, 0] # 给定搜索空间的下限,x1_min,..xn_min
xMax = [8, 8] # 给定搜索空间的上限,x1_max,..xn_max
tInitial = 100.0 
tFinal = 1 
alfa = 0.98
meanMarkov = 100 # Markov链长度,也即内循环运⾏次数
scale = 0.5 # 定义搜索步长,可以设为固定值或逐渐缩⼩
return cName, nVar, xMin, xMax, tInitial, tFinal, alfa, meanMarkov, scale
# 模拟退⽕算法
def OptimizationSSA(nVar,xMin,xMax,tInitial,tFinal,alfa,meanMarkov,scale):
# ====== 初始化随机数发⽣器 ======
randseed = random.randint(1, 100)
random.seed(randseed) # 随机数发⽣器设置种⼦,也可以设为指定整数
# ====== 随机产⽣优化问题的初始解 ======
xInitial = np.zeros((nVar)) # 初始化,创建数组
for v in range(nVar):
# xInitial[v] = random.uniform(xMin[v], xMax[v]) # 产⽣ [xMin, xMax] 范围的随机实数
xInitial[v] = random.randint(xMin[v], xMax[v]) # 产⽣ [xMin, xMax] 范围的随机整数
# 调⽤⼦函数 cal_Energy 计算当前解的⽬标函数值
fxInitial = cal_Energy(xInitial, nVar, 1) # m(k):惩罚因⼦,初值为 1
# ====== 模拟退⽕算法初始化 ======
xNew = np.zeros((nVar)) # 初始化,创建数组
xNow = np.zeros((nVar)) # 初始化,创建数组
xBest = np.zeros((nVar)) # 初始化,创建数组
xNow[:] = xInitial[:] # 初始化当前解,将初始解置为当前解
xBest[:] = xInitial[:] # 初始化最优解,将当前解置为最优解
fxNow = fxInitial # 将初始解的⽬标函数置为当前值
fxBest = fxInitial # 将当前解的⽬标函数置为最优值
print('x_Initial:{:.6f},{:.6f},\tf(x_Initial):{:.6f}'.format(xInitial[0], xInitial[1], fxInitial))
recordIter = [] # 初始化,外循环次数
recordFxNow = [] # 初始化,当前解的⽬标函数值
recordFxBest = [] # 初始化,最佳解的⽬标函数值
recordPBad = [] # 初始化,劣质解的接受概率
kIter = 0 # 外循环迭代次数
totalMar = 0 # 总计 Markov 链长度
totalImprove = 0 # fxBest 改善次数
nMarkov = meanMarkov # 固定长度 Markov链
# ====== 开始模拟退⽕优化 ======
# 外循环
tNow = tInitial # 初始化当前温度(current temperature)
while tNow >= tFinal: # 外循环

kBetter = 0 # 获得优质解的次数
kBadAccept = 0 # 接受劣质解的次数
kBadRefuse = 0 # 拒绝劣质解的次数
# ---内循环,循环次数为Markov链长度
for k in range(nMarkov): # 内循环,循环次数为Markov链长度
totalMar += 1 # 总 Markov链长度计数器
# ---产⽣新解
# 产⽣新解:通过在当前解附近随机扰动⽽产⽣新解,新解必须在 [min,max] 范围内
# ⽅案 1:只对 n元变量中的⼀个进⾏扰动,其它 n-1个变量保持不变
xNew[:] = xNow[:]
v = random.randint(0, nVar-1) # 产⽣ [0,nVar-1]之间的随机数
xNew[v] = round(xNow[v] + scale * (xMax[v]-xMin[v]) * random.normalvariate(0, 1))
# 满⾜决策变量为整数,采⽤最简单的⽅案:产⽣的新解按照四舍五⼊取整
xNew[v] = max(min(xNew[v], xMax[v]), xMin[v]) # 保证新解在 [min,max] 范围内
# ---计算⽬标函数和能量差
# 调⽤⼦函数 cal_Energy 计算新解的⽬标函数值
fxNew = cal_Energy(xNew, nVar, kIter)
deltaE = fxNew - fxNow
# ---按 Metropolis 准则接受新解
# 接受判别:按照 Metropolis 准则决定是否接受新解
if fxNew < fxNow: # 更优解:如果新解的⽬标函数好于当前解,则接受新解
accept = True
kBetter += 1
else: # 容忍解:如果新解的⽬标函数⽐当前解差,则以⼀定概率接受新解
pAccept = math.exp(-deltaE / tNow) # 计算容忍解的状态迁移概率
if pAccept > random.random():
accept = True # 接受劣质解
kBadAccept += 1
else:
accept = False # 拒绝劣质解
kBadRefuse += 1
# 保存新解
if accept == True: # 如果接受新解,则将新解保存为当前解
xNow[:] = xNew[:]
fxNow = fxNew
if fxNew < fxBest: # 如果新解的⽬标函数好于最优解,则将新解保存为最优解
fxBest = fxNew
xBest[:] = xNew[:]
totalImprove += 1
scale = scale*0.99 # 可变搜索步长,逐步减⼩搜索范围,提⾼搜索精度
# ---内循环结束后的数据整理
# 
pBadAccept = kBadAccept / (kBadAccept + kBadRefuse) # 劣质解的接受概率
recordIter.append(kIter) # 当前外循环次数
recordFxNow.append(round(fxNow, 4)) # 当前解的⽬标函数值
recordFxBest.append(round(fxBest, 4)) # 最佳解的⽬标函数值
recordPBad.append(round(pBadAccept, 4)) # 最佳解的⽬标函数值

アイデアがついに完成しました、邪魔を歓迎します

おすすめ

転載: blog.csdn.net/weixin_43292788/article/details/125996419