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