不懂0和1 2024-04-17 23:10 采纳率: 41.2%
浏览 2
已结题

将Cplex类变量变成ILPMatrix变量得到null

这里为什么得到的LP文件是null呢?不要机器回复能给个真人的回答吗?

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-17 23:10
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试从一个Cplex对象中复制线性规划矩阵(ILPMatrix)并创建一个新的Cplex实例。在Cplex.NET API中,有一些步骤可能被忽略了,导致LP文件为null。让我帮你找出可能的问题并提供一个修复后的版本。

    首先,确保你已经正确地包含了必要的库,并且已经导入了正确的命名空间。例如:

    using System;
    using ILOG.CPLEX;
    using ILOG.Concert;
    

    接下来,我会提供一个修改后的copycplex函数,它应该可以正确地复制Cplex对象及其ILPMatrix。注意,为了使这个函数工作,你需要确保你的ILPMatrix在原始Cplex对象中有定义的行、列标签(Ranges)以及系数。此外,我还添加了一个示例,用于演示如何创建一个简单的Cplex模型并调用copycplex函数。

    public static Cplex CopyCplex(Cplex cplexOriginal)
    {
        // 创建克隆管理器
        CloneManager cm = new SimpleCloneManager(cplexOriginal);
    
        // 创建新的Cplex实例
        Cplex cplexClone = new Cplex();
    
        // 复制目标函数
        IObjective objective = (IObjective)cplexOriginal.GetObjective().MakeClone(cm);
        cplexClone.Add(objective);
    
        // 复制约束
        IEnumerator constraintEnum = cplexOriginal.Constraint.getLPEncodedRangeEnumerator();
        while (constraintEnum.MoveNext())
        {
            IRange range = (IRange)constraintEnum.Current.MakeClone(cm);
            cplexClone.Add(range);
        }
    
        // 复制变量
        IEnumerator variableEnum = cplexOriginal.Variable.getLPEncodedRangeEnumerator();
        while (variableEnum.MoveNext())
        {
            IRange range = (IRange)variableEnum.Current.MakeClone(cm);
            cplexClone.Add(range);
        }
    
        // 如果有线性规划矩阵(ILPMatrix),需要特殊处理
        IEnumerator matrixEnum = cplexOriginal.GetLPMatrixEnumerator();
        while (matrixEnum.MoveNext())
        {
            ILPMatrix lpMatrix = (ILPMatrix)matrixEnum.Current.MakeClone(cm);
            cplexClone.LPMatrix.Use(lpMatrix);
        }
    
        return cplexClone;
    }
    
    // 示例:创建一个简单的Cplex模型并进行复制
    public static void Main(string[] args)
    {
        try
        {
            Cplex cplex = new Cplex();
            cplex.setLogStream(Console.Out);
            cplex.setSolutions(0); // 只求解第一个解
    
            // 添加一个变量
            IGenExpr x = new GenAffineExpr(new double[,] { { 1 } }, new string[] { "x" });
            cplex.variables.add(x, 0, null, null, 0, null, null);
    
            // 添加一个约束
            IGenExpr constraint = new GenAffineExpr(new double[,] { { 1 } }, new string[] { "x" }) <= 10;
            cplex.linear_constraints.add(GRBLT, constraint, "Constraint");
    
            // 设置目标函数
            IGenExpr objective = new GenAffineExpr(new double[,] { { 1 } }, new string[] { "x" });
            cplex.objective.setLinear(objective);
    
            // 求解
            cplex.solve();
    
            Console.WriteLine("Original problem solved.");
            Console.WriteLine($"Objective value: {cplex.getObjValue()}");
    
            // 复制Cplex对象
            Cplex cplexCopy = CopyCplex(cplex);
    
            // 写入LP文件
            cplexCopy.write("copied.lp");
            Console.WriteLine("Copied problem written to copied.lp");
        }
        catch (IloException e)
        {
            Console.Error.WriteLine(e.Message);
        }
    }
    

    这段代码首先创建了一个简单的Cplex模型,然后使用CopyCplex函数进行复制,并将复制后的模型写入到名为"copied.lp"的LP文件中。如果你运行这段代码,你应该能在当前目录下看到"copied.lp"文件,这意味着复制过程成功并且LP文件不是null。如果还有问题,请检查你的输入Cplex对象是否正确设置了ILPMatrix以及其他元素。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月18日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 labelme生成的json有乱码?
  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)