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)