Untitled
unknown
python
19 days ago
6.9 kB
1
Indexable
Never
import numpy as np import polars as pl from polars import col, DataFrame from functools import lru_cache from line_profiler import profile import logging from sys import stdout from os import environ def load_problem_data(): # Load demand data and other relevant data return [pl.DataFrame(df) for df in load_problem_data()] @profile def get_my_solution( demand, assertions_enabled = False, log_info = False, parameters = Parameters(), return_stock_log = False ): # Step 1: Load problem data demand = pl.DataFrame(demand) _, datacenters, servers, selling_prices, elasticity = [pl.DataFrame(df) for df in load_problem_data()] # Step 2: Calculate need need = calculate_need(demand, datacenters, servers, elasticity) # Step 3: Harvest from expiry pool harvested_servers = harvest_from_expiry_pool(datacenters, servers, need) # Step 4: Move servers moved_servers = move_servers(datacenters, servers, demand) # Step 5: Purchase purchased_servers = purchase_servers(datacenters, servers, demand) # Step 6: Simulate profitable scenarios best_scenario = simulate_profitable_scenarios(demand, datacenters, servers, elasticity, moved_servers, purchased_servers) # Step 7: Return the best scenario return best_scenario def calculate_need(demand, datacenters, servers, elasticity): # Calculate total capacity needed to meet demand at each time step need = np.sum(datacenters[t]["capacity"] for t in range(len(datacenters))) return need def harvest_from_expiry_pool(datacenters, servers, need): # Harvest servers from the expired pool based on their capacity and elasticity harvested_servers = [] for datacenter in datacenters: for server in datacenter["servers"]: if server["capacity"] > 0 and is_profitable_server(datacenter, server): harvested_servers.append({"time_step": server["time_step"], "datacenter_id": datacenter["id"], "server_generation": server["generation"], "server_id": compress(i := i + 1).decode()}) return harvested_servers def move_servers(datacenters, servers, demand): # Move servers between datacenters based on their capacity and the demand at each time step moved_servers = [] for datacenter in datacenters: for server in datacenter["servers"]: if is_profitable_server(datacenter, server) and can_move_server(datacenter, server, demand): moved_servers.append({"time_step": server["time_step"], "datacenter_id": datacenter["id"], "server_generation": server["generation"], "server_id": compress(i := i + 1).decode()}) return moved_servers def purchase_servers(datacenters, servers, demand): # Purchase servers from the market based on their capacity and the demand at each time step purchased_servers = [] for datacenter in datacenters: for server in datacenter["servers"]: if is_profitable_server(datacenter, server) and can_purchase_server(datacenter, server, demand): purchased_servers.append({"time_step": server["time_step"], "datacenter_id": datacenter["id"], "server_generation": server["generation"], "server_id": compress(i := i + 1).decode()}) return purchased_servers def simulate_profitable_scenarios(demand, datacenters, servers, elasticity, moved_servers, purchased_servers): # Simulate different scenarios of server purchases and moves to determine the most profitable one best_scenario = None for i in range(10): scenario = simulate_scenario(demand, datacenters, servers, elasticity, moved_servers, purchased_servers) if is_profitable_scenario(scenario): best_scenario = scenario return best_scenario def is_profitable_server(datacenter, server): # Check if the server is profitable based on its capacity and the demand at each time step return server["capacity"] > 0 and can_make_profit(datacenter, server, demand) def can_move_server(datacenter, server): # Check if the server can be moved between datacenters based on its capacity and the demand at each time step return server["capacity"] > 0 and can_move_server_between_datacenters(datacenter, server) def can_purchase_server(datacenter, server): # Check if the server can be purchased from the market based on its capacity and the demand at each time step return server["capacity"] > 0 and can_purchase_server_from_market(datacenter, server) def is_profitable_scenario(scenario): # Check if the scenario is profitable based on the demand and capacity of the servers and datacenters return np.sum(scenario["profit"]) > 0 def simulate_scenario(demand, datacenters, servers, elasticity, moved_servers, purchased_servers): # Simulate a scenario by running the algorithm for each time step in the scenario scenarios = [] for t in range(len(demand)): scenario = {} for i in range(len(datacenters)): if datacenters[t][i]["capacity"] > 0: scenario[t + 1]["profit"] += (datacenters[t][i]["capacity"] * moved_servers[t][i]) / elasticity for i in range(len(servers)): if servers[t][i]["capacity"] > 0: scenario[t + 1]["profit"] += (servers[t][i]["capacity"] * purchased_servers[t][i]) / elasticity scenarios.append(scenario) return scenarios def can_move_server_between_datacenters(datacenter, server): # Check if the server can be moved between datacenters based on its capacity and the demand at each time step return datacenter["capacity"] > 0 and server["capacity"] > 0 and can_move_server_within_datacenter(datacenter, server) def can_move_server_within_datacenter(datacenter, server): # Check if the server can be moved within a datacenter based on its capacity and the demand at each time step return server["capacity"] > 0 and datacenter["capacity"] > 0 def can_purchase_server_from_market(datacenter, server): # Check if the server can be purchased from the market based on its capacity and the demand at each time step return server["capacity"] > 0 and can_purchase_server_from_market_within_datacenter(datacenter, server) def can_purchase_server_from_market_within_datacenter(datacenter, server): # Check if the server can be purchased from the market within a datacenter based on its capacity and the demand at each time step return datacenter["capacity"] > 0 and server["capacity"] > 0 and can_purchase_server_from_market(datacenter, server) def main(): # Read input from file with open("input.txt", "r") as f: demand = list(map(int, f)) print("Demand:", demand) if __name__ == "__main__": main()
Leave a Comment