Xpress Mosel 为所有行返回零
Xpress Mosel returning zeroes for all rows
我是 Xpress Mosel 和线性规划的绝对初学者,所以如果我犯了任何明显的错误,请原谅我。也就是说,我目前正在编写一个问题并在 Xpress Workbench.
中实现它
问题:
假设有这样一种情况,一家小型国际象棋制造商生产国际象棋 A 和 B。国际象棋 A 的价格为 30 美元,而国际象棋 B 的价格为 40 美元。国际象棋制造商收到了 10 家零售商的订单,他们希望同时购买这两套国际象棋,每家零售商为售出的每套国际象棋承担不同的运费。如果国际象棋制造商只能向每个零售商销售至少 100 套国际象棋,最多只能销售 300 套国际象棋,那么国际象棋制造商应该向每个零售商销售多少套国际象棋才能使利润最大化?
如果我没记错的话,objective 函数应该是:
利润 = (30 * x1 - s * x1) + (40 * x2 - s * x2)
其中 x1 是国际象棋 A 的数量,X2 是国际象棋 B 的数量,s 是运费。
约束是:
x1, x2 <= 300
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 是运费。
运行 但是,此问题对所有零售商都返回了零。对于我在这里做错了什么,我非常感谢您的反馈。
您的模型有两个问题:
首先,您没有初始化 PROFITOFCHESSA
或 PROFITOFCHESSB
。所以它们都将为 0,即生产任何模型都不会获得利润。更糟糕的是,对于生产的每个型号,您都必须支付运费。由于目标是最大化利润,求解器将选择生产尽可能少的模型。每个零售商至少要生产 100 个模型(根据您的限制)。因此,求解器会为每个零售商提供这个最小金额。
第二个问题是你的模型有点太简单了:你每生产一件,你就得到一些利润并支付一些运费。如果利润大于运输成本,那么最好的解决方案是生产尽可能多的商品(在您的情况下,每个零售商生产 300 件)。如果利润小于运输成本,那么最好的解决方案是生产尽可能少的商品(每个零售商 100 件)。所以这里没有太多需要优化的地方。
我是 Xpress Mosel 和线性规划的绝对初学者,所以如果我犯了任何明显的错误,请原谅我。也就是说,我目前正在编写一个问题并在 Xpress Workbench.
中实现它问题:
假设有这样一种情况,一家小型国际象棋制造商生产国际象棋 A 和 B。国际象棋 A 的价格为 30 美元,而国际象棋 B 的价格为 40 美元。国际象棋制造商收到了 10 家零售商的订单,他们希望同时购买这两套国际象棋,每家零售商为售出的每套国际象棋承担不同的运费。如果国际象棋制造商只能向每个零售商销售至少 100 套国际象棋,最多只能销售 300 套国际象棋,那么国际象棋制造商应该向每个零售商销售多少套国际象棋才能使利润最大化?
如果我没记错的话,objective 函数应该是:
利润 = (30 * x1 - s * x1) + (40 * x2 - s * x2)
其中 x1 是国际象棋 A 的数量,X2 是国际象棋 B 的数量,s 是运费。
约束是:
x1, x2 <= 300
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 是运费。
运行 但是,此问题对所有零售商都返回了零。对于我在这里做错了什么,我非常感谢您的反馈。
您的模型有两个问题:
首先,您没有初始化 PROFITOFCHESSA
或 PROFITOFCHESSB
。所以它们都将为 0,即生产任何模型都不会获得利润。更糟糕的是,对于生产的每个型号,您都必须支付运费。由于目标是最大化利润,求解器将选择生产尽可能少的模型。每个零售商至少要生产 100 个模型(根据您的限制)。因此,求解器会为每个零售商提供这个最小金额。
第二个问题是你的模型有点太简单了:你每生产一件,你就得到一些利润并支付一些运费。如果利润大于运输成本,那么最好的解决方案是生产尽可能多的商品(在您的情况下,每个零售商生产 300 件)。如果利润小于运输成本,那么最好的解决方案是生产尽可能少的商品(每个零售商 100 件)。所以这里没有太多需要优化的地方。