卡车类型(其中的无限数)与订单

发布于 2025-02-11 12:22:10 字数 1316 浏览 4 评论 0原文

以下DOCPLEX模型的目标是选择最低成本的卡车以履行所有订单。在以下代码中,我将卡车类型视为1卡车,但实际上,卡车类型可以拥有无​​限数量的卡车,在这种情况下,我应该如何修改约束和客观功能以适应这一点?

import pandas as pd
import docplex.mp
from docplex.mp.model import Model
df_order = pd.DataFrame([[1,5000],[2,1000],[3,2000]], columns =['OrderID','Weight']) 
orders = df_order['OrderID'].values.tolist()
df_order.set_index('OrderID', inplace=True)

df_truck_types = pd.DataFrame([[1,'TYPE1',20000,'SP TRANSPORTS',40000],[2,'TYPE2',20000,'SP TRANSPORTS',40000],[3,'TYPE3',10000,'SP TRANSPORTS',30000]], columns =['TruckTypeID','VehicleType','Capacity','Transporter','TruckCost']) 
truck_types = df_truck_types['TruckTypeID'].values.tolist()
df_truck_types.set_index('TruckTypeID', inplace=True)

def get_order(o):
    return df_order.loc[o]

def get_truck_type(f):
    return df_truck_types.loc[f]

# Decision Variable and Objective Function
mdl = Model(name='itc_load_planning')

Assignment = mdl.binary_var_matrix(orders, truck_types, name='Assignment')
#for objective 1
TruckCost=mdl.sum(Assignment[o,f] * get_truck_type(f).TruckCost for o in orders for f in truck_types)

mdl.minimize(TruckCost)

# C1
for o in orders:
    mdl.add_constraint(mdl.sum(Assignment[o,f] for f in truck_types)==1, "C1")
    
# solve model
print("===solution===")
si = mdl.solve()
mdl.print_solution()

The goal of the docplex model below is to choose the trucks with total minimum cost to fulfill all orders. I treat the truck type as 1 truck in the following code, but in fact, a truck type can have infinite number of truck, in that case, how should I modified the constraints and objective functions to fit that?

import pandas as pd
import docplex.mp
from docplex.mp.model import Model
df_order = pd.DataFrame([[1,5000],[2,1000],[3,2000]], columns =['OrderID','Weight']) 
orders = df_order['OrderID'].values.tolist()
df_order.set_index('OrderID', inplace=True)

df_truck_types = pd.DataFrame([[1,'TYPE1',20000,'SP TRANSPORTS',40000],[2,'TYPE2',20000,'SP TRANSPORTS',40000],[3,'TYPE3',10000,'SP TRANSPORTS',30000]], columns =['TruckTypeID','VehicleType','Capacity','Transporter','TruckCost']) 
truck_types = df_truck_types['TruckTypeID'].values.tolist()
df_truck_types.set_index('TruckTypeID', inplace=True)

def get_order(o):
    return df_order.loc[o]

def get_truck_type(f):
    return df_truck_types.loc[f]

# Decision Variable and Objective Function
mdl = Model(name='itc_load_planning')

Assignment = mdl.binary_var_matrix(orders, truck_types, name='Assignment')
#for objective 1
TruckCost=mdl.sum(Assignment[o,f] * get_truck_type(f).TruckCost for o in orders for f in truck_types)

mdl.minimize(TruckCost)

# C1
for o in orders:
    mdl.add_constraint(mdl.sum(Assignment[o,f] for f in truck_types)==1, "C1")
    
# solve model
print("===solution===")
si = mdl.solve()
mdl.print_solution()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

星星的軌跡 2025-02-18 12:22:10

这不是OPL模型,而是DocPlex Python模型。

要处理卡车而不是卡车类型,我会更改

Assignment = mdl.binary_var_matrix(orders, truck_types, name='Assignment')

Assignment = mdl.binary_var_matrix(orders, trucks, name='Assignment')

卡车的卡车,因此您必须对

OPL卡车的容量限制添加限制,您可以很快写这篇文章:

tuple order
{
  key int id;
  int weight;
}

{order} orders={<1,5000>,<2,1000>,<3,2000>};

tuple trucktype
{
  key int TruckTypeID;
  string VehicleType;
  int Capacity;
  string Transporter;
  int TruckCost;
};

{trucktype} trucktypes=
{
  <1,"TYPE1",20000,"SP TRANSPORTS",40000>,
  <2,"TYPE2",20000,"SP TRANSPORTS",40000>,
  <3,"TYPE3",10000,"SP TRANSPORTS",30000>
};

int nbTruckPerType=3;

tuple truck
{
  trucktype TruckType;
  int rank;
}

{truck} trucks={<i,j> | i in trucktypes,j in 1..nbTruckPerType};

dvar boolean assign[orders][trucks];
dvar boolean istruckused[trucks];


minimize sum(t in trucks) istruckused[t]*t.TruckType.TruckCost;
subject to
{
  forall(t in trucks) ctUseTruck:istruckused[t]==(1<=sum(o in orders) assign[o][t]);
  
  forall(o in orders) ctOrders:sum(t in trucks) assign[o][t]==1;
  
  forall(t in trucks) ctCapacity:sum(o in orders) assign[o][t]*o.weight<=t.TruckType.Capacity;
}

This is not an OPL model but a docplex python model.

To deal with trucks instead of truck types I would change

Assignment = mdl.binary_var_matrix(orders, truck_types, name='Assignment')

into

Assignment = mdl.binary_var_matrix(orders, trucks, name='Assignment')

And a truck in trucks would have a capacity so you will have to add a constraint about the capacity limit in a truck

In OPL you can write this very quickly:

tuple order
{
  key int id;
  int weight;
}

{order} orders={<1,5000>,<2,1000>,<3,2000>};

tuple trucktype
{
  key int TruckTypeID;
  string VehicleType;
  int Capacity;
  string Transporter;
  int TruckCost;
};

{trucktype} trucktypes=
{
  <1,"TYPE1",20000,"SP TRANSPORTS",40000>,
  <2,"TYPE2",20000,"SP TRANSPORTS",40000>,
  <3,"TYPE3",10000,"SP TRANSPORTS",30000>
};

int nbTruckPerType=3;

tuple truck
{
  trucktype TruckType;
  int rank;
}

{truck} trucks={<i,j> | i in trucktypes,j in 1..nbTruckPerType};

dvar boolean assign[orders][trucks];
dvar boolean istruckused[trucks];


minimize sum(t in trucks) istruckused[t]*t.TruckType.TruckCost;
subject to
{
  forall(t in trucks) ctUseTruck:istruckused[t]==(1<=sum(o in orders) assign[o][t]);
  
  forall(o in orders) ctOrders:sum(t in trucks) assign[o][t]==1;
  
  forall(t in trucks) ctCapacity:sum(o in orders) assign[o][t]*o.weight<=t.TruckType.Capacity;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文