使用 GEKKO python 时的负自由度

2024-02-14

我正在尝试解决上述优化问题。 我的代码如下。

它有效,但我得到了负自由度问题。

而且客观价值也是负数,这是我没想到的。我期待着积极的一面。

我不明白为什么会发生这种情况,也不知道如何解决这个问题。

有人可以给我一个建议吗?

Code

# Import package
from gekko import GEKKO
import numpy as np

# Define parameters
P_CO = 600                      # $/tonCO
beta_CO2 = 1                    # no unit
P_CO2 = 60                      # $/tonCO2eq
E_ref = 3.1022616               # tonCO2eq/tonCO
E_dir = -1.600570692            # tonCO2eq/tonCO
E_indir_others = 0.3339226804   # tonCO2eq/tonCO
E_indir_elec_cons = 18.46607256 # GJ/tonCO
C1_CAPEX = 285695               # no unit
C2_CAPEX = 188.42               # no unit
C1_FOX = 82282                  # no unit
C2_FOX = 24.094                 # no unit
C1_ROX = 4471.5                 # no unit
C2_ROX = 96.034                 # no unit
C1_UOX = 1983.7                 # no unit
C2_UOX = 249.79                 # no unit
r = 0.08                        # discount rate
N = 10                          # number of scenarios
T = 30                          # total time period
GWP_init = 0.338723235          # 2020 Electricity GWP in EU 27 countries
theta_max = 1600000             # Max capacity

# Function to make GWP_EU matrix (TxN matrix)
def Electricity_GWP(GWP_init, n_years, num_episodes):

    GWP_mean = 0.36258224*np.exp(-0.16395611*np.arange(1, n_years+2)) + 0.03091272
    GWP_mean = GWP_mean.reshape(-1,1)
    GWP_Yearly = np.tile(GWP_mean, num_episodes) 

    noise = np.zeros((n_years+1, num_episodes))
    stdev2050 = GWP_mean[-1] * 0.25 
    stdev = np.arange(0, stdev2050 * (1 + 1/n_years), stdev2050/n_years)

    for i in range(n_years+1):
        noise[i,:] = np.random.normal(0, stdev[i], num_episodes) 

    GWP_forecast = GWP_Yearly + noise 

    return GWP_forecast

GWP_EU = Electricity_GWP(GWP_init, T, N) # (T+1)*N matrix
GWP_EU = GWP_EU[1:,:] # T*N matrix

print(np.shape(GWP_EU))

# Build Gekko model
m = GEKKO(remote=False)
theta = m.Array(m.Var, N, lb=0, ub=theta_max)
demand = np.ones((T,1))
demand[0] = 8031887.589
for k in range(1,11):
    demand[k] = demand[k-1] * 1.026 
for k in range(11,21):
    demand[k] = demand[k-1] * 1.016
for k in range(21,T):
    demand[k] = demand[k-1] * 1.011 
demand = 0.12 * demand
demand = np.tile(demand, N) # T*N matrix

print(np.shape(demand))

obj = m.sum([m.sum([((1/(1+r))**(t+1))*((P_CO*m.min3(demand[t,s], theta[s])) \
            + (beta_CO2*P_CO2*m.min3(demand[t,s], theta[s])*(E_ref-E_dir-E_indir_others-E_indir_elec_cons*GWP_EU[t,s])) \
            - (C1_CAPEX+C2_CAPEX*theta[s]+C1_FOX+C2_FOX*theta[s])-(C1_ROX+C2_ROX*m.min3(demand[t,s], theta[s])+C1_UOX+C2_UOX*m.min3(demand[t,s], theta[s]))) for t in range(T)]) for s in range(N)])
m.Maximize(obj/N)
m.solve() 

输出信息

(30, 10)
(30, 10)
 ----------------------------------------------------------------
 APMonitor, Version 1.0.0
 APMonitor Optimization Suite
 ----------------------------------------------------------------
 
 
 --------- APM Model Size ------------
 Each time step contains
   Objects      :  11
   Constants    :  0
   Variables    :  5121
   Intermediates:  0
   Connections  :  321
   Equations    :  3901
   Residuals    :  3901
 
 Number of state variables:    5121
 Number of total equations: -  3911
 Number of slack variables: -  2400
 ---------------------------------------
 Degrees of freedom       :    -1190
 
 * Warning: DOF <= 0
 ----------------------------------------------
 Steady State Optimization with APOPT Solver
 ----------------------------------------------
Iter:     1 I:  0 Tm:     18.61 NLPi:    5 Dpth:    0 Lvs:    0 Obj: -1.87E+09 Gap:  0.00E+00
 Successful solution
 
 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :  18.619200000000003 sec
 Objective      :  -1.8677021320161405E+9
 Successful solution
 ---------------------------------------------------


负自由度警告是因为使用时创建的松弛变量min3()功能。这只是一个警告,如果所有不等式都有效,那么这可能会导致方程组过度指定(方程多于变量)。如果有成功的解决方案,则可以忽略此警告。

负面目标是因为大多数求解器都需要目标的最小化。 Gekko 自动转换m.Maximize(obj) to m.Minimize(-obj)。这是一个同等的目标。如果您想报告最大化和积极目标,请在末尾使用以下内容:

print('Objective: ',-m.options.OBJFCNVAL)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GEKKO python 时的负自由度 的相关文章

