【问题标题】:Xpress Mosel returning zeroes for all rowsXpress Mosel 为所有行返回零
【发布时间】:2023-04-04 12:41:01
【问题描述】:

我是 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

x1, x2 >= 100

x1, x2 >= 0

每个零售商的运费为:

Shipping Costs

我在 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 是运费。

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

【问题讨论】:

  • 能否请您出示完整的 mosel 文件?如果我以明显的方式完成您的代码,那么我会得到所有变量的 300 的解决方案,这正是我从您的问题描述中所期望的。
  • 还要仔细检查目标函数中的括号。在第一次出现CHESSB(A)) 时,您必须使用右括号。我认为您只需要在目标定义的最后再添加一个 )
  • 感谢您的帮助@DanielJunglas,我已经修改了原始帖子以包含完整模型。
  • 您的Chess2.dat 文件看起来如何?如果我使用包含此内容的文件S_COSTS: [ 0.3 0.6 0.1 0.7 0.2 0.5 0.09 0.07 0.35 0.8 ],则求解器会为每个零售商打印100,目标值为 0。请注意,您的目标函数现在是错误的。它将始终为 0。您缺少 CHESS(B)S_COSTS 那里。
  • 是的,这确实是“Chess2.dat”的样子。我已经纠正了你提到的目标函数中的错误。如果我没记错的话,我对所有行都得到 100 的事实是否会减少编程错误,而仅仅是预期错误?我期待最终结果会因行而异,而不是相同

标签: mathematical-optimization linear-programming mosel xpress-optimizer


【解决方案1】:

您的模型存在两个问题:

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

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

【讨论】:

  • 感谢您的耐心和建议@DanielJunglas,我一定会解决一个更复杂的问题
猜你喜欢
  • 2020-08-25
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多