通过公司之间的协作进行运输优化-数学建模

时间:2019-10-26 12:26:34

标签: mathematical-optimization modeling ampl

我正在学习一门利用数学建模的课程,并且正在研究一个用于优化运输路线的模型。在问题中,我们得到的集合为C(问题中的所有运输公司),I(所有公司可用的所有供应点)和J(所有公司可用的所有需求点)。公司生产的商品相同,因此公司之间可以通过合作来满足彼此的需求点。供应点和需求点的任何组合都是可能的,并且我们知道每个公司属于哪个供应/需求点(我认为这里没有重叠)。应该满足所有需求。

  • w(i,j)是供应点i和需求点j之间的流量(从i到j的单程运输产品的单位数量)
  • e(i,j)是供给点i和需求点j之间流动的单位成本

我发现了以下内容:

目标函数:Minimize the total cost of all flows between supply point i and demand point j

约束:

The sum of all flows from supply point i to demand point j must be less than or equal to the supply capacity at point i, for all i in I

The sum of all flows from supply point i to demand point j must equal the amount of demand at demand point j, for all j in J

还有一个非负约束,它要求所有供应点i到需求点j的流量必须是非负的。

但是,我在建模时遇到了一些困难(本课程之前我没有数学建模的经验)。最后一个要求是,除了自身之外,最多还应有两家不同的公司交付给另一家公司的需求点。我如何将这样的东西纳入模型?我的困惑是,如果只有两家公司不包括运营需求点的公司,那么只有两家公司可以向需求点供应商品;如果原始公司也在供应商品,那么只有三家公司可以供应商品。例如,公司A,B和C可以供应到公司A的需求点。但是,公司B,C和D不能供应到相同的需求点。有没有办法将这种类型的索引合并到问题中?

作为一个旁注,我也非常感谢教科书中有关从基础知识入手的这类数学建模方法的任何建议。到目前为止,该课程的运行假设是学生对数学建模有所了解,而我对数学建模则不是。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

我的困惑在于,只有两家公司可以供应商品   如果这些公司不包括该公司,则到需求点   经营需求点,如果原来是三家公司   公司也正在供应。例如,公司A,B和C可以   供应给公司A的需求点。但是,公司B,C和D   无法供应到相同的需求点。有没有办法合并   这类索引到问题中吗?

详细信息将根据您解决问题的方式而有所不同,但是以下示例说明了如何在AMPL中对其进行编码。 (我还没有机会测试这段代码,所以可能有点小问题。)

关键在于使用有关供应/需求点所有权的信息来定义一个总和,其中不包括供应自己积分的公司。

set SupplyPoints;
set DemandPoints;
set Companies;
set SupplyPointsByCompanies dimen 2 within {SupplyPoints,Companies};
# a set of (supply point, company) tuples. Following code assumes that
# each supply point has only one owning company.
set DemandPointsByCompanies dimen 2 within {DemandPoints,Companies};
# similarly for demand
param biggestsupply;
# to be defined as the largest value that any one point could supply to any other

var Supply{i in SupplyPoints, j in DemandPoints} >= 0;
# actual amount to be supplied from i to j
var PosSupply{i in SupplyPoints, j in DemandPoints} binary;
subject to DefinePosSupply{i in SupplyPoints, j in DemandPoints}: PosSupply[i,j]*biggestsupply >= Supply[i,j];
# forces PosSupply to equal 1 if Supply is non-zero

subject to limit_num_suppliers{(j,co) in DemandPointsByCompanies}:
    sum{j in SupplyPoints: (i,co) not in SupplyPointsByCompanies} PosSupply[i,j] <= 2;

根据决策变量的大小,您可能需要考虑公差设置,以避免一些奇怪的情况,即PosSupply = 0,但最大供应量* PosSupply被视为非零;有关详细信息,请参见this forum discussion