Spaces:
Sleeping
Sleeping
File size: 4,249 Bytes
b8f8c5f b7faa50 b8f8c5f 5b228ad b7faa50 5b228ad b7faa50 5b228ad b7faa50 5b228ad b7faa50 5b228ad 539048d 5b228ad b7faa50 539048d b7faa50 539048d 5b228ad b7faa50 5b228ad 97b3cae 5b228ad b7faa50 5b228ad b7faa50 5b228ad b7faa50 5b228ad |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
from pulp import *
import pandas as pd
from read_data import load_excel_data
def create_sourcing_problem(weightage_dict, priority_df, warehouse_df, order_df, cost_df, distance_df, days_df):
"""
Creates and returns a linear programming problem for intelligent sourcing optimization.
Parameters:
weightage_dict (dict): Dictionary containing weightages for cost, priority, distance, and days.
priority_df (DataFrame): DataFrame containing priority values for each warehouse.
warehouse_df (DataFrame): DataFrame containing stock availability for each warehouse.
order_df (DataFrame): DataFrame containing order quantities for each product.
cost_df (DataFrame): DataFrame containing cost values.
distance_df (DataFrame): DataFrame containing distance values.
days_df (DataFrame): DataFrame containing expected delivery days.
Returns:
LpProblem: Linear programming problem formulated for sourcing optimization.
Warehouses, Products, Stock, Priority, Orders, Quantity
"""
def min_max_scale(df, column):
min_val = df[column].min()
max_val = df[column].max()
df[column] = (df[column] - min_val) / (max_val - min_val)
return df
# Extract weightages
weightage_Cost = weightage_dict["Cost"]
weightage_Priority = weightage_dict["Priority"]
weightage_distance = weightage_dict["Distance"]
weightage_days = weightage_dict["Days"]
# Normalize data
priority_df = min_max_scale(priority_df, "Priority")
cost_df = min_max_scale(cost_df, "Cost")
distance_df = min_max_scale(distance_df, "Distance")
days_df = min_max_scale(days_df, "Days")
# Create dictionaries for optimization
Warehouses = warehouse_df['Warehouse'].tolist()
Products = warehouse_df.columns[1:]
Stock = makeDict([Warehouses, Products], warehouse_df.drop('Warehouse', axis=1).values, default=0)
Priority = makeDict([Warehouses], priority_df.drop('Warehouse', axis=1).values.reshape(len(Warehouses)), default=0)
Orders = order_df['Order'].tolist()
Quantity = makeDict([Orders, Products], order_df.drop('Order', axis=1).values, default=0)
cost_values = cost_df["Cost"].values.reshape(len(Warehouses), len(Orders), len(Products))
cost = makeDict([Warehouses, Orders, Products], cost_values, default=0)
distance_values = distance_df["Distance"].values.reshape(len(Warehouses), len(Orders), len(Products))
distance = makeDict([Warehouses, Orders, Products], distance_values, default=0)
days_values = days_df["Days"].values.reshape(len(Warehouses), len(Orders), len(Products))
days = makeDict([Warehouses, Orders, Products], days_values, default=0)
# Define variables and routes
routes = [(w, o, s) for w in Warehouses for o in Orders for s in Products]
Variable = LpVariable.dicts("Route", (Warehouses, Orders, Products), 0, None, LpInteger)
# Create optimization problem
prob = LpProblem("Sourcing_Problem", LpMaximize)
# Objective function
prob += lpSum(
Variable[w][o][p] * (
(weightage_Cost * -cost[w][o][p]) +
(weightage_Priority * -Priority[w]) +
(weightage_distance * -distance[w][o][p]) +
(weightage_days * -days[w][o][p])
)
for (w, o, p) in routes
), "Sum_of_Costs"
# Stock Constraints
for w in Warehouses:
for p in Products:
prob += lpSum([Variable[w][o][p] for o in Orders]) <= Stock[w][p], f"Stock_Constraint_{p}_in_{w}"
# Order Constraints
for o in Orders:
for p in Products:
prob += lpSum([Variable[w][o][p] for w in Warehouses]) == Quantity[o][p], f"Order_Fulfillment_{p}_to_{o}"
return prob, Warehouses, Products, Stock, Priority, Orders, Quantity, Variable
if __name__ == "__main__":
filepath = 'Intelligent_Sourcing.xlsx' # Example file path
weightage_dict, priority_df, warehouse_df, order_df, cost_df, distance_df, days_df, = load_excel_data(filepath)
prob, Warehouses, Products, Stock, Priority, Orders, Quantity, Variable = create_sourcing_problem(weightage_dict, priority_df, warehouse_df, order_df, cost_df, distance_df, days_df)
print(prob.objective)
|