예제 #1
0
def run_agent_n_day_n(agent_n, car_max_energy=22000):
    sun = terawatt_model.Sun()
    photovoltaic = terawatt_model.Photovoltaic()
    car1 = terawatt_model.Car(agent_n['car1_max_energy'])
    car2 = terawatt_model.Car(agent_n['car2_max_energy'])
    provider = terawatt_model.Provider()
    battery = terawatt_model.Battery()
    electrolysis = terawatt_model.Electrolysis()
    methanization = terawatt_model.Methanization()
    cogeneration = terawatt_model.Cogeneration()
    time_start = datetime.datetime(2016, 9, 24, 0, 0, 0, 0)

    # Car starts fully charged
    car1.energy_now.electrical = car_max_energy
    car2.energy_now.electrical = car_max_energy

    battery.battery_current_energy = agent_n['battery_energy']
    cogeneration.energy_now.chemical = agent_n['cogeneration_energy']

    # Subtract power required for drive of day
    agent_n['car1_distance_additional'] = random.randint(0, 20)
    agent_n['car2_distance_additional'] = random.randint(0, 20)
    # Now drive somewhere afterwards the energy is harvested for car charging
    agent_n['car1_drive_success'] = car1.drive(
        agent_n['car1_distance_work'] + agent_n['car1_distance_additional'])
    agent_n['car2_drive_success'] = car2.drive(
        agent_n['car2_distance_work'] + agent_n['car2_distance_additional'])

    for dt in range(0, 3600 * 24 - 1, terawatt_model.timestep):
        time = time_start + datetime.timedelta(0, dt)  # days, seconds

        power = sun.update(time=time)
        power = photovoltaic.update(power)

        power = battery.update(power, state='consume')
        power = electrolysis.update(
            power,
            state='both',
            power_requested=methanization.get_power_in_max())
        power = methanization.update(
            power,
            state='both',
            power_requested=methanization.get_power_out_max())
        power = cogeneration.update(power, state='consume')

        # Consumers request
        power_requested = terawatt_model.Power()
        if agent_n['charge_car1_start'] <= time.hour <= agent_n[
                'charge_car1_start'] + agent_n['charge_car1_time']:
            # cannot compare against full charge. Due to incremental energies we never reach full charge exactly.
            if car1.energy_now.electrical < 0.99 * car1.energy_max.electrical:
                power_requested.electrical += car1.get_power_in_max(
                ).electrical

        if agent_n['charge_car2_start'] <= time.hour <= agent_n[
                'charge_car2_start'] + agent_n['charge_car2_time']:
            if car2.energy_now.electrical < 0.99 * car2.energy_max.electrical:
                power_requested.electrical += car2.get_power_in_max(
                ).electrical

        power_requested.chemical += cogeneration.power_conversion_electrical_to_chemical(
            power_requested.electrical).chemical
        power = cogeneration.update(power,
                                    state='provide',
                                    power_requested=power_requested)
        power_requested.electrical -= power.electrical
        power = battery.update(power,
                               state='provide',
                               power_requested=power_requested)

        # Consumers consume
        if agent_n['charge_car1_start'] <= time.hour <= agent_n[
                'charge_car1_start'] + agent_n['charge_car1_time']:
            power = car1.update(power)

        if agent_n['charge_car2_start'] <= time.hour <= agent_n[
                'charge_car2_start'] + agent_n['charge_car2_time']:
            power = car2.update(power)

        power = provider.update(power)

# Excess energy will come from the provider but we have to pay for it
    agent_n['car1_energy'] = car_max_energy - car1.energy_now.electrical
    agent_n['car2_energy'] = car_max_energy - car2.energy_now.electrical
    # Battery will only buffer internal and remain its state
    agent_n['battery_energy'] = battery.energy_now.electrical
    agent_n['cogeneration_energy'] = cogeneration.energy_now.chemical

    return agent_n
