当前位置: 首页 > 知识库问答 >
问题:

使用谷歌运筹学工具进行约束优化

萧胜
2023-03-14

我有一套许多(10000)个项目,我必须从中选择正好20个项目。我只能选择每个项目一次。我的项目有利润、成本以及几个布尔属性(如颜色)。

我已经阅读并完成了以下教程:https://developers.google.com/optimization/mip/integer_opt_cp和https://developers.google.com/optimization/mip/integer_opt,但我的约束条件与此处给出的约束条件略有不同。

每个项都表示为一个元组:

item = ('item name', cost, profit, is_blue)

例如

vase = ['Ming Vase', 1000, 10000, 0]

plate = ['China Plate', 10, 5, 1]

项目的总集是一个列表列表:

items = [item1, item2, ..., itemN].

我的利润和成本也是列表:

profits = [x[2] for x in items]
costs = [x[1] for x in items]

对于所选的每个项目,它需要有一个最小值,并且至少有5个项目必须将属性(is_blue)标志设置为1。

我想选择价值最高的20个最便宜的项目,其中5个项目的属性标志设置为1。

我很难用谷歌或其他工具来描述这一点。

from ortools.linear_solver import pywraplp

solver = pywraplp.Solver('SolveAssignmentProblemMIP',
                       pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

x = {}

for i in range(MAX_ITEMS):
    x[i] = solver.BoolVar('x[%s]' % (i))

#Define the constraints 
total_chosen = 20
solver.Add(solver.Sum([x[i] for i in range(MAX_ITEMS)]) == total_chosen)

max_cost = 5.0

for i in range(num_recipes):
    solver.Add(x[i] * cost[i] <= max_cost)

solver.Maximize(solver.Sum([profits[i] * x[i] for i in range(total_chosen)]))
sol = solver.Solve()

我可以通过以下方式获得我选择的项目集:

for i in range(MAX_ITEMS):
    if x[i].solution_value() > 0:
        print(item[i].item_name)

这很好用-它选择了20个项目集,根据成本约束最大化利润,但我一直在研究如何将其扩展到选择属性(is\u blue)设置为true或false的项目。

制定约束条件和目标方面的任何帮助都会非常有用。谢谢

共有2个答案

乐正宜人
2023-03-14

所以,经过一周的思考,我知道如何回答这个问题:毕竟这真的很容易。

只需定义一个列表:

is_blue = [x[3] for x in items]

然后添加:

solver.Add(solver.Sum([x[i] * is_blue[i] for i in range(MAX_ITEMS)] == num_blue)

到约束列表。

窦彦君
2023-03-14

我不明白为什么要最小化值(cfg['Item'][i][2]=value)。你想要最高的值。

你的型号与背包相似。只有您将为成本(小于总成本)和标志(总标志大于5)添加额外约束。还有,你说过你会选20件。但您的约束限制为15项(最多项)。

或工具页面在箱子包装标题下有背包问题的详细说明。

我想你编辑了你的问题。“is\u blue”属性只需要一个约束。但现在你的模型有不同的问题。

>

  • 如果成本的列表名称为“成本”,则必须更改约束,因为您使用的是“成本”命名列表。

    对于范围内的i(num\u配方):解算器。添加(x【i】*成本【i】

    这是你的目标函数。

    solver.Maximize(solver.Sum([profits[i] * x[i] for i in range(total_chosen)])) 
    

    但您只将前20项添加到目标函数中。您需要更改使用MAX\u项选择的total\u。例如:

    solver.Maximize(solver.Sum([profits[i] * x[i] for i in range(MAX_ITEMS)]))
    

    最后一个是蓝色约束。我知道您想选择至少5个蓝色项目。

    blues = [x[3] for x in items]
    solver.Add(solver.Sum([blues[i] * x[i] for i in range(MAX_ITEMS)]) >= 5)
    

  •  类似资料:
    • 问题内容: 我正在研究触发器和约束。 我有一个使用触发器的问题(说实话,我不确定如何使用触发器。) 假设我们有一个教师表。 这个教师表包含Teacher_id,ssn,first_name,last_name,class_time 例如, 和 假设学生人数上限为25(学生人数上限由老师定义,因此可以是10、22、25 …等任意数字) 一个学生想添加鲍勃的班级。但是,我想触发拒绝添加学生的触发器。(

    • 我注意到谷歌通过网址接受任何语言的音译和IME请求: 其中,是以下任何语言和文本的变量。 比如法语(试试看): 或者,普通话(试试看): 所有语言工作和返回伟大的建议。问题是我在网上找不到这个留档,尽管它看起来很像一个应用编程接口。有人知道谷歌是否有官方客户端,或者他们是否同意未经验证的原始请求吗? jQuery之类的插件可能非正式地使用了它。中国时代。js,但如果您能提供任何官方使用信息,我将不

    • 秋招第一面-饿了么 深挖实习经历 聊感较好 感觉业务方向比较match 问了会不会机器学习 回答不咋会😿😿😿 是不是运筹都要会点ML啊? #你的秋招第一面感觉怎么样#

    • 我有一张保存ID的表。现在,我偶尔需要读取这些ID,并检查表中的其他值(名称)是否仍然符合ID。我的代码是: 从我所读到的,我知道单独调用每个单元格值需要更多的时间。然而,我不知道如何应用getValue来修复这些情况。基本上相同的问题在不同的衣服我有以下代码: 那么我如何使用get值来检查我得到的每个ID呢。我想我得用一些 或者 但我不知道如何实施,有什么想法吗? 有没有其他更有效的方法

    • 背景:211本硕,一作SCI一区论文两篇,无实习。 官网投递简历(7.30) 笔试(9.20) 投了将近两个月才发笔试,差点以为简历挂了。题的细节记不太清了,只记得第一题正则表达式相关直接跳过,第二题密码相关对80%,第三题切水果对70%。 一面(9.24) 1. 自我介绍; 2. 问其中一篇论文的细节(10分钟左右); 3. 运筹优化基础知识(遗传算法原理、粒子群算法原理、线性规划单纯形法原理等

    • 我目前在我的网站上部署了Google Tag Manager,在我的容器中只有一个标准的Google Analytics标签,可以在每个页面上启动。我想捕捉我的网站访问者在我们的网站上搜索产品时使用的术语。回到Google Analytics,我启用了站点搜索,并在包含访问者站点搜索词的URL中提供了查询参数。然而,没有任何数据能够返回到Google Analytics中的站点搜索报告中,因此我想