随机推荐

  • 如何在 Angular 2 中打印 PDF

    我有 pdf 文件的 URL exa url 是 test example com incoice 1 download auth token some token 当我访问此 url 时 该 url 将在浏览器中显示 PDF 现在我想用打
  • 如何使用 Bresenham 创建任意粗细的线?

    我目前正在使用 Bresenham 的算法来绘制线条 但它们的厚度 当然 是一个像素 我的问题是绘制任意粗细的线条最有效的方法是什么 我使用的语言是C 再取一个 Bresenham 循环 并用它来修改原始线在矩形方向上的起始和结束位置 问题
  • 如何提高 Java 中收据打印机和 ESC/POS 命令的速度

    我有一个用 Java 与热敏打印机通信的应用程序 使热敏打印机使用 Star tsp 100 打印机打印带有条形码 强调 不同尺寸等的收据 我可以让程序打印出我喜欢的内容 但是打印机速度很慢 我相信原因是我使用了非首选的方式 方法发送字节命
  • 在 ASP.Net MVC 中管理 MongoDB 连接的正确方法是什么?

    管理 MongoServer 类生命周期的最佳实践是什么 我应该创建一个并在每个请求结束时关闭它 还是应该使用 StructureMap 之类的东西在应用程序的整个生命周期中将其保留为单例 任何帮助都是值得赞赏的 In 官方文档 http
  • 如何对行组上的 SSRS 矩阵列求和

    我有一份报告 显示一个人为他们分配到的每个项目工作的总小时数 按月汇总 我想在 SSRS 2008 R2 中计算每个人每个月的总小时数 因此 例如 我有以下数据 并希望像这样列出总计 January February March Worke
  • 为什么在预提交挂钩中执行 git add 后索引没有更新?

    我有一个预提交钩子 检查我的版本文件是否需要更新 修改所述文件 对此文件执行 git add 这允许我将更新的版本文件添加到同一提交中 我遇到的唯一问题是 在钩子运行后 工作树和 HEAD 会使用新版本文件进行更新 但索引不会 我需要手动暂
  • Firebase 推送通知在某些设备上无法正常工作

    对于推送通知 我使用 FCM 我在 VIVO V3 手机中遇到一些问题 相同的代码适用于其他设备 黑莓 华为 三星 适用于以下所有场景我已经测试了 3 个场景 当应用程序位于前台时 当应用程序处于后台时 当应用程序完全杀死时 前 2 个条件
  • ConsoleAppender 实例化不起作用:具有私有访问权限

    我的 ConsoleAppender 类实例化不起作用 import org apache logging log4j core appender ConsoleAppender public class Application priva
  • 如何在 PHP 中将 PDF 版本 1.5 转换为版本 1.4

    如何在 PHP 中将 PDF 版本 1 5 转换为版本 1 4 有人能指出我正确的方向吗 我有类似的需求 发现Ghostscript可以修改PDF版本 文档在这里 http ghostscript com doc current Use h
  • 如何使用setCamera(MediaRecorder)?

    根据Android SDK MediaRecorder setCamera可以用于回收现有的相机实例进行视频捕获和预览 而无需重置预览 我无法找到任何示例 并且我所有的尝试都是徒劳的 我要么得到错误的状态异常 要么 MediaRecorde
  • 从 ASP.NET 应用程序写入 IIS 日志

    我想让我的 ASP NET 应用程序将行写入日志中的某个位置 IIS 是否提供任何内置方式来记录 ASP NET 日志消息 我在想可能有一种方法可以捕获对 System Diagnostics Debug WriteLine 的调用 但我找
  • SQLite 外部查询返回内部查询中找不到的结果

    我只是想知道是否有人遇到过 SQLite 3 7 4 中的情况 其中查询将返回一组结果 而当它成为子查询时 结果完全不同 我在更复杂的查询中发现了问题 但这里有一个更简单的示例 演示了相同的行为 数据库设置 CREATE TABLE tes
  • 如何使用 Paramiko 从 SFTP 服务器仅下载最新文件?

    我想编写连接到我的大学 SFTP 服务器并下载最新文件和练习的脚本 到目前为止 我已经对 Paramiko 示例中的代码进行了一些更改 但我不知道如何下载最新的文件 这是我的代码 import functools import parami
  • Laravel 多态多对多关系数据透视表与另一个模型的关系

    I have the following table structure as shown in the diagram 简而言之 它由几个多对多的多态关系组成 如下所示 many resources可以有很多sources和数据透视表so
  • C11 GCCthreads.h 未找到?

    下面的代码 include
  • JDialog:删除标题栏,保留边框

    是否可以从 JDialog 中删除标题栏 但保留边框 基本 SSCCE 如下所示 package test import javax swing JDialog import javax swing JFrame import javax
  • 通过 createPattern() 使用精灵表

    我似乎找不到任何有关如何执行此操作的可靠信息 所以我想知道是否有人可以为我指出正确的方向 我有一个大的精灵表 我们称之为textures png 每个纹理都是 64x64 像素 我需要能够根据这些纹理创建图案 createPattern 是
  • 找不到类型或命名空间名称“OpenIddictDbContext<,>”

    我有个问题 今天早上我打开我的项目并收到错误 找不到类型或命名空间名称 OpenIddictDbContext 您是否缺少 using 指令或程序集引用 netcoreapp1 1 当我恢复并构建项目时发生此错误 这很奇怪 因为我确实有 O
  • 使用 Python 的 headless-selenium-for-win

    我从这个github项目中找到了一个无头IE无头硒求赢 https github com kybu headless selenium for win releases 其中有以下文件 desktop utils exe headless
  • 使用 GEKKO python 时的负自由度

    我正在尝试解决上述优化问题 我的代码如下 它有效 但我得到了负自由度问题 而且客观价值也是负数 这是我没想到的 我期待着积极的一面 我不明白为什么会发生这种情况 也不知道如何解决这个问题 有人可以给我一个建议吗 Code Import pa