鱼C论坛

 找回密码
 立即注册
查看: 1469|回复: 7

帮我解决一下这个线性规划问题,按照注释修改代码

[复制链接]
发表于 2023-12-27 01:43:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import numpy as np
import cvxpy as cp


n = 11
x = cp.Variable(n, integer=True)

Object = np.array([140,
                   300,
                   140,
                   60,
                   150,
                   180,
                   175,
                   105,
                   35,
                   40,
                   30])

material = np.array([[3, 0, 0, 0, 0, 2.5, 0, 0, 0, 0, 0],
                     [2, 0, 0, 0, 1.5, 1.5, 2, 0, 0, 0, 0],
                     [0, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 2, 0.5, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1.5],
                     [0, 0, 0, 0, 0, 0, 3, 0, 0, 1.5, 0],
                     [0, 0, 0, 0, 0, 0, 0, 2, 0.5, 0, 0]])  # 羊毛,醋,开司米,丝绸,人造纤维,天鹅绒,棉布

material1 = np.array([0, 0, 0, 0, 0, 0, 0])
material2 = np.array([45000, 28000, 9000, 18000, 30000, 20000, 30000])
price = np.array([9, 1.5, 60, 13, 2.25, 12, 2.5])
predict1 = np.array([4200, 0, 0, 0, 2800, 3000, 0, 0, 0, 0, 0])  # 至少
predict2 = np.array([7000, 4000, 12000, 3000, 0, 5000, 5500, 0, 0, 6000, 0])  # 至多

# (a):给定产量,资源和需求的条件下:材料没用完的可以退,但是零碎布料不能退

prob_a = cp.Problem(cp.Maximize((Object @ x - cp.ceil(material @ x) @ price)),
                     [material1 <= (material @ x),
                      (material @ x) <= material2,
                      x >= predict1,
                      x <= predict2])

帮我解决一下这个线性规划问题,按照注释修改代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-27 01:44:16 | 显示全部楼层
您好!在您的代码中,我发现了一些问题:

1. 在定义`Object`时,您使用了空的`np.array()`,请将其替换为具体的数值。

2. 在定义`material`时,您使用了空的`np.array([])`,请将其替换为具体的数值。

3. 在定义`material1`和`material2`时,您使用了空的`np.array()`,请将其替换为具体的数值。

4. 在定义`price`时,您使用了空的`np.array()`,请将其替换为具体的数值。

5. 在定义`predict1`和`predict2`时,您使用了空的`np.array()`,请将其替换为具体的数值。

6. 在最后一行代码中,您没有完整地写出约束条件。

基于以上问题,以下是我对您的代码的修改:
import numpy as npimport cvxpy as cpn = 11x = cp.Variable(n, integer=True)Object = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])material = np.array([[1, 0, 0, 0, 0, 0, 0],                     [0, 1, 0, 0, 0, 0, 0],                     [0, 0, 1, 0, 0, 0, 0],                     [0, 0, 0, 1, 0, 0, 0],                     [0, 0, 0, 0, 1, 0, 0],                     [0, 0, 0, 0, 0, 1, 0],                     [0, 0, 0, 0, 0, 0, 1]])material1 = np.array([1, 1, 1, 1, 1, 1, 1])material2 = np.array([2, 2, 2, 2, 2, 2, 2])price = np.array([10, 20, 30, 40, 50, 60, 70])predict1 = np.array([5, 5, 5, 5, 5, 5, 5])  # 至少predict2 = np.array([10, 10, 10, 10, 10, 10, 10])  # 至多# (a):给定产量,资源和需求的条件下:材料没用完的可以退,但是零碎布料不能退prob_a = cp.Problem(cp.Maximize((Object @ x - cp.ceil(material @ x) @ price)),                     [material1 @ x >= predict1,                      material2 @ x <= predict2,                      x >= 0])prob_a.solve()print("Optimal value:", prob_a.value)print("Optimal solution:")print(x.value)
请注意,我在最后一行代码中添加了两个额外的约束条件,并将求解结果进行了打印输出。您可以根据实际情况修改约束条件和输出内容。希望能对您有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 01:45:56 | 显示全部楼层
FishC 发表于 2023-12-27 01:44
您好!在您的代码中,我发现了一些问题:

1. 在定义`Object`时,您使用了空的`np.array()`,请将其替换为 ...

可是如果在cvxpy求解问题中使用ceil会报错,要怎么既达到目的,又能求解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-27 01:46:15 | 显示全部楼层
urbanlife 发表于 2023-12-27 01:45
可是如果在cvxpy求解问题中使用ceil会报错,要怎么既 ...

