Cplex求解QCP非线性规划

2023-11-17

import ilog.concert.*;
import ilog.cplex.*;


public class QCPex1 {
   public static void main(String[] args) {
      try {
         IloCplex cplex = new IloCplex();
         IloRange[]  row   = new IloRange[3];
         IloNumVar[] var   = populateByRow(cplex, row);


         if ( cplex.solve() ) {
            double[] x     = cplex.getValues(var);
            double[] slack = cplex.getSlacks(row);

            System.out.println("Solution status = " + cplex.getStatus());
            System.out.println("Solution value  = " + cplex.getObjValue());

            int nvars = x.length;
            for (int j = 0; j < nvars; ++j)
               System.out.println("Variable " + j + ": Value = " + x[j]);

            int ncons = slack.length;
            for (int i = 0; i < ncons; ++i)
               System.out.println("Constraint " + i + ": Slack = " + slack[i]);

            cplex.exportModel("qcpex1.lp");
         }
         cplex.end();
      }
      catch (IloException e) {
         System.err.println("Concert exception '" + e + "' caught");
      }
   }

   static IloNumVar[] populateByRow(IloCplex model,
                                    IloRange row[]) throws IloException {
      double[]    lb = {0.0, 0.0, 0.0};
      double[]    ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE};
      IloNumVar[] x  = model.numVarArray(3, lb, ub);

      // - x0 +   x1 + x2 <= 20
      //   x0 - 3*x1 + x2 <= 30
      double[][] val = { {-1.0,  1.0,  1.0},
                         { 1.0, -3.0,  1.0} };
      row[0] = model.addLe(model.scalProd(val[0], x), 20.0);
      row[1] = model.addLe(model.scalProd(val[1], x), 30.0);

      // x0*x0 + x1*x1 + x2*x2 <= 1.0
      row[2] = model.addLe(model.sum(model.prod(x[0], x[0]),
                                     model.prod(x[1], x[1]),
                                     model.prod(x[2], x[2])), 1.0);

      // Q = 0.5 ( 33*x0*x0 + 22*x1*x1 + 11*x2*x2 - 12*x0*x1 - 23*x1*x2 )
      IloNumExpr x00 = model.prod( 33.0, x[0], x[0]);
      IloNumExpr x11 = model.prod( 22.0, x[1], x[1]);
      IloNumExpr x22 = model.prod( 11.0, x[2], x[2]);
      IloNumExpr x01 = model.prod(-12.0, x[0], x[1]);
      IloNumExpr x12 = model.prod(-23.0, x[1], x[2]);
      IloNumExpr Q   = model.prod(0.5, model.sum(x00, x11, x22, x01, x12));

      // maximize x0 + 2*x1 + 3*x2 + Q
      double[] objvals = {1.0, 2.0, 3.0};
      model.add(model.maximize(model.diff(model.scalProd(x, objvals), Q)));

      return x;
   }
}
Maximize
 obj: x1 + 2 x2 + 3 x3 + [ - 33 x1 ^2 + 12 x1 * x2 - 22 x2 ^2 + 23 x2 * x3
      - 11 x3 ^2 ] / 2
Subject To
 c1: - x1 + x2 + x3 <= 20
 c2: x1 - 3 x2 + x3 <= 30
 q1: [ x1 ^2 + x2 ^2 + x3 ^2 ] <= 1
Bounds
 0 <= x1 <= 40
End

代码来源于IBM官网,本以为Cplex可以求解任何二次模型,结果碰壁了,cplex并非能求解所有类型的二次模型,不过还是可以试试吧。

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

Cplex求解QCP非线性规划 的相关文章

