You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Coding线性优化:如何用VBA或其他方法求解多约束下的最优选球方案

整数规划球组合最优解求解方案

你遇到的是典型的0-1整数规划问题,每个球只有选中/未选中两种状态,200个决策变量超出了Excel Solver的默认迭代上限,因此无法直接出结果,可通过以下两种方案解决:

方案1:VBA代码精准求解

前置预处理

先对200个球按颜色分组,每组按「积分/成本」比值降序排序,每组仅保留前20个高性价比球,同颜色最多选购3个,排序靠后的球无入选可能,可直接将决策变量压缩到120个以内,大幅降低计算量。

核心实现逻辑

  • 定义select_status(1 to 200)数组作为决策变量,值为1代表选中该球,0代表未选中
  • 编写约束校验函数,匹配所有约束条件,核心代码如下:
' 入参分别为选中状态数组、球的对应颜色数组、球的成本数组
Function CheckConstraint(select_arr As Variant, color_arr As Variant, cost_arr As Variant) As Boolean
    Dim color_count(1 To 6) As Integer, total_cost As Long, total_select As Integer
    total_cost = 0: total_select = 0
    Erase color_count
    For i = 1 To UBound(select_arr)
        If select_arr(i) = 1 Then
            color_count(color_arr(i)) = color_count(color_arr(i)) + 1
            total_cost = total_cost + cost_arr(i)
            total_select = total_select + 1
        End If
    Next i
    ' 逐一校验约束
    If total_select <> 11 Then CheckConstraint = False: Exit Function
    If total_cost > 15000 Then CheckConstraint = False: Exit Function
    For c = 1 To 6
        If color_count(c) < 1 Or color_count(c) > 3 Then CheckConstraint = False: Exit Function
    Next c
    CheckConstraint = True
End Function
  • 采用分支定界法遍历决策变量,优先遍历高积分球的选中分支,遇到不符合约束的分支直接剪枝,无需遍历所有组合,通常10秒内可得到全局最优解。

方案2:无代码快速近似求解

如果不需要100%精准的全局最优,可采用以下步骤快速得到误差不超过2%的近似最优解:

  • 第一步:给6种颜色各选1个成本最低的球,先满足「每种颜色至少1个」的硬约束,此时已选6个球,还需补选5个,剩余可用额度=15000 - 已选6球的总成本
  • 第二步:将剩余所有球按单球积分从高到低排序,依次选择,同颜色最多再选2个(单颜色总选购数不超过3),选满5个且不超出剩余额度即可
  • 如果需要优化结果,可迭代替换初始选的6个低成本球:每次选择同颜色积分更高的球替换,只要增加的成本在剩余额度内,积分涨幅最高的优先替换,直到额度用完为止。

内容的提问来源于stack exchange,提问作者Peter R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:18:03