因为工作原因需要了解一些运筹优化相关的算法,所以在同事的介绍下找了《运筹学导论(第10版)》(Introduction to Operations Research)看。最近又在微信群中看到有些同学在讨论,于是乎便把用到的相关工具,以及简单用法做一些记录。(后续可能还会逐步更新)

二、多目标优化问题

优化目标1:

import pulp
from pulp import LpVariable, LpProblem, LpMaximize
# 最大化一个目标,然后将其添加为约束并解决另一个目标
linear_prob = LpProblem('为第一目标最大化', LpMaximize)
# variable
x1 = LpVariable('x1', lowBound=0)
x2 = LpVariable('x2', lowBound=0)
# max_target
linear_prob += 2*x1 + 3*x2
# s.t.
linear_prob += x1 + x2 <= 10
linear_prob += 2 * x1 + x2 <= 15
# solve
solution = linear_prob.solve()
print('Obj: {Obj}; \nmax = {max_} \nSolution:  x1={x1} x2={x2}'.format(
        Obj = linear_prob.objective,
        max_=pulp.value(linear_prob.objective),
        x1 = pulp.value(x1),
        x2 = pulp.value(x2)
Obj: 2*x1 + 3*x2;
max = 30.0
Solution:  x1=0.0 x2=10.0

基于第一个解,将其作为限制解决第二个目标

linear_prob_sec = LpProblem('为第二目标最大化', LpMaximize)
# max_target
linear_prob_sec += 4*x1 - 2*x2
# s.t.
linear_prob_sec += x1 + x2 <= 10
linear_prob_sec += 2 * x1 + x2 <= 15
linear_prob_sec += 2*x1 + 3*x2 >= 30
# solve
solution = linear_prob_sec.solve()
print('Obj: {Obj}; \nmax = {max_}\nSolution:  x1={x1} x2={x2}'.format(
        Obj = linear_prob_sec.objective,
        max_=pulp.value(linear_prob_sec.objective),
        x1 = pulp.value(x1),
        x2 = pulp.value(x2)
Obj: 4*x1 - 2*x2;
max = -19.999999999995993
Solution:  x1=1.0018653e-12 x2=10.0

3.1.2 使用采样的权重和具有定义步长的迭代组合目标

现在的问题是如何选择α。
在这种情况下,典型的方法是确定有效边界。在经济学中,例如被称为“最佳最优”。

优化目标: x1+x2102x1+x215x1,x20

import matplotlib.pyplot as plt
import pulp
from pulp import LpVariable, LpProblem, LpMaximize
import numpy as np
import pandas as pd
plt.style.use('ggplot')
x1 = LpVariable('x1', lowBound=0)
x2 = LpVariable('x2', lowBound=0)
step_size = 0.01
sove_df = pd.DataFrame(columns=['alpha', 'x1', 'x2', 'obj_v', 'org_v'])
for i in range(0, 101, int(step_size * 100)):
    lp = LpProblem('多目标优化', LpMaximize)
    # obj
    lp += (i/100)*(2*x1 + 3*x2) + (1 - i/100)*(4*x1 - 2*x2)
    # s.t.
    lp += x1 + x2 <= 10
    lp += 2 * x1 + x2 <= 15
    res = lp.solve()
    x1_, x2_ = pulp.value(x1), pulp.value(x2)
    org_v = (2*x1_ + 3*x2_) + (4*x1_ - 2*x2_)
    sove_df.loc[int(i/(step_size*100))] = [i/100, x1_, x2_, pulp.value(lp.objective), org_v]
sv_max = sove_df['obj_v'].max()
sv_min = sove_df['obj_v'].min()
plt.title('$ \\alpha \  With \  max_{x_1,x_2} \\alpha(2x_1 + 3x_2) + (1-\\alpha)(4x_1 - 2x_2)$')
plt.plot(sove_df["alpha"], sove_df["obj_v"],color="darkred", alpha=0.7, label="obj_v")
for idx, row in sove_df[sove_df['obj_v']==sv_max].iterrows():
    plt.text(row.alpha, row.obj_v, f'alpha={row.alpha:.3f} obj={row.obj_v:.2f}\n(x1={row.x1}, x2={row.x2})')
for idx, row in sove_df[sove_df['obj_v']==sv_min].iterrows():
    plt.text(row.alpha, row.obj_v, f'alpha={row.alpha:.3f} obj={row.obj_v:.2f}\n(x1={row.x1}, x2={row.x2})')
plt.plot(sove_df["alpha"], sove_df["org_v"],color="steelblue", alpha=0.7, linestyle='--', label="org_v")
# plt.ylim(15, 35)
plt.xlim(0, 1.5)
plt.legend()
plt.xlabel("alpha", size=12)
plt.ylabel("obj_value", size=12)
plt.show()
				
文章目录1 PuLP介绍1.1 理论、流程介绍1.2 主函数介绍1.2.1 LpProblem类1.2.2 LpVariable类1.2.3 lpSum(vector)1.3 一些函数写法优化1.3.1 赋值1.3.2 PuLP里面不可使用的案例一:优化投放广告渠道的资源案例二:如何分配水库供水量,公司才能获利最多案例三: 求解最普通的线性规划问题案例四:运输问题案例五:指派问题 1 PuLP介绍 1.1 理论、流程介绍 线性规划是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。Pytho.
c1 = np.array([-2, -3]) c2 = np.array([1, 2]) a = np.array([[0.5, 0.25], [0.2, 0.2], [1, 5], [-1, -1]]) b = np.array([8, 4, 72, -10]) x = cp.Variable(2, pos=True) # 1.线性加权法求解 obj = cp.Minimi...
求解多目标线性规划的基本思想是将多目标转化为单目标,常见的方法有理想点法、线性加权法、最大最小法、目标规划法、模糊数学解法等。这里就这几种方法进行举例说明,并用matlab实现。 一、多目标线性规划模型 多目标线性规划模型是有两个或两个以上的目标函数,且所有的目标函数和约束条件都是线性的,数学模型表示为: 则上述目标规划可简化为: 上图所示的Whiskas猫粮由Ben生产。Ben希望尽可能便宜地生产其猫粮,同时确保它们满足罐头上所示的规定的营养分析要求。因此,他们希望改变每种成分的使用量(主要成分是鸡肉,牛肉,羊肉,大米,小麦和凝胶),同时仍要满足其营养标准。 鸡肉,牛肉和羊肉的成本分别为0.013美元,0.008美元和0.010美元,而大米,小麦和凝胶的成本分别为0.002美元,0.005美元和0.001美元。(所有成本均为每克。)在此练习中,我们将忽略维生素和矿物质成分。(无论如何,这些的任何费用都可能很小。) 【论文解读】CIKM 2022: STID: A Simple yet Effective Baseline for Multivariate Time Series Forecasting Scc_hy: 嗯嗯,这里描述确实不准确了。 下意识的,认知中一般1*1的conv常用在构建bottle neck减少参数量上用,不然通道的变化进行一些处理会有些麻烦。论文实现可能是因为做了一些卷积实验,最终保留采用了conv1*1