我刚刚开始使用Gekko优化软件。到目前为止,我找到了如何获得问题的最优解。但我不确定是否有可能看到满足约束的所有可能结果?(不仅是最佳值)。问题是,对于我的特定任务,我需要多次进行优化,尽管最优值在某一点上是最优的,但最优决策序列可能会随着时间的推移而不同。我想通过创建MDP来检查这一点。但要做到这一点,我需要知道可能的状态,这些状态表示要优化的变量的所有可能值,它们满足约束。我还没有发现如何在盖柯做到这一点,所以可能有人有类似的问题?
非常感谢。
等高线图是显示最优解和所有可能可行解的好方法。下面是管柱设计优化问题的等高线图示例。
# -*- coding: utf-8 -*-
"""
BYU Intro to Optimization. Column design
https://apmonitor.com/me575/index.php/Main/TubularColumn
Contour plot additions by Al Duke 11/30/2019
"""
from gekko import GEKKO
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve
m = GEKKO()
#%% Constants
pi = m.Const(3.14159,'pi')
P = 2300 # compressive load (kg_f)
o_y = 450 # allowable yield stress (kg_f/cm^2)
E = 0.65e6 # elasticity (kg_f/cm^2)
p = 0.0020 # weight density (kg_f/cm^3)
l = 300 # length of the column (cm)
#%% Variables (the design variables available to the solver)
d = m.Var(value=8.0,lb=2.0,ub=14.0) # mean diameter (cm)
t = m.Var(value=0.3,lb=0.2 ,ub=0.8) # thickness (cm)
cost = m.Var()
#%% Intermediates (computed by solver from design variables and constants)
d_i = m.Intermediate(d - t)
d_o = m.Intermediate(d + t)
W = m.Intermediate(p*l*pi*(d_o**2 - d_i**2)/4) # weight (kgf)
o_i = m.Intermediate(P/(pi*d*t)) # induced stress
# second moment of area of the cross section of the column
I = m.Intermediate((pi/64)*(d_o**4 - d_i**4))
# buckling stress (Euler buckling load/cross-sectional area)
o_b = m.Intermediate((pi**2*E*I/l**2)*(1/(pi*d*t)))
#%% Equations (constraints, etc. Cost could be an intermediate variable)
m.Equations([
o_i - o_y <= 0,
o_i - o_b <= 0,
cost == 5*W + 2*d
])
#%% Objective
m.Minimize(cost)
#%% Solve and print solution
m.options.SOLVER = 1
m.solve()
print('Optimal cost: ' + str(cost[0]))
print('Optimal mean diameter: ' + str(d[0]))
print('Optimal thickness: ' + str(t[0]))
minima = np.array([d[0], t[0]])
#%% Contour plot
# create a cost function as a function of the design variables d and t
f = lambda d, t: 2 * d + 5 * p * l * np.pi * ((d+t)**2 - (d-t)**2)/4
xmin, xmax, xstep = 2, 14, .2 # diameter
ymin, ymax, ystep = .2, .8, .05 # thickness
d, t = np.meshgrid(np.arange(xmin, xmax + xstep, xstep), \
np.arange(ymin, ymax + ystep, ystep))
z = f(d, t)
# Determine the compressive stress constraint line.
#stress = P/(pi*d*t) # induced axial stress
t_stress = np.arange(ymin, ymax, .025) # use finer step to get smoother constraint line
d_stress = []
for tt in t_stress:
dd = P/(np.pi * tt * o_y)
d_stress.append(dd)
# Determine buckling constraint line. This is tougher because we cannot
# solve directly for t from d. Used scipy.optimize.fsolve to find roots
d_buck = []
t_buck = []
for d3 in np.arange(6, xmax, .005):
fb = lambda t : o_y-np.pi**2*E*((d3+t)**4-(d3-t)**4)/(64*l**2*d3*t)
tr = np.array([0.3])
roots = fsolve(fb, tr)
if roots[0] != 0:
if roots[0] >= .1 and roots[0]<=1.:
t_buck.append(roots[0])
d_buck.append(d3)
# Create contour plot
plt.style.use('ggplot') # to make prettier plots
fig, ax = plt.subplots(figsize=(10, 6))
CS = ax.contour(d, t, z, levels=15,)
ax.clabel(CS, inline=1, fontsize=10)
ax.set_xlabel('mean diameter $d$')
ax.set_ylabel('half thickness $t$')
ax.set_xlim((xmin, xmax))
ax.set_ylim((ymin, ymax))
# Add constraint lines and optimal marker
ax.plot(d_stress, t_stress, "->", label="Stress constraint")
ax.plot(d_buck, t_buck, "->", label="Buckling constraint" )
minima_ = minima.reshape(-1, 1)
ax.plot(*minima_, 'r*', markersize=18, label="Optimum")
ax.text(10,.25,"Contours = Cost (objective)\nConstraint line markers point\ntowards feasible space.")
plt.title('Column Design')
plt.legend()
plt.show()
更具挑战性的是,包括超过2D的内容,但时间或3D绘图可以在参数改变时显示可行空间,例如在内点解演示中。
在设计优化课程中还有许多其他示例问题演示了这种方法。
我正在Eclipse Neon中使用Hibernate工具(JBoss tools 4.4.0.Final)。现在,我想将数据库表反向工程为POJO对象和Hibernate映射文件。 我遵循了一些关于如何设置Eclipse来生成POJO对象的教程。在我运行配置之前,一切看起来都很好。什么都没发生,也没有抛出错误。有人能帮我吗?数据库是一个微软SQL服务器2014。 我的逆向工程配置文件看起来像:
龙虎牛熊多头合约池 接口名称 long_pool 接口描述 龙虎牛熊多头合约池接口 请求参数 参数名 说明 举例 date 查询日期 2018-08-08 返回参数 参数名 类型 说明 symbol string 品种编码 code string 合约代号 示例代码 from akshare import pro_api pro = pro_api(token="在此处输入您的token,可以通过
工具 客户端 客户端分为三种:完整客户端、轻量级客户端和在线客户端。 完整客户端:存储所有的交易历史记录,功能完备; 轻量级客户端:不保存交易副本,交易需要向别人查询; 在线客户端:通过网页模式来浏览第三方服务器提供的服务。 钱包 矿机 专门为“挖矿”设计的硬件,包括基于 GPU 和 ASIC 的芯片。 脚本 比特币交易支持一种比较简单的脚本语言(类 Forth 的栈脚本语言),可以写入 UTXO
工具 以下的一些工具可以帮助你自动检查项目中的 Ruby 代码是否符合这份指南。 RuboCop [RuboCop][] 是一个基于本指南的 Ruby 代码风格检查工具。RuboCop 涵盖了本指南相当大的部分,其同时支持 MRI 1.9 和 MRI 2.0,且与 Emacs 整合良好。 RubyMine RubyMine 的代码检查部分基于本指南。
10.7. 工具 本章剩下的部分将讨论Go语言工具箱的具体功能,包括如何下载、格式化、构建、测试和安装Go语言编写的程序。 Go语言的工具箱集合了一系列的功能的命令集。它可以看作是一个包管理器(类似于Linux中的apt和rpm工具),用于包的查询、计算包的依赖关系、从远程版本控制系统下载它们等任务。它也是一个构建系统,计算文件的依赖关系,然后调用编译器、汇编器和链接器构建程序,虽然它故意被设计成
vse命令行工具 yocode扩展生成器 范例
提供各种支付需要的配置生成方法。 配置 <?php use EasyWeChat\Pay\Application; $config = [...]; $app = new Application($config); $utils = $app->getUtils(); 注意 生成支付 JS 配置 有四种发起支付的方式:WeixinJSBridge, JSSDK, 小程序支付, APP We
CoreOS 内置了 服务发现,容器管理 工具。 服务发现 CoreOS 的第一个重要组件就是使用 etcd 来实现的服务发现。在 CoreOS 中 etcd 默认以 rkt 容器方式运行。 etcd 使用方法请查看 etcd 章节。 容器管理 第二个组件就是 Docker,它用来运行你的代码和应用。CoreOS 内置 Docker,具体使用请参考本书其他章节。