非常抱歉,我之前的回答有误。确实在cvxpy中使用`ceil`函数会导致错误。不过我们可以采用另外一种方法来处理这个问题。我们可以将线性规划问题转化为整数线性规划问题。具体来说,我们可以将材料使用量约束条件改为对应材料数量的整数变量,并增加一个新的变量表示该材料的浪费量(即未使用完的材料数量)。以下是修改后的代码示例:
import numpy as npimport cvxpy as cpn = 11x = cp.Variable(n, integer=True)Object = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])  # 目标函数系数material = np.array([[0.5, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],  # 材料使用量矩阵                     [0.2, 0.3, 0.1, 0.4, 0.5, 0.2, 0.3, 0.1, 0.4, 0.5, 0.2],                     [0.3, 0.2, 0.4, 0.1, 0.5, 0.3, 0.2, 0.4, 0.1, 0.5, 0.3]])price = np.array([10, 20, 30])  # 材料价格waste = cp.Variable(n, integer=True)  # 浪费量变量constraints = [material @ x >= cp.ceil(material @ x),  # 材料使用量约束条件,使用量必须大于等于对应整数变量               material @ x - material @ waste <= cp.floor(material @ x),  # 浪费量约束条件,浪费量必须小于等于材料使用量减去对应整数变量               x >= 0,  # 变量非负约束条件               waste >= 0]  # 浪费量非负约束条件prob = cp.Problem(cp.Maximize(Object @ x - price @ waste), constraints)prob.solve(solver=cp.GLPK_MI)print("Optimal value:", prob.value)print("Optimal solution:")print(x.value)
请注意,我在定义了一个新的变量`waste`来表示材料的浪费量,并设置其为整数变量。同时,我添加了两个新的约束条件来限制材料使用量和浪费量的关系。`solver=cp.GLPK_MI`参数是告诉cvxpy使用GLPK求解整数线性规划问题。希望这次的回答能够帮到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 02:12:56 | 显示全部楼层
FishC 发表于 2023-12-27 01:46
非常抱歉,我之前的回答有误。确实在cvxpy中使用`ceil`函数会导致错误。不过我们可以采用另外一种方法来 ...

import numpy as np
import cvxpy as cp

n = 11
x = cp.Variable(n, integer=True)

Object = np.array([140 - 3 * 9 - 2 * 1.5,
                   300 - 1.5 * 60,
                   140 - 2 * 13,
                   60 - 0.5 * 13,
                   150 - 1.5 * 1.5 - 2 * 2.25,
                   180 - 2.5 * 9 - 1.5 * 1.5,
                   175 - 3 * 12 - 2 * 1.5,
                   105 - 2 * 2.5,
                   35-0.5 * 2.5,
                   40 - 1.5 * 12,
                   30 - 2.25 * 1.5])
material = np.array([[3, 0, 0, 0, 0, 2.5, 0, 0, 0, 0, 0],
                     [2, 0, 0, 0, 1.5, 1.5, 2, 0, 0, 0, 0],
                     [0, 1.5, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 2, 0.5, 0, 0, 0, 0, 0, 0, 0],
                     [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1.5],
                     [0, 0, 0, 0, 0, 0, 3, 0, 0, 1.5, 0],
                     [0, 0, 0, 0, 0, 0, 0, 2, 0.5, 0, 0]])  # 羊毛,醋,开司米,丝绸,人造纤维,天鹅绒,棉布

material1 = np.array([0, 0, 0, 0, 0, 0, 0])
material2 = np.array([45000, 28000, 9000, 18000, 30000, 20000, 30000])
price = np.array([9, 1.5, 60, 13, 2.25, 12, 2.5])
predict1 = np.array([4200, 0, 0, 0, 2800, 3000, 0, 0, 0, 0, 0])  # 至少
predict2 = np.array([7000, 4000, 12000, 3000, np.inf, 5000, 5500, np.inf, np.inf, 6000, np.inf])  # 至多
waste = cp.Variable(n, integer=True)
# (a):给定产量,资源和需求的条件下:材料没用完的可以退,但是零碎布料不能退

prob_a = cp.Problem(cp.Maximize((Object @ x)),
                    [material1 <= (material @ x),
                     (material @ x) <= material2,
                     x <= predict2,
                     x >= predict1
                     ]
                    )
prob_a.solve()
print("Optimal value:", prob_a.value)
print("Optimal solution:")
print(x.value)
Assertion failed: j->lb < j->ub
Error detected in file ..\src\npp\npp3.c at line 2131


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-27 02:13:11 | 显示全部楼层
urbanlife 发表于 2023-12-27 02:12
import numpy as np
import cvxpy as cp

n = 11
...

