0

我是 Xpress Mosel 和线性规划的绝对初学者,所以如果我犯了任何明显的错误,请原谅我。话虽如此,我目前正在解决问题并在 Xpress Workbench 中实施它。

问题:

假设有一个小型国际象棋制造商制造国际象棋A和B的场景。国际象棋A的价格为30美元,而国际象棋B的价格为40美元。这家国际象棋制造商收到了 10 家零售商的订单,他们想同时购买这两种国际象棋,每个零售商为每件出售的国际象棋产生不同的运费。如果棋具制造商只能向每个零售商销售最少 100 件和最多 300 件,那么该制造商应该向每个零售商销售多少件才能实现利润最大化?

如果我没记错的话,目标函数是:

利润 = (30 * x1 - s * x1) + (40 * x2 - s * x2)

其中 x1 是国际象棋 A 的数量,X2 是国际象棋 B 的数量,s 是运费。

约束是:

x1, x2 <= 300

x1, x2 >= 100

x1, x2 >= 0

每个零售商的运费为:

运输费

下面的代码显示了我在 Mosel 中实现这个问题的尝试。

model "CHESS PROBLEM"
uses "mmxprs"

declarations
  SCN = 1..10
  PROFITOFCHESSA : integer
  PROFITOFCHESSB : integer
  UPPERLIMIT = 300
  LOWERLIMIT = 100
  CHESSA: array(SCN) of mpvar
  CHESSB: array(SCN) of mpvar
  S_COSTS: array(SCN) of real
end-declarations

initializations from "C:/Users/Admin/Downloads/Chess2.dat"
  S_COSTS
end-initializations

profit:= sum(A in SCN) ((CHESSA(A) * PROFITOFCHESSA + CHESSB(A) * PROFITOFCHESSB) - (CHESSA(A) * S_COSTS(A) +CHESSB(A) * S_COSTS(A)))

  forall(A in SCN) (CHESSA(A)) <= UPPERLIMIT
  forall(A in SCN) (CHESSA(A)) >= LOWERLIMIT
  forall(A in SCN) (CHESSB(A)) <= UPPERLIMIT
  forall(A in SCN) (CHESSB(A)) >= LOWERLIMIT
  forall(A in SCN) (CHESSA(A)) >= 0
  forall(A in SCN) (CHESSB(A)) >= 0

 maximize(profit)
 writeln("Solution:\Objective: ", getobjval)
 forall(A in SCN) writeln("Number of Chess Sets A to be sold to Retailer (" + A + ") is: ", getsol(CHESSA(A)))
 forall(A in SCN) writeln("Number of Chess Sets B to be sold to Retailer (" + A + ") is: ", getsol(CHESSB(A)))

end-model

其中 CHESSA 和 CHESSB 是要出售的棋盘数量,PROFITOFCHESSA 和 PROFITOFCHESSB 是出售每盘棋的利润,S_COSTS 是运费。

但是,运行此问题会为所有零售商返回零。我非常感谢一些关于我在这里做错了什么的反馈。

4

1 回答 1

0

你的模型有两个问题:

首先,您不初始化PROFITOFCHESSAor PROFITOFCHESSB。所以它们都将为 0,即生产任何模型都不会获得利润。更糟糕的是,您必须为生产的每种型号支付运费。由于目标是最大化利润,求解器将选择生成尽可能少的模型。每个零售商要生产的最小模型数量为 100(根据您的限制)。因此,求解器为每个零售商使用这个最小数量。

第二个问题是你的模型有点过于简单:你生产的每一件作品,你都会获得一些利润并支付一些运费。如果利润大于运输成本,那么最好的解决方案是生产尽可能多的商品(在您的情况下,每个零售商生产 300 件)。如果利润小于运输成本,那么最好的解决方案是生产尽可能少的商品(每个零售商 100 件)。所以这里没有太多需要优化的地方。

于 2020-10-26T11:13:30.367 回答