Оптимизация проблемы ветвления, проблема выбора правильного пути - PullRequest
0 голосов
/ 21 февраля 2020

Я работаю над поиском оптимального пути между двумя состояниями заряда для электромобиля c. У меня есть функция, которая строит все возможные пути из начального состояния заряда, учитывая, что он может либо заряжать, разряжать, либо ничего не делать, как показано на рисунке ниже. enter image description here

Функция работает и выдает правильные пути, но я хочу исключить пути, которые не могли привести к окончательному состоянию заряда. Я пытался использовать оператор if, но некоторые пути не исключаются, что должно быть. Любая помощь в том, где я ошибаюсь с логикой c, была бы очень полезна, спасибо !!

import pandas as pd
import numpy as np
import scipy as sp
import gurobipy as gpy
import matplotlib.pyplot as plt
%matplotlib inline
pd.set_option('display.max_rows', 500)
#SOCs need to be converted to float numbers
#Initial SOC
iSOC=float(50)
#Target SOC
tSOC=float(56)
step1=2
step=5
def myFunction(base, plus):
#     variable to hold the number of steps left
#     variable needs to be one greater than step because length of bas starts at 1, not 0
    numOfStepsLeft = step + 1
    #Initialize result array
    result = []
    #For Each tuple in entry
    for bas in base:
        #Get Last Element
        lastElem = bas[-1:][0]
#         if the absolute value of the terminal state of charge minus the last element
#         in the row is greater the the number of steps left times the charge amount per step
        if(abs(tSOC - lastElem)>((numOfStepsLeft-len(bas))*step1)):
            print(base[-1])
#             ##delete the row that contains the lastElem which satisifies above condition
            del base[-1:][0]
#             ##continue key word is used to skip inner for loop and go to next iteration of 
#             ##outer for loop
            continue
        #For Each element to add
        for x in plus:
            # Append a tuple composed of base + sum(lastElement & element to add)
            result.append(bas + ( (lastElem+x),) )
    # Return result
    return result
df = [(iSOC,)]
for i in range(step):
#     add = [step1,0,-step1]
    df=myFunction(df, [step1,0,-step1])
#df1 is possible options to charge/discharge the battery with the defined step size in the given time
df1=pd.DataFrame(df) 
print(df1)

Кроме того, любые идеи относительно лучшей стратегии сокращения числа путей были бы очень добро пожаловать. Спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...