예제 #2
0
def run_agent_n_day_n(agent_n):
    sun = terawatt_model.Sun()
    photovoltaic = terawatt_model.Photovoltaic()
    car1 = terawatt_model.Car()
    car2 = terawatt_model.Car()
    provider = terawatt_model.Provider()
    battery = terawatt_model.Battery()
    electrolysis = terawatt_model.Electrolysis()
    methanization = terawatt_model.Methanization()
    cogeneration = terawatt_model.Cogeneration()
    time_start = datetime.datetime(2016, 9, 24, 0, 0, 0, 0)

    car1.energy_now.electrical = agent_n['car1_energy']
    car2.energy_now.electrical = agent_n['car2_energy']
    battery.battery_current_energy = agent_n['battery_energy']
    cogeneration.energy_now.chemical = agent_n['cogeneration_energy']

    max_energy = dict(
        energy=0,
        timestamp=0,
    )

    for dt in range(0, 3600 * 24 - 1, terawatt_model.timestep):
        time = time_start + datetime.timedelta(0, dt)  # days, seconds

        power = sun.update(time=time)
        power = photovoltaic.update(power)

        power = battery.update(power, state='consume')
        power = electrolysis.update(
            power,
            state='both',
            power_requested=methanization.get_power_in_max())
        power = methanization.update(
            power,
            state='both',
            power_requested=methanization.get_power_out_max())
        power = cogeneration.update(power, state='consume')

        # Consumers request
        power_requested = terawatt_model.Power()
        if agent_n['charge_car1_start'] <= time.hour <= agent_n[
                'charge_car1_start'] + agent_n['charge_car1_time']:
            # cannot compare against full charge. Due to incremental energies we never reach full charge exactly.
            if car1.energy_now.electrical < 0.99 * car1.energy_max.electrical:
                power_requested.electrical += car1.get_power_in_max(
                ).electrical

        if agent_n['max_energy_timestamp'] <= dt <= agent_n[
                'max_energy_timestamp'] + agent_n['charge_car2_time'] * 3600:
            if car2.energy_now.electrical < 0.99 * car2.energy_max.electrical:
                power_requested.electrical += car2.get_power_in_max(
                ).electrical

        power_requested.chemical += cogeneration.power_conversion_electrical_to_chemical(
            power_requested.electrical).chemical
        power = cogeneration.update(power,
                                    state='provide',
                                    power_requested=power_requested)
        power_requested.electrical -= power.electrical
        power = battery.update(power,
                               state='provide',
                               power_requested=power_requested)

        # Consumers consume
        if agent_n['charge_car1_start'] <= time.hour <= agent_n[
                'charge_car1_start'] + agent_n['charge_car1_time']:
            power = car1.update(power)

        if agent_n['max_energy_timestamp'] <= dt <= agent_n[
                'max_energy_timestamp'] + agent_n['charge_car2_time'] * 3600:
            power = car2.update(power)

        power = provider.update(power)

        # Find energy maximum for today
        current_total_energy = photovoltaic.energy_now.electrical + battery.energy_now.electrical + cogeneration.energy_now.electrical
        if current_total_energy > max_energy['energy']:
            max_energy['energy'] = current_total_energy
            max_energy['timestamp'] = dt

    # Subtract power required for drive of day
    agent_n['car1_distance_additional'] = random.randint(0, 10)
    agent_n['car2_distance_additional'] = random.randint(0, 10)
    agent_n['car1_drive_success'] = car1.drive(
        agent_n['car1_distance_work'] + agent_n['car1_distance_additional'])
    agent_n['car2_drive_success'] = car2.drive(
        agent_n['car2_distance_work'] + agent_n['car2_distance_additional'])
    agent_n['car1_energy'] = car1.energy_now.electrical
    agent_n['car2_energy'] = car2.energy_now.electrical
    agent_n['battery_energy'] = battery.energy_now.electrical
    agent_n['cogeneration_energy'] = cogeneration.energy_now.chemical
    agent_n['max_energy_timestamp'] = max_energy['timestamp']

    return agent_n