随机推荐

  • linux No module named yum错误的解决办法

    linux No module named yum错误的解决办法 肯定是yum的版本与当前python的版本不一致造成的 所以修改yum的配置 修改文件 vim usr bin yum 修改头 usr bin python gt usr b
  • STM32擦除Flash失败

    stm32 Flash擦除错误 环境 keil5 stm32f4 rtthread3 15 现象 擦除flash总是失败 经过jlink调试发现PGPERR位总是1 经过一番折腾 在st社区找到答案 链接 https community s
  • Button点击事件绑定中如何传递带参数的方法

    btn onClick AddListener delegate this OnBtnClick true 传递一个有参数的方法用于传递参数 这样点击事件就能接收参数了 using UnityEngine using UnityEngine
  • 华为OD机试真题- 计算误码率-2023年OD统一考试(B卷)

    题目描述 误码率是最常用的数据通信传输质量指标 它可以理解为 在多少位数据中出现一位差错 移动通信网络中的误码率主要是指比特误码率 其计算公式如下 比特误码率 错误比特数 传输总比特数 为了简单 我们使用字符串来标识通信的信息 一个字符错误
  • CSS布局之使用Flex布局画骰子(3点)

    若无基础 请优先阅读学习此文档阮一峰 Flex 布局教程 语法篇 上一篇文章CSS布局之使用Flex布局画骰子 2点 这次画3个点的骰子 大家可以先看图片默写代码 然后与文中代码做校验 来验证自己是否理解了Flex布局 骰子样式 div c
  • 笔试

    给定两个字符串s1和s2 如果s1删除若干个字符后变成s2 则称s2为s1的子串 求s2在s1中的起始位置的最大值 输入描述 只有一行 s1 s2 s1和s2用空格隔开 s1和s2度不会含有空格 s1和s2的长度均大于1且小于256 输出描
  • python实战故障诊断之CWRU数据集(三):信号预白化处理-倒谱预白化(CEP pre-whitening)

    文章目录 1 概述 2 倒频谱预白化原理 2 1 倒频谱 2 2 基于倒频谱的预白化处理 3 代码实现 1 概述 在轴承故障中 故障信号通常较为微弱 很可能被设备周期性运转产生的强周期性信号所淹没 导致无法准确识别故障 这时我们需要用到信号
  • PCL .vtk文件与.pcd的相互转换

    目录 一 概述 二 VTK转PCD 三 PCD转VTK 四 实验数据 一 概述 多边形数据集vtkPolyData由顶点 多顶点 线 折线和三角形地带等单元组成 顶点 线和多边形构成了用来表达0 1和2维几何图形的基本要素的最小集合 vtk
  • KubeSphere中集成ApiSix

    KubeSphere中集成ApiSix 一 Apache APISIX 介绍 Apache APISIX 是一款开源的高性能 动态云原生网关 由深圳支流科技有限公司于 2019 年捐赠给 Apache 基金会 当前已经成为 Apache 基
  • java装饰器模式

    一 装饰器模式定义 1 动态地给一个对象添加一些额外的职责 就增加功能来说 装饰模式相比生成子类更为灵活 Component抽象构件 Component是一个接口或者是抽象类 就是定义我们最核心的对象 也就是最原始的对象 定义一个对象接口可
  • Python运行不了,无法运行Python解决办法(超全面)

    前言 Python是一门广泛使用的编程语言 但在使用过程中 我们可能会遇到无法运行Python的问题 本文将提供一个超全面的解决方案 帮助读者排除常见的Python运行问题 并提供相应的解决办法 帮助Python学习 以下所有学习资料文末免
  • tensorflow安装教程(一般使用国内的清华源进行安装)

    注 安装tensorflow numpy这些源 记得用国内的清华镜像源 国外的源由于网络延迟无法安装 1 国内安装tensorflow的命令 pip install index url https pypi douban com simpl
  • 法拉克机器人自动怎么调_发那科机器人的简单设置你知道吗

    发那科机器人使用后台逻辑时 可以在后台执行只包含对应后台逻辑指令的TP程序 程序从 初到 后被反复执行 该执行不受急停 暂停 报警的影响 设定后台逻辑的步骤非常简单 1 按下MENU键 2 选择SETUP 3 选择BG LOGIC 进入如下
  • 洛谷P5731——蛇形方阵(c++)

    题目描述 给出一个不大于 9 的正整数 n 输出 n n 的蛇形方阵 从左上角填上 1 开始 顺时针方向依次填入数字 如同样例所示 注意每个数字有都会占用 3 个字符 前面使用空格补齐 输入格式 输入一个正整数 n 含义如题所述 输出格式
  • Qt 设置窗口的背景图片

    Qt 设置窗口的背景图片 一 给Qt窗口设置背景图片 mainwindow cpp 设置背景图片 path 图片路径 void MainWindow setBackgroundImage QString path QPixmap pixma
  • 零基础学习Vue: 第38课 Vue单页面使用router-link实现页面跳转小案例:

    零基础学习Vue 第38课 Vue单页面使用router link实现页面跳转小案例 实现效果如下 以下是所有代码
  • Ubuntu操作遇到的报错解决方法汇总(持续更新)

    1 在anaconda中创建了虚拟环境并安装了pytorch 但是编译过程中仍然报没有torch的错误 CMake Error at crawler crane crane tutorials CMakeLists txt 23 find
  • Form表单提交数据的几种方式

    1 submit提交 在form标签中添加Action 提交的地址 和method post 且有一个submit按钮
  • conda安装OpenCV

    安装参考 错误方法conda install channel https conda anaconda org menpo opencv3 C Users 15761 gt conda install channel https conda
  • Cplex求解QCP非线性规划

    import ilog concert import ilog cplex public class QCPex1 public static void main String args try IloCplex cplex new Ilo