Skip to content
Advertisement

Two constraints setting together in optimization problem

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')
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement