ubuntu下C++使用cplex求解全解

这篇文章主要参考cplex用户手册

求解无权无向图的最小顶点覆盖为例,,用C++语言来演示在ubuntu环境下使用cplex求解最小顶点覆盖的全解

  • 问题描述
    M i n ∑ i = 1 n a i Min\sum_{i=1}^{n}a_i Mini=1nai
    1 ⩽ a i + a j ⩽ 2 1\leqslant a_{i}+a_{j}\leqslant2 1ai+aj2 ( i , j ) (i,j) (i,j) G G G的任意一条边
    0 ⩽ a i ⩽ 1 , ( i = 1 , 2 , . . . n ) 0\leqslant a_{i}\leqslant1,(i=1,2,...n) 0ai1,(i=1,2,...n) a i a_{i} ai是整数
  • 代码实现
#include <bits/stdc++.h>
#include "ilcplex/ilocplex.h"
using namespace std;

int SIZE, EdgeNum, EdgeSIZE;

struct Vertex
{
   int state;
};
Vertex *vertices;
struct Edge
{
   int head, tail;
};
Edge *edges;
void readGraph(char *filename)
{
   freopen(filename, "r", stdin);
   scanf("%d %d", &SIZE, &EdgeNum);
   EdgeSIZE = EdgeNum;
   vertices = (Vertex *)malloc(SIZE * sizeof(Vertex));
   edges = (Edge *)malloc(EdgeNum * sizeof(Vertex));
   for(int i = 0; i < EdgeNum; i ++)
   {
       int head, tail;
       scanf("%d %d", &head, &tail);
       head --;
       tail --;
       edges[i].head = head;
       edges[i].tail = tail;
   }
}
void VertexCoverLP()
{
   IloEnv          env;//定义环境
   IloModel        model(env);//定义模型
   IloIntVar       Ud(env, 0, SIZE);//定义Ud的范围,我这里整形运算
   IloIntVarArray  a(env, SIZE, 0, 1);//定义变量a[1..n],范围[0,1]为整数
   IloRangeArray   constraints(env, EdgeNum, 1, 2);//添加边约束,范围为[1,2]

   model.add(constraints);//添加约束

   IloExpr expr=Ud;//IloExpr 一定要初始化
   for (int i = 0; i < SIZE; i++)
   {
       expr += a[i];
   }
   model.add(IloMinimize(env, expr));//添加最小约束
   for (int i = 0; i < EdgeSIZE; i++)  //添加边约束
   {
       IloExpr expr = a[edges[i].head] + a[edges[i].tail];
       constraints[i].setExpr(expr);
   }
   IloCplex Solver(model);//定义解题器
   Solver.setOut(env.getNullStream());//不输出求解日志
   Solver.setParam(Solver.SolnPoolAGap, 0.0); //设置解法池的绝对间隙
   Solver.setParam(Solver.SolnPoolIntensity, 4); //设置解法池强度参
   Solver.setParam(Solver.PopulateLim, 2100000000);//设置按填充针对解法池生成的解法的最大数量
   Solver.populate();//调用填充

   //输出所有解的信息
   for(int i = 0; i < Solver.getSolnPoolNsolns(); i ++)
   {
       printf("----------------\n");
       printf("sol = %d\n", i + 1);
       Solver.writeSolution("out.sol", i);
       for(int j = 0; j < SIZE; j ++)
       {
           if(Solver.getValue(a[j], i) == 1) //获取第i个解中变量j的值
           {
               cout << j + 1 << "  ";
           }
       }
       cout << endl;
   }
   env.end();
}
int main(int argc, char *argv[])
{
   char *filename;
   filename = argv[1];
   cout << filename << endl;
   readGraph(filename);
   VertexCoverLP();
   return 0;
}
  • 输出结果
//输入数据
3 3
1 2 
2 3
3 1

在这里插入图片描述

  • 注意
    即使对于规模较小的图,其全解的个数个能很大,对全解的求解对于时间和空间的消耗是很大。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Pyomo中使用CPLEX求解器,你需要先安装CPLEX软件,并配置Pyomo以使用CPLEX求解器。下面是安装CPLEX求解器的一般步骤: 1. 下载CPLEX软件:访问IBM的官方网站,下载适用于你的操作系统的CPLEX软件。请确保下载与你的操作系统和Python版本兼容的版本。 2. 安装CPLEX软件:按照官方文档提供的说明,运行安装程序,并按照向导中的步骤完成安装过程。确保选择适用于Python的安装选项。 3. 配置环境变量:在安装完成后,你需要将CPLEX的安装路径添加到系统的环境变量中。具体步骤取决于你使用的操作系统。在Windows上,你可以在“控制面板”中找到“系统”>“高级系统设置”>“环境变量”来进行配置。 4. 安装CPLEX Python API:CPLEX提供了Python API,允许Pyomo与CPLEX求解器进行交互。你可以使用pip命令来安装CPLEX Python API。在终端或命令提示符中运行以下命令: ``` pip install cplex ``` 这将安装CPLEX Python API,并使其可用于Pyomo。 5. 配置Pyomo以使用CPLEX求解器:在Pyomo代码中,你需要指定使用CPLEX求解器。在创建Pyomo求解器对象时,可以指定使用CPLEX求解器。例如: ```python from pyomo.environ import * model = ConcreteModel() # 定义模型和变量 # 创建求解器对象并指定CPLEX求解器 solver = SolverFactory('cplex') # 求解模型 solver.solve(model) ``` 请注意,如果你在安装CPLEX软件时选择了默认安装路径,Pyomo通常能够自动找到CPLEX求解器。 安装和配置CPLEX求解器可能会因操作系统和软件版本而有所不同。建议参考IBM的官方文档和支持资源,以获得关于安装和配置CPLEX求解器的详细说明。 希望这个回答对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值