首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >约束优化:只适用于继续选择的第二项的条件?

约束优化:只适用于继续选择的第二项的条件?
EN

Stack Overflow用户
提问于 2022-08-26 03:32:31
回答 1查看 53关注 0票数 0

我有一个约束优化问题(特别是OR工具)。我正努力将不同运输供应商发送包裹的成本降到最低。它们中的每一个都有一定的维度约束,但一些航运供应商可以选择发送多个包裹,而且对于第二项产品,他们的价格更低。

如何合并约束(或目标)?对选定的第一个项目收取一个价格,对所有其他项目收取不同的价格?如果有任何方法使其分层,奖金点-例如,为所选的第一个项目设置一个价格,通过第5项的另一个价格,以及对项目6+.的第三个价格。

以下是我的一些代码供参考--如果有什么事情看不见/您将如何改进,请告诉我:

def cost_optimisation():

代码语言:javascript
运行
AI代码解释
复制
# Instantiate solver
solver = pywraplp.Solver.CreateSolver('SCIP')

# Get data
data = get_model_data()

### VARIABLES ###

# whether a courier can ship a parcel (T or F depending on whether the courier is eligible to ship the parcel)
parcel_by_courier = {}
for parcel_num in data['parcel_range']:
    for courier_num in data['courier_range']:
        parcel_by_courier[parcel_num, courier_num] = solver.BoolVar(f"parcel_{parcel_num}_courier_{courier_num}")

# the total number of parcels shipped by a courier
all_courier_sums = {}
for courier_num in data['courier_range']:
    all_courier_sums[courier_num] = solver.IntVar(0, len(data['parcel_range']), f"{data['courier_names'][courier_num]}_total_parcels_shipped")

print('Number of variables =', solver.NumVariables(), '\n')

### CONSTRAINTS ###

# add constraint that all parcels have to be shipped
for parcel_num in data['parcel_range']:
    solver.Add(sum(parcel_by_courier[parcel_num, courier_num] for courier_num in data['courier_range']) == 1)

# add weight & dimension constraints
for parcel_num in data['parcel_range']:
    for courier_num in data['courier_range']:
        solver.Add(parcel_by_courier[parcel_num, courier_num] * data['parcel_weights'][parcel_num] <= parcel_by_courier[parcel_num, courier_num] * data['courier_weights'][courier_num])
        solver.Add(parcel_by_courier[parcel_num, courier_num] * data['parcel_largest_dimensions'][parcel_num] <= parcel_by_courier[parcel_num, courier_num] * data['courier_largest_dimensions'][courier_num])

# add a constraint that couriers can only ship >1 parcel IF "further_item_allowed" = True
for courier_num in data['courier_range']:
    solver.Add(sum(parcel_by_courier[parcel_num, courier_num] for parcel_num in data['parcel_range']) <= 1 if data['courier_further_item_allowed'][courier_num] is False else sum(parcel_by_courier[parcel_num, courier_num] for parcel_num in data['parcel_range']) >= 0)

print('Number of constraints =', solver.NumConstraints(), '\n')

### OBJECTIVE ###

# Calculate costs for the objective and run the solver

total_base_item_cost = []

for courier_num in data['courier_range']:
    for parcel_num in data['parcel_range']:
        if all_courier_sums[courier_num] >= 2:
            if ???:
                total_base_item_cost.append(data['courier_first_item_pence'][courier_num] * parcel_by_courier[parcel_num, courier_num])
            else:
                total_base_item_cost.append(data['courier_further_item_pence'][courier_num] * parcel_by_courier[parcel_num, courier_num])
        else:
            total_base_item_cost.append(data['courier_first_item_pence'][courier_num] * parcel_by_courier[parcel_num, courier_num])

total_cost = sum(total_base_item_cost)

solver.Minimize(total_cost)
status = solver.Solve()

(很明显,???是我开始失去它的地方)

EN

回答 1

Stack Overflow用户

发布于 2022-08-26 05:41:53

测试IntVar值的结构,如if语句中的

代码语言:javascript
运行
AI代码解释
复制
if all_courier_sums[courier_num] >= 2:

都不管用。IntVar的值不是在求解器之外定义的,它只是一个容器,它的值将在解决方案期间确定。

首先,添加一个约束以强制all_courier_sums[courier_num]等于该信使的parcel_by_courier之和。

