-2

I am try to solve maximization problem using python library called SciPy.I am very need to python and SCipy. I code the given problem using looking at the youtube video at urlhttps://www.youtube.com/watch?v=M7ZA9fq2zCE&t=191s. I am solving price optimization problem. I took our product should be at the margin of the competitor price range.Manufacturing cost is added to cost function.Shipping cost was also added to cost function defined as "objective_fcn".Shipping cost is consist of serveral values.Packing costs,Delivary to port cost,tax,terminal cost and carriage cost.(see picture enter image description here.And finally I add customer discount cost to the cost function.SO cost function has main three costs; manufacturing cost, customer discounts and shipping cost.My problem is I coded my optimization problem as it is in the given youtube video.But I got error saying "ValueError: operands could not be broadcast together with shapes (9,) (6,) (6,)".I don't know what is means and I don't know how to solve this issue. Please help me. Code is there.I comment importnat details in there.

import numpy as np
from scipy.optimize import minimize
import math

# company descitions and inputs
Newyorkquantity = 60 / 100;
Felixstorequantity = 40 / 100;

DelivaryToPortLowerBoundry = 4 / 100;
DelivaryToPortHigherBoundry = 5 / 100;
PackingCostLowerBoundry = 1 / 10;
PackingCostHigheBoundry = 12 / 10;

Bronze_DiscountUpperBound = 20;
Bronze_DiscountLowerBound = 0;

Silver_DiscountUpperBound = 30;
Silver_DiscountLowerBound = 21;

Gold_DiscountUpperBound = 50;
Gold_DiscountLowerBound = 35;

Platinum_DiscountUpperBound = 71;
Platinum_DiscountLowerBound = 51;

NumberofchocolatesContainsInaContainer = 1000000;

# constant values
taxeForAcontainer = 30000;
terminalchargesForAcontainer = 40500;
STORAGEMAXIMUMCHOCOLATE=850000000;

# model predicted values
BronzeCustomers = 2500;
SilverCustomers = 1800;
GoldCustomers = 700;
PlatinumCustomers = 350;

ShippingrOneUnitContainerCost_NY = 80000;
ShippingrOneUnitContainerCost_Felixtow = 70000;
Manufacturing = 25;
CompetitorLowerBoundryprice = 250;
CompetitorHigherBoundryprice = 340;


def objective_fcn(x):
    price = x[0]
    quantity = x[1]
    bronze_Discount = x[2]
    silver_Discount = x[3]
    Gold_Discount = x[4]
    Platinum_Discount = x[5]
    DelivaryToPort = x[6]
    PackingCostOneUnit = x[7]
    transporttcircles = x[8]

    bronzecost = BronzeCustomers * (price - price * bronze_Discount)
    Silvercost = SilverCustomers * (price - price * silver_Discount)
    Goldcost = GoldCustomers * (price - price * Gold_Discount)
    Platinumcost = PlatinumCustomers * (price - price * Platinum_Discount)
    customercost = bronzecost + Silvercost + Goldcost + Platinumcost
    print("hello")
    packigcostAllunits = PackingCostOneUnit * quantity;
    delivarytoporCosttAll = DelivaryToPort * transporttcircles;
    ShippingCarringcharge_NewYK = (math.ceil((quantity * Newyorkquantity / NumberofchocolatesContainsInaContainer))) * ShippingrOneUnitContainerCost_NY;
    ShippingCarringcharge_FelixStore = (math.ceil((quantity * Felixstorequantity / NumberofchocolatesContainsInaContainer))) * ShippingrOneUnitContainerCost_Felixtow;
    Total_containers = (math.ceil((quantity * Newyorkquantity / NumberofchocolatesContainsInaContainer))) + (math.ceil((quantity * Felixstorequantity / NumberofchocolatesContainsInaContainer)));

    shippingTotalCost = packigcostAllunits + delivarytoporCosttAll + ShippingCarringcharge_NewYK + ShippingCarringcharge_FelixStore + taxeForAcontainer*Total_containers +terminalchargesForAcontainer;

    return -(price * quantity - (customercost + Manufacturing * quantity + shippingTotalCost))



bounds_price = (CompetitorLowerBoundryprice, CompetitorHigherBoundryprice)
bound_quantity = (10000,STORAGEMAXIMUMCHOCOLATE)
bounds_bronze_DS = (Bronze_DiscountLowerBound, Bronze_DiscountUpperBound)
bounds_silver_DS = (Silver_DiscountLowerBound, Silver_DiscountUpperBound)
bounds_Gold_DS = (Gold_DiscountLowerBound, Gold_DiscountUpperBound)
bounds_Platinum_DS = (Platinum_DiscountLowerBound, Platinum_DiscountUpperBound)

bounds_DelivaryToPor = (DelivaryToPortLowerBoundry,DelivaryToPortHigherBoundry)
bounds_PackingCostLowerBoundry = (PackingCostLowerBoundry,PackingCostHigheBoundry)




boundsss = [bounds_price, bound_quantity, bounds_bronze_DS, bounds_silver_DS, bounds_Gold_DS, bounds_Platinum_DS]


x0 = [251, 100000, 1, 22, 36, 52,DelivaryToPortLowerBoundry,PackingCostLowerBoundry,3]

result = minimize(fun=objective_fcn, x0=x0, bounds=boundsss, method='SLSQP')

if result.success:
    fitted_params = result.x
    print(fitted_params)
else:
    raise ValueError(result.message)
