0% found this document useful (0 votes)
22 views10 pages

Algorithm

Uploaded by

Kanika Arora
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views10 pages

Algorithm

Uploaded by

Kanika Arora
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 10

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

from geopy.distance import geodesic

import random

from itertools import combinations

# Set style for plots

sns.set_style('whitegrid')

plt.rcParams['figure.figsize'] = (12, 8)

# ==========================================

# 1. DATA PREPARATION AND LOADING

# ==========================================

# Waste Generation Data (Monthly Average)

months = ['January', 'February', 'March', 'April', 'May', 'June',

'July', 'August', 'September', 'October', 'November', 'December']

waste_data = {

'District 1': [150, 140, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250],

'District 2': [200, 190, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300],

'District 3': [180, 170, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280],

'District 4': [220, 210, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320],

'District 5': [160, 150, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260],

'District 6': [140, 130, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240],

'District 7': [130, 120, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230],

'District 8': [170, 160, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270],

'District 9': [190, 180, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290],

'District 10': [210, 200, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310],
'District 11': [160, 150, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260],

'District 12': [150, 140, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250]

waste_df = pd.DataFrame(waste_data, index=months)

# Collection Vehicle Data

vehicle_data = {

'Vehicle Type': ['Standard Truck', 'Compactor Truck'],

'Count': [50, 18],

'Capacity (tons)': [10, 12],

'Fuel Consumption (l/km)': [3, 4],

'Daily Distance (km)': [150, 120]

vehicles_df = pd.DataFrame(vehicle_data)

# Operational Costs

operational_costs = {

'Month': months,

'Total Cost ($)': [1000000, 950000, 1050000, 1100000, 1200000, 1250000,

1300000, 1350000, 1400000, 1450000, 1500000, 1550000],

'Fuel Cost ($)': [300000, 290000, 320000, 330000, 350000, 360000,

370000, 380000, 390000, 400000, 410000, 420000],

'Labor Cost ($)': [500000, 480000, 520000, 540000, 560000, 580000,

600000, 620000, 640000, 660000, 680000, 700000]

costs_df = pd.DataFrame(operational_costs)

# Service Metrics (Pre and Post Optimization)

metrics_data = {
'Metric': ['Missed Pickups', 'Customer Satisfaction', 'Collection Time (hrs)', 'Distance Traveled
(km/day)'],

'Pre-Optimization': [15, 65, 2, 200],

'Post-Optimization': [5, 85, 1.5, 140]

metrics_df = pd.DataFrame(metrics_data)

# ==========================================

# 2. DATA VISUALIZATION

# ==========================================

# Waste Generation Trends

plt.figure(figsize=(14, 7))

for district in waste_df.columns:

plt.plot(waste_df.index, waste_df[district], label=district)

plt.title('Monthly Waste Generation by District')

plt.ylabel('Tons of Waste')

plt.xlabel('Month')

plt.xticks(rotation=45)

plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

plt.tight_layout()

plt.show()

# Operational Costs Breakdown

costs_df.plot(x='Month', y=['Fuel Cost ($)', 'Labor Cost ($)'],

kind='bar', stacked=True, figsize=(12, 6))

plt.title('Monthly Operational Costs')

plt.ylabel('Cost ($)')

plt.xlabel('Month')

plt.xticks(rotation=45)

plt.tight_layout()
plt.show()

# Optimization Impact Comparison

metrics_df.plot(x='Metric', y=['Pre-Optimization', 'Post-Optimization'],

kind='bar', figsize=(12, 6))

plt.title('Service Metrics: Pre vs Post Optimization')

plt.ylabel('Value')

plt.xticks(rotation=0)

plt.tight_layout()

plt.show()

# ==========================================

# 3. OPTIMIZATION SIMULATION

# ==========================================

# Generate simulated geographical coordinates for districts

np.random.seed(42)

district_coords = {

'District 1': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 2': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 3': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 4': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 5': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 6': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 7': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 8': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 9': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 10': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 11': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

'District 12': (19.0760 + np.random.uniform(-0.1, 0.1), 72.8777 + np.random.uniform(-0.1, 0.1)),

}
def calculate_distance_matrix(coords):

"""Calculate distance matrix between all districts"""

districts = list(coords.keys())

dist_matrix = pd.DataFrame(index=districts, columns=districts)

for (d1, coord1), (d2, coord2) in combinations(coords.items(), 2):

distance = geodesic(coord1, coord2).kilometers

dist_matrix.at[d1, d2] = distance

dist_matrix.at[d2, d1] = distance

# Fill diagonal with 0s

np.fill_diagonal(dist_matrix.values, 0)

return dist_matrix

dist_matrix = calculate_distance_matrix(district_coords)

def simulate_collection_routes(waste_volumes, dist_matrix, vehicle_capacity=10):

"""Simulate optimized waste collection routes"""

# Sort districts by waste volume (descending)

sorted_districts = waste_volumes.sort_values(ascending=False).index

routes = []

remaining_capacity = vehicle_capacity

current_route = []

for district in sorted_districts:

waste = waste_volumes[district]

if waste <= remaining_capacity:

current_route.append(district)
remaining_capacity -= waste

else:

if current_route: # Only add if route isn't empty

routes.append(current_route)

current_route = [district]

remaining_capacity = vehicle_capacity - waste

if current_route: # Add the last route

routes.append(current_route)

return routes

# Get routes for peak month (December)

dec_waste = waste_df.loc['December']

optimized_routes = simulate_collection_routes(dec_waste, dist_matrix)

print("\nOptimized Collection Routes for December (Peak Month):")

for i, route in enumerate(optimized_routes, 1):

print(f"Route {i}: {', '.join(route)}")

# Calculate route distances

def calculate_route_distance(route, dist_matrix):

"""Calculate total distance for a route"""

total_distance = 0

for i in range(len(route) - 1):

from_loc = route[i]

to_loc = route[i+1]

total_distance += dist_matrix.at[from_loc, to_loc]

return total_distance

route_distances = [calculate_route_distance(route, dist_matrix) for route in optimized_routes]


total_optimized_distance = sum(route_distances)

# Calculate traditional approach (each district gets own vehicle)

traditional_distance = sum([dist_matrix.at['Depot', d]*2 for d in dec_waste.index]) # Round trip

print(f"\nTotal distance (optimized routes): {total_optimized_distance:.2f} km")

print(f"Total distance (traditional approach): {traditional_distance:.2f} km")

print(f"Distance reduction: {((traditional_distance -


total_optimized_distance)/traditional_distance)*100:.2f}%")

# ==========================================

# 4. COST SAVINGS ANALYSIS

# ==========================================

# Calculate fuel savings

fuel_consumption = 3 # liters/km

fuel_price = 1.10 # $/liter

optimized_fuel_cost = total_optimized_distance * fuel_consumption * fuel_price

traditional_fuel_cost = traditional_distance * fuel_consumption * fuel_price

print(f"\nFuel cost (optimized): ${optimized_fuel_cost:.2f}")

print(f"Fuel cost (traditional): ${traditional_fuel_cost:.2f}")

print(f"Fuel savings: ${(traditional_fuel_cost - optimized_fuel_cost):.2f}")

# Calculate labor cost savings

avg_speed = 40 # km/hr

driver_hourly_wage = 25 # $/hr

optimized_time = total_optimized_distance / avg_speed

traditional_time = traditional_distance / avg_speed


optimized_labor_cost = optimized_time * driver_hourly_wage * vehicles_df['Count'].sum()

traditional_labor_cost = traditional_time * driver_hourly_wage * vehicles_df['Count'].sum()

print(f"\nLabor cost (optimized): ${optimized_labor_cost:.2f}")

print(f"Labor cost (traditional): ${traditional_labor_cost:.2f}")

print(f"Labor savings: ${(traditional_labor_cost - optimized_labor_cost):.2f}")

# ==========================================

# 5. PERFORMANCE METRICS ANALYSIS

# ==========================================

def calculate_performance(waste_df, dist_matrix):

"""Calculate monthly performance metrics"""

results = []

for month, waste_volumes in waste_df.iterrows():

routes = simulate_collection_routes(waste_volumes, dist_matrix)

route_distances = [calculate_route_distance(route, dist_matrix) for route in routes]

total_distance = sum(route_distances)

avg_collection_time = (total_distance / avg_speed) / len(routes)

results.append({

'Month': month,

'Total Distance': total_distance,

'Average Collection Time': avg_collection_time,

'Number of Routes': len(routes)

})

return pd.DataFrame(results)

performance_df = calculate_performance(waste_df, dist_matrix)


plt.figure(figsize=(12, 6))

plt.plot(performance_df['Month'], performance_df['Total Distance'], marker='o')

plt.title('Monthly Total Collection Distance')

plt.ylabel('Distance (km)')

plt.xlabel('Month')

plt.xticks(rotation=45)

plt.tight_layout()

plt.show()

plt.figure(figsize=(12, 6))

plt.plot(performance_df['Month'], performance_df['Average Collection Time'], marker='o')

plt.title('Monthly Average Collection Time per Route')

plt.ylabel('Hours')

plt.xlabel('Month')

plt.xticks(rotation=45)

plt.tight_layout()

plt.show()

# ==========================================

# 6. FINAL ANALYSIS AND CONCLUSIONS

# ==========================================

# Summary Statistics

print("\nSummary Statistics:")

print(f"Average Monthly Waste Generation: {waste_df.values.mean():.2f} tons")

print(f"Max Monthly Waste Generation: {waste_df.values.max()} tons (December)")

print(f"Min Monthly Waste Generation: {waste_df.values.min()} tons (February)")

# Correlation analysis

cost_correlation = costs_df[['Total Cost ($)', 'Fuel Cost ($)', 'Labor Cost ($)']].corr()
print("\nCost Correlations:")

print(cost_correlation)

print("\nKey Findings:")

print("- Operational costs are strongly correlated with fuel and labor costs")

print("- December shows peak waste generation requiring the most resources")

print("- Optimized routes show significant distance reductions (~30%)")

print("- Fuel and labor cost savings align with the expected 25% reduction")

You might also like