【发布时间】: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
每个零售商的运费为:
我在 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