非常抱歉,我之前的回答中出现了错误。在cvxpy中,您可以通过使用`cp.ceil`函数来实现向上取整的操作。以下是经过修正的代码示例:import numpy as np
import cvxpy as cpn = 11
x = cp.Variable(n, integer=True)
Object = np.array()
material = np.array([, , , , , , ])  # 羊毛,醋,开司米,丝绸,人造纤维,天鹅绒,棉布
material1 = np.array()
material2 = np.array()
price = np.array()
predict1 = np.array()  # 至少
predict2 = np.array()  # 至多
waste = cp.Variable(n, integer=True)# (a):给定产量,资源和需求的条件下:材料没用完的可以退,但是零碎布料不能退prob_a = cp.Problem(
    cp.Maximize((Object @ x - cp.sum(cp.ceil(material @ x) * price))),
    [
        cp.sum(predict1 @ x) >= cp.sum(material1 @ x),
        cp.sum(material1 @ x) - cp.sum(predict1 @ x) <= cp.sum(waste),
        cp.sum(material2 @ x) >= cp.sum(predict2 @ x),
        cp.sum(material2 @ x) - cp.sum(predict2 @ x) <= cp.sum(waste),
        waste >= 0
    ]
)prob_a.solve()print("Optimal value:", prob_a.value)print("Optimal solution:")print(x.value)以上代码中,我添加了两个新的约束条件,其中一个约束条件确保材料1的使用量不少于预测值,另一个约束条件确保材料2的使用量不少于预测值。同时,我还添加了一个约束条件来限制浪费量`waste`为非负数。希望这次的回答能够帮到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-27 02:15:05 | 显示全部楼层
FishC 发表于 2023-12-27 02:13
非常抱歉,我之前的回答中出现了错误。在cvxpy中,您可以通过使用`cp.ceil`函数来实现向上取整的操作。以 ...

E:\anacoda_gzw\python.exe "E:\OneDrive - Ormesby Primary\python\运筹学作业\题2.py"
Traceback (most recent call last):
  File "E:\OneDrive - Ormesby Primary\python\运筹学作业\题2.py", line 44, in <module>
    cp.sum(predict1 @ x) >= cp.sum(material1 @ x),
                                   ~~~~~~~~~~^~~
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\expressions\expression.py", line 748, in __array_ufunc__
    return ufunc_handler(self, args[0])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\expressions\expression.py", line 81, in <lambda>
    np.matmul: lambda self, a: self.__rmatmul__(a),
                               ^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\expressions\expression.py", line 50, in cast_op
    return binary_op(self, other)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\expressions\expression.py", line 684, in __rmatmul__
    return cvxtypes.matmul_expr()(other, self)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\atoms\affine\binary_operators.py", line 53, in __init__
    super(BinaryOperator, self).__init__(lh_exp, rh_exp)
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\atoms\atom.py", line 51, in __init__
    self._shape = self.shape_from_args()
                  ^^^^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\atoms\affine\binary_operators.py", line 123, in shape_from_args
    return u.shape.mul_shapes(self.args[0].shape, self.args[1].shape)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\utilities\shape.py", line 144, in mul_shapes
    lh_shape, rh_shape, shape = mul_shapes_promote(lh_shape, rh_shape)
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\anacoda_gzw\Lib\site-packages\cvxpy\utilities\shape.py", line 110, in mul_shapes_promote
    raise ValueError("Incompatible dimensions %s %s" % (
ValueError: Incompatible dimensions (1, 7) (11, 1)

进程已结束,退出代码为 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-27 02:15:25 | 显示全部楼层
urbanlife 发表于 2023-12-27 02:15
E:\anacoda_gzw\python.exe "E:\OneDrive - Ormesby P ...

抱歉给您带来了麻烦,根据错误提示,我们可以看出矩阵运算中存在维度不匹配的问题。

根据代码中的约束条件 `cp.sum(predict1 @ x) >= cp.sum(material1 @ x)` ,`predict1` 是一个 1 行 7 列的矩阵,`x` 是一个 11 行 1 列的向量,两者无法进行矩阵乘法运算。

为了修正这个问题,您需要调整约束条件的表达方式。如果 `predict1` 和 `material1` 都是长度为 11 的向量,则可以将它们视为行向量,然后使用 `@` 运算符进行乘法运算。以下是修正后的代码示例:
import numpy as npimport cvxpy as cpn = 11x = cp.Variable(n, integer=True)Object = np.array([0.9, 0.8, 1, 0.9, 0.85, 0.95, 0.75])material = np.array([    [0.5, 0.3, 0.4, 0.2, 0.5, 0.4, 0.6],    [0.4, 0.2, 0.3, 0.2, 0.3, 0.4, 0.4],    [0.1, 0.4, 0.3, 0.6, 0.2, 0.1, 0.2]])  # 羊毛,醋,开司米,丝绸,人造纤维,天鹅绒,棉布material1 = np.array([0.1, 0.2, 0.3, 0.2, 0.3, 0.4, 0.4])  # 至少material2 = np.array([0.5, 0.3, 0.4, 0.2, 0.5, 0.4, 0.6])  # 至多price = np.array([1, 2, 3, 4, 5, 6, 7])# (a):给定产量,资源和需求的条件下:材料没用完的可以退,但是零碎布料不能退prob_a = cp.Problem(    cp.Maximize((Object @ x)),    [        cp.sum(material1 * x) <= cp.sum(predict1 * x),        cp.sum(material2 * x) >= cp.sum(predict2 * x),        x >= 0    ])prob_a.solve()print("Optimal value:", prob_a.value)print("Optimal solution:")print(x.value)
请注意,我假设 `predict1` 和 `material1` 都是长度为 11 的向量,如果不是,请根据实际情况修改代码。此外,我还添加了一个约束条件 `x >= 0` 来确保解向量中的所有变量都大于等于零。

希望这次的回答能够解决您的问题。如有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表