I am working on an optimization problem, and facing difficulty setting up two constraints together in Python. Hereunder, I am simplifying my problem by calculation of area and volume. Only length can be changed, other parameters should remain the same.
Constraint 1: Maximum area should be 40000m2 Constraint 2: Minimum volume should be 50000m3
Here, I can set values in dataframe by following both constraints one-by-one, how to modify code so that both constraints (1 & 2) should meet given requirements? Many Thanks for your time and support!
import pandas as pd import numpy as np df = pd.DataFrame({'Name': ['A', 'B', 'C', 'D'], 'Length': [1000, 2000, 3000, 5000], 'Width': [5, 12, 14, 16], 'Depth': [15, 10, 15, 18]}) area = (df['Length'])*(df['Width']) volume = (df['Length'])*(df['Width'])*(df['Depth']) print(area) print(volume) #Width and Depth are constants, only Length can be change #Constraint 1: Maximum area should be 40000m2 #Calculation of length parameter by using maximum area, with other given parameters Constraint_length_a = 40000/ df['Width'] #Constraint 2: Minimum volume should be 50000m3 #Calculation of length parameter by using minimum area, with other given parameters Constraint_length_v = 50000/ ((df['Width'])*(df['Depth'])) #Setting Length values considering constraint 1 df.at[0, 'Length']=Constraint_length_a[0] df.at[1, 'Length']=Constraint_length_a[1] df.at[2, 'Length']=Constraint_length_a[2] df.at[2, 'Length']=Constraint_length_a[3] #Setting Length values considering constraint 2 df.at[0, 'Length']=Constraint_length_v[0] df.at[1, 'Length']=Constraint_length_v[1] df.at[2, 'Length']=Constraint_length_v[2] df.at[2, 'Length']=Constraint_length_v[3]
Advertisement
Answer
I believed the code below solve the current problem you are facing. If I can help any further let me know.
import pandas as pd import numpy as np df = pd.DataFrame({'Name': ['A', 'B', 'C', 'D'], 'Length': [1000, 2000, 3000, 5000], 'Width': [5, 12, 14, 16], 'Depth': [15, 10, 15, 18]}) area = (df['Length'])*(df['Width']) volume = (df['Length'])*(df['Width'])*(df['Depth']) def constraint1(df, col, n): df.loc[:n,'lenght'] = 40000 / df.loc[:n, col] df.drop('Length', axis=1, inplace=True) return df def constraint2(df, col, col1, n): df.loc[:n, 'lenght'] = 50000/ ((df.loc[:n,col])*(df.loc[:n,col1])) df.drop('Length', axis=1, inplace=True) return df
If you want to performance it through the whole column then
def constraint1a(df, col): df['lenght'] = 40000 / df[col] df.drop('Length', axis=1, inplace=True) return df def constraint2a(df, col, col1): df['lenght'] = 50000/ ((df[col])*(df[col1])) df.drop('Length', axis=1, inplace=True) return df df = constraint1(df, 'Width', 3) df1 = constraint2(df, 'Width','Depth', 3) df2 = constraint1a(df, 'Width') df3 = constraint2a(df, 'Width','Depth')
Adding the conditions I left out the first time
def constraint1(df, col, col1): l = [] for x, w in zip(df[col], df[col1]): if x > 40000: l.append(40000 / w) else: l.append(x) df[col] = l return df def constraint2(df, col, col1, col2): l = [] for x, w, d in zip(df[col], df[col1], df[col2]): if x <= 50000: l.append(50000 / (w*d)) else: l.append(x) df[col] = l return df df1 = constraint1(df, 'Length', 'Width') df2 = constraint2(df, 'Length', 'Width', 'Depth')