как соотнести два списка? - PullRequest
2 голосов
/ 27 мая 2020

У меня есть два списка и несколько параметров. С помощью этих входов я заряжаю и разряжаю аккумулятор. В первом списке есть нули и единицы. 0 означает разрядку аккумулятора, а 1 означает зарядку аккумулятора. Во втором списке указаны значения, с помощью которых мы можем заряжать аккумулятор. Параметры батареи:

Max_capacity = 600MW
initial_capacity = 0MW
Duration = 4hours
battery size = 150MW

на самом деле в обоих списках 8760 значений, но я просто показываю несколько

signal = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
excess_energy = [0,100,90,160,20,0,0,0,0,0,50,60,70,0]

Итак, здесь есть несколько условий:

  1. батарея может заряжаться, только когда сигнал равен 1, а избыточная энергия больше 0.
  2. если избыточная энергия больше 150 МВт, тогда батарея будет заряжаться только мощностью 150 МВт или если она меньше, чем он может заряжать с любым значением избыточной энергии.
  3. батарея может разряжаться, только когда сигнал равен 0 с 150 МВт за фиксированное время.
  4. батарея не может разрядиться ниже 0 и не может заряжать с ожидаемой мощностью более 600 МВт:

    enter image description here

Мой подход:

battery_size = 150
duration = 4
initial_capacity = 0
max_capacity = 600
ans_charged = []
ans_discharged = []
discharge = 0
days_counter = 0
signal = [0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1]  # Reversed the polarity
excess_energy = [0, 100, 90, 160, 20, 0, 0, 0, 0, 0, 50, 60, 70, 0]
for decider, ex_energy in zip(signal, excess_energy):
    days_counter += 1  # days counter because every new day all the counters are reset
    if decider == 1 and discharge < duration and max_capacity >= initial_capacity >=0:  # at 0 we charging and at 1 we are discharging
        initial_capacity -= battery_size
        if initial_capacity >= 0:
            ans_charged.append(initial_capacity)
            ans_discharged.append(0)
            discharge += 1
        else:
            ans_charged.append(0)
            ans_discharged.append(0)
            discharge += 1
    elif decider == 1:
        ans_charged.append(0)
        ans_discharged.append(0)
    elif decider == 0 and ex_energy > 0:
        if ex_energy < 150 and max_capacity >= initial_capacity >= 0:
            initial_capacity += ex_energy
            if initial_capacity <= max_capacity:
                ans_discharged.append(initial_capacity)
                ans_charged.append(0)
            else:
                ans_discharged.append(max_capacity)
                ans_charged.append(0)
        else:
            initial_capacity += 150
        if initial_capacity <= max_capacity:
            ans_discharged.append(initial_capacity)
            ans_charged.append(0)
        else:
            ans_discharged.append(max_capacity)
            ans_charged.append(0)
    elif decider == 0:
        ans_discharged.append(0)
        ans_charged.append(0)
        discharge = 0
    if days_counter == 24:
        days_counter = 0
        charge = 0
        discharge = 0
    print(ans_discharged)
    print(ans_charged)

мой вывод:

Charge = [0, 100, 190, 340, 0, 0, 0, 0, 0, 0, 40, 100, 0, 0]
Discharge = [0, 0, 0, 0, 190, 40, 0, 0, 0, 0, 0, 0, 0, 0]

Я знаю, что это большой вопрос, но может ли кто-нибудь помочь с ответом, потому что, как вы можете видеть, я получаю 40 и 100 вместо 50 и 110

1 Ответ

2 голосов
/ 27 мая 2020

Ваш код очень сложный и его можно упростить:

signal = [1,1,1,1,0,0,0,0,0,1,1,1,0,0]
excess_energy = [0,100,90,160,20,0,0,0,0,0,50,60,70,0]
charge = []
discharge = []

current = 0
for i, value in enumerate(signal):
    if value == 0 : # Discharging
        current = max(current - 150, 0)
        discharge.append(current)
        charge.append(0)
    else:
        current = current + min(excess_energy[i], 150)
        charge.append(current)
        discharge.append(0)

print(charge)
print(discharge)
...