代码语言:javascript
运行
AI代码解释
复制
for courier_num in data['courier_range']:
    solver.Add(Sum(parcel_by_courier[parcel_num, courier_num] for parcel_num in data['parcel_range']) == all_courier_sums[courier_num])

为每个信使定义一个变量courier_cost[courier_num]

然后,您可以为每个快递员创建一个成本公式,如下所示:

代码语言:javascript
运行
AI代码解释
复制
for courier_num in data['courier_range']:
    p1 = data['courier_first_item_pence'][courier_num]
    p2 = data['courier_further_item_pence'][courier_num]
    c1 = solver.IntVar(0, len(data['parcel_range']) * max_cost_per_parcel)
    solver.Add(c1 == (p1 * all_courier_sums[courier_num]))
    qty2 = solver.IntVar(0, len(data['parcel_range']))
    solver.AddMaxEquality(qty2, [0, (all_courier_sums[courier_num] - 1)])
    c2 = solver.IntVar(0, len(data['parcel_range']) * max_cost_per_parcel)
    solver.Add(c2 == ((p2 - p1) * qty2)
    solver.Add(courier_cost[courier_num] == c1 + c2)

注意:我实际上没有检查这个语法。如果它不起作用,将其分解为单个术语的独立变量,并逐项构建表达式。求解者将在内部创建这些额外的变量,即使您没有显式地这样做。

如果有更多的中间价格水平,你可以扩展这里的原则为第4,6或任何价格步骤有。

要获得总成本,必须将变量total_cost设置为IntVar

将其限制为在信使范围内的courier_cost[courier_num]courier_num之和。

然后,您可以使用total_cost作为目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73500391

复制
相关文章
有约束最优化问题MATLAB_约束条件下的最优化问题
最近在做天线多目标优化的实例,因此接触到了NSGA-Ⅱ算法,所以想分享以下我个人的学习内容与经历,仅作参考,如果内容有误,也希望各位能够指出来,大家一起进行交流指正。 内容将分为以下几个模块,内容可能较多,如果觉得不错的话,可以点赞👍,收藏或者转发哦! 目录 NSGA-Ⅱ算法简介 非支配集排序 锦标赛选择 模拟二进制交叉 多项式变异 精英保留策略 参考文献 NSGA-Ⅱ算法简介 NSGA-Ⅱ算法由Deb等人首次提出,其思想为带有精英保留策略的快速非支配多目标优化算法,是一种基于Pareto最
全栈程序员站长
2022/11/07
1.5K0
有约束最优化问题MATLAB_约束条件下的最优化问题
oracle约束条件
http://www.cnblogs.com/lm970585581/p/7076084.html
HUC思梦
2020/09/03
5200
规范约束条件
我们在开发时往往会对泛型指定约束条件,只有类型参数符合条件的才允许用在这个泛型上面。但是有时我们会定义过多或过少的约束条件,过多的约束条件会导致其他开发人员在使用你所编写的方法或类时做很多的工作以满足这些约束,过少的约束又会导致程序在运行的时候必须做很多的检查,并执行更多的强制类型转化操作,有时我们还需要使用反射生成运行期错误,来防止用户误用这个类。要解决这些问题,我们就必须把确实需要的约束写出来,这句话说起来简单,其实做起来不太容易。下面我就来讲解一下如何正确的编写一个规范的约束。
喵叔
2020/09/08
9640
MySQL 约束条件[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183893.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1.8K0
约束优化理论的推导
本来是打算解释一下数据包络分析的,考虑到原理里面有对偶问题的涉及,那就先从原理的角度简述一下约束优化的对偶优化问题以及kkt条件吧,这同样也是支持向量机中比较核心的知识点,笔者在某厂面试时被手推过这个,最终也是因为解释出来了kkt条件而过了面试,所以重要性还是不言而喻的。
用户7506105
2021/08/09
8180
数据库表的约束条件[通俗易懂]
解释: on delete set null 一旦主表数据删除,从表关联数据置为null on delete cascade 级联删除,主表数据删除,从表关联数据也删除
全栈程序员站长
2022/11/08
1.1K0
拉格朗日乘子法和KKT条件无约束最优化方法
拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush-Kuhn-Tucker)条件是求解约束优化问题的重要方法,在有等式约束时使用拉格朗日乘子法,在有不等约束时使用KKT条件。前提是:只有当目标函数为凸函数时,使用这两种方法才保证求得的是最优解。
Gxjun
2018/10/09
1.6K0
拉格朗日乘子法和KKT条件无约束最优化方法
【说站】mysql约束条件not null的使用
1、该约束条件的意思是在向表中插入数据的时候,有约定条件not null的列值不能为空,否则会报错。
很酷的站长
2022/11/23
9780
【说站】mysql约束条件not null的使用
约束条件(constraint)「建议收藏」
约束条件也叫完整性约束条件,当对表中的数据做DML操作时会验证数据是否违反约束条件.如果违反了DML操作会失败.约束条件可以应用于表中的一列或几列,应用于整个表或几个表之间.
全栈程序员站长
2022/11/04
1.7K0
SQLServer里面添加约束条件[通俗易懂]
1、主键约束: 格式: alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)
全栈程序员站长
2022/11/08
2.2K0
条件选择css
效果图: image.png 1. CSS <style> .select_row{ float:left;width:100%; height:22px; margin-bottom:5px} .select_row a{height:auto; display:block;font-size:13px; text-align:center} .col_blue{color:#06c} .select_condition{ width:80px; float:left; height:
week
2018/08/27
5060
条件选择css
如何优化冗长的条件语句
【1】尽量少用 else 尽量多用 if reture 的语法方式。 【2】字典的逻辑对应转化作用。 【3】用多态替代条件语句 【4】策略模式,继承重写,抽象父类和统一的接口入口。
進无尽
2018/09/12
1.4K0
如何优化冗长的条件语句
MySQL常见约束条件「建议收藏」
约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败! 约束条件在创建表时可以使用, 也可以修改表的时候添加约束条件
全栈程序员站长
2022/11/04
1.7K0
无约束优化
Quasi-Newton Method (拟牛顿法)。在介绍无约束优化问题之前,我们首先会从直观上引入无约束优化的概念,并在此基础上引入解这类问题的两个重要概念:步长和方向。由步长的选择引入重要概念 line search,由方向的选择引入重要概念 Quasi-Newton Method。因此本篇介绍文档主要分为以下几个部分:无约束优化问题引入,Line Search,Quasi-Newton Method 和算法总结。
用户2188327
2020/07/02
5680
无约束优化
MySQL:【第二篇 约束】
MySQL约束 (一) 概念 约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性。 分类: 1. 主键约束:primary KEY 2. 非空约束:not NULL 3. 唯一约束:unique 4. 外键约束:foreign KEY (二) 约束详解 (1) 非空约束 -- 语法 not null,值不能为null -- 1. 创建表时添加约束 CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT
BWH_Steven
2019/08/09
5770
约束优化(Constrained optimization)
约束优化(Constrained Optimization),即约束优化问题,是优化问题的分支。它是在一系列约束条件下,寻找一组参数值,使某个或某一组函数的目标值达到最优。其中约束条件既可以是等式约束也可以是不等式约束。寻找这一组参数值的关键可是:满足约束条件和目标值要达到最优。求解约束问题的方法可分为传统方法和进化算法。
easyAI
2019/12/18
1.9K0
针对属性的条件编译优化
随着时间的推移,Swift 引入了许多新的属性,用来在源代码中传递额外信息。现有代码可以利用新的构造来改进,引入新功能,提供新的编译检查,更好的性能等等。但是,现有代码引入新属性意味着不能在旧的编译器上使用。自然而然你会想到用条件编译来解决该问题。例如可以使用#if 检查编译器版本,查看是否可以使用@preconcurrency属性:
DerekYuYi
2022/11/09
9750
商城项目-页面展示选择的过滤项
当用户选择一个商品分类以后,我们应该在过滤模块的上方展示一个面包屑,把三级商品分类都显示出来。
cwl_java
2020/02/11
7250
梳理 6 项 webpack 的性能优化
webpack在启动后,会根据Entry配置的入口,递归解析所依赖的文件。这个过程分为「搜索文件」和「把匹配的文件进行分析、转化」的两个过程,因此可以从这两个角度来进行优化配置。
Nealyang
2020/07/24
1.9K0
Kafka 的 20 项最佳优化实践
本文整理于网络翻译,英文原文:https://blog.newrelic.com/engineering/kafka-best-practices/
大数据技术架构
2019/08/16
2.1K0
Kafka 的 20 项最佳优化实践

相似问题

只适用于传递依赖项的分级约束

13

优化中的条件约束

12

Matlab优化-约束优化变量的条件和

20

变更约束第二项

20

求解优化问题的约束条件

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档