Zoe
  • 27,060
  • 21
  • 118
  • 148
  • 4
    Please don't make more work for other people by vandalizing your posts. By posting on the Stack Exchange network, you've granted a non-revocable right, under the [CC BY-SA 4.0 license](//creativecommons.org/licenses/by-sa/4.0/), for Stack Exchange to distribute that content (i.e. regardless of your future choices). By Stack Exchange policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted. If you want to know more about deleting a post please see: [How does deleting work?](//meta.stackexchange.com/q/5221) – Suraj Rao Dec 30 '21 at 12:58

1 Answers1

2

Error is caused by the fact you provided 9 dimensions in x0 and 6 dimensions in bounds parameters. I made-up some bounds and fixed your problem:

import numpy as np
from scipy.optimize import minimize
import math

# company descitions and inputs
Newyorkquantity = 60 / 100;
Felixstorequantity = 40 / 100;

DelivaryToPortLowerBoundry = 4 / 100;
DelivaryToPortHigherBoundry = 5 / 100;
PackingCostLowerBoundry = 1 / 10;
PackingCostHigheBoundry = 12 / 10;

Bronze_DiscountUpperBound = 20;
Bronze_DiscountLowerBound = 0;

Silver_DiscountUpperBound = 30;
Silver_DiscountLowerBound = 21;

Gold_DiscountUpperBound = 50;
Gold_DiscountLowerBound = 35;

Platinum_DiscountUpperBound = 71;
Platinum_DiscountLowerBound = 51;

NumberofchocolatesContainsInaContainer = 1000000;

# constant values
taxeForAcontainer = 30000;
terminalchargesForAcontainer = 40500;
STORAGEMAXIMUMCHOCOLATE=850000000;

# model predicted values
BronzeCustomers = 2500;
SilverCustomers = 1800;
GoldCustomers = 700;
PlatinumCustomers = 350;

ShippingrOneUnitContainerCost_NY = 80000;
ShippingrOneUnitContainerCost_Felixtow = 70000;
Manufacturing = 25;
CompetitorLowerBoundryprice = 250;
CompetitorHigherBoundryprice = 340;


def objective_fcn(x):
    price = x[0]
    quantity = x[1]
    bronze_Discount = x[2]
    silver_Discount = x[3]
    Gold_Discount = x[4]
    Platinum_Discount = x[5]
    DelivaryToPort = x[6]
    PackingCostOneUnit = x[7]
    transporttcircles = x[8]

    bronzecost = BronzeCustomers * (price - price * bronze_Discount)
    Silvercost = SilverCustomers * (price - price * silver_Discount)
    Goldcost = GoldCustomers * (price - price * Gold_Discount)
    Platinumcost = PlatinumCustomers * (price - price * Platinum_Discount)
    customercost = bronzecost + Silvercost + Goldcost + Platinumcost
    print("hello")
    packigcostAllunits = PackingCostOneUnit * quantity;
    delivarytoporCosttAll = DelivaryToPort * transporttcircles;
    ShippingCarringcharge_NewYK = (math.ceil((quantity * Newyorkquantity / NumberofchocolatesContainsInaContainer))) * ShippingrOneUnitContainerCost_NY;
    ShippingCarringcharge_FelixStore = (math.ceil((quantity * Felixstorequantity / NumberofchocolatesContainsInaContainer))) * ShippingrOneUnitContainerCost_Felixtow;
    Total_containers = (math.ceil((quantity * Newyorkquantity / NumberofchocolatesContainsInaContainer))) + (math.ceil((quantity * Felixstorequantity / NumberofchocolatesContainsInaContainer)));

    shippingTotalCost = packigcostAllunits + delivarytoporCosttAll + ShippingCarringcharge_NewYK + ShippingCarringcharge_FelixStore + taxeForAcontainer*Total_containers +terminalchargesForAcontainer;

    return -(price * quantity - (customercost + Manufacturing * quantity + shippingTotalCost))



bounds_price = (CompetitorLowerBoundryprice, CompetitorHigherBoundryprice)
bound_quantity = (10000,STORAGEMAXIMUMCHOCOLATE)
bounds_bronze_DS = (Bronze_DiscountLowerBound, Bronze_DiscountUpperBound)
bounds_silver_DS = (Silver_DiscountLowerBound, Silver_DiscountUpperBound)
bounds_Gold_DS = (Gold_DiscountLowerBound, Gold_DiscountUpperBound)
bounds_Platinum_DS = (Platinum_DiscountLowerBound, Platinum_DiscountUpperBound)

bounds_DelivaryToPor = (DelivaryToPortLowerBoundry,DelivaryToPortHigherBoundry)
bounds_PackingCostLowerBoundry = (PackingCostLowerBoundry,PackingCostHigheBoundry)

##### FIX HERE #####
fake_bound1 = [DelivaryToPortLowerBoundry - 1, DelivaryToPortLowerBoundry + 1]
fake_bound2 = [PackingCostLowerBoundry - 1, PackingCostLowerBoundry + 1]
fake_bound3 = (2, 4)
boundsss = [bounds_price, bound_quantity, bounds_bronze_DS, bounds_silver_DS, bounds_Gold_DS, bounds_Platinum_DS,
            fake_bound1, fake_bound2, fake_bound3]
#### END OF FIX ####

x0 = [251, 100000, 1, 22, 36, 52, DelivaryToPortLowerBoundry,PackingCostLowerBoundry,3]

result = minimize(fun=objective_fcn, x0=x0, bounds=boundsss, method='SLSQP')

if result.success:
    fitted_params = result.x
    print(fitted_params)
else:
    raise ValueError(result.message)
dankal444
  • 3,172
  • 1
  • 23
  • 35