混合整数规划的机组组合附Matlab代码

news2024/11/16 1:55:14

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测 雷达通信  无线传感器

信号处理 图像处理 路径规划 元胞自动机 无人机  电力系统

⛄ 内容介绍

机组组合问题要求基于已知的系统数据,求解计划时间内机组决策变量的最优组合,使得系统总成本达到最小。该问题的决策变量由两类,一类是各时段机组的启停状态,为整数变量,0表示关停,1表示启动;另一类是各时段机组的出力,为连续变量。

机组组合问题属于规划问题,即要在决策变量的可行解空间里找到一组最优解,使得目标函数尽可能取得极值。对于混合整数规划,常用的方法有分支定界法,benders分解等。CPLEX提供了快速的MIP求解方法,对于数学模型已知的问题,只需要按照程序规范在MATLAB中编写程序化模型,调用CPLEX求解器,即可进行求解。

下文介绍机组组合优化的数学模型。

校验程序的算例基于IEEE-30节点标准测试系统,系统接线图如图1。系统包含30个节点,6台发电机组。要求确定系统最优机组组合,使得系统各机组总运行成本(煤耗成本+启停成本)最小化。

图1. IEEE-30节点测试系统接线

已知:给定系统数据包括如下:(见附件testsystem.xls)

1)线路网络参数

2)机组参数

3)各节点各时段负荷曲线(24小时)

注意:附件中的数据均基于标幺化系统得到,因此电力电量参数、网络参数等都为标幺值,无量纲。还要注意附件中煤耗系数a,b,c的单位为吨,因此计算煤耗成本还需换算为价格,设燃煤价格为100$/吨

求解:机组组合结果,即机组各时段启停计划、机组各时段最优出力,以及内含的各时段的直流潮流等。

⛄ 部分代码

function diagnostic = solvesdp(varargin)

%SOLVESDP Computes solution to optimization problem

%

%   DIAGNOSTIC = SOLVESDP(F,h,options) is the common command to

%   solve optimization problems of the following kind

%

%    min        h

%    subject to

%            F >=(<=,==) 0

%

%   NOTES

%    Despite the name, SOLVESDP is the interface for solving all

%    supported problem classes (LP, QP, SOCP, SDP, BMI, MILP, MIQP,...)

%

%    To obtain solution for a variable, use DOUBLE.

%

%    To obtain dual variable for a constraint, use DUAL.

%

%    See YALMIPERROR for error codes returned in output.

%

%   OUTPUT

%     diagnostic : Diagnostic information

%

%   INPUT

%     F          : Object describing the constraints. Can be [].

%     h          : SDPVAR object describing the objective h(x). Can be [].

%     options    : Options structure. See SDPSETTINGS. Can be [].

%

%   EXAMPLE

%    A = randn(15,5);b = rand(15,1)*5;c = randn(5,1);

%    x = sdpvar(5,1);

%    solvesdp([x>=0, A*x<=b],c'*x);double(x)

%

%   See also DUAL, @SDPVAR/DOUBLE, SDPSETTINGS, YALMIPERROR

yalmiptime = clock; % Let us see how much time we spend

% Avoid warning

if length(varargin)>=2

    if isa(varargin{2},'double')

        varargin{2} = [];

    end

end

if length(varargin)>=2

    if isa(varargin{2},'sdpvar') && prod(size(varargin{2}))>1

        % Several objectives

        diagnostic = solvesdp_multiple(varargin{:});

        return

    end

end

% *********************************

% CHECK INPUT

% *********************************

nargin = length(varargin);

if nargin<1

    help solvesdp

    return

else

    F = varargin{1};

    if isa(F,'constraint')

        F = lmi(F);

    end

    if isa(F,'lmi')

        F = flatten(F);

    end

    

    if isa(F,'sdpvar')

        % We do allow sloppy coding of logic constraints, i.e writing a

        % constraints as [a|b true(a)]

        Fnew = [];

        for i = 1:length(F)

            if length(getvariables(F(i)))>1

                Fnew = nan;

                break

            end

            operator = yalmip('extstruct',getvariables(F(i)));

            if isempty(operator)

                Fnew = nan;

                break

            end

            if length(operator)>1

                Fnew = nan;

                break

            end

            if ~strcmp(operator.fcn,'or')

                Fnew = nan;

                break

            end

            Fnew = Fnew + (true(F(i)));

        end

        if isnan(Fnew)

            error('First argument (F) should be a constraint object.');

        else

            F = Fnew;

        end

    elseif isempty(F)

        F = lmi([]);

    elseif ~isa(F,'lmi')

        error('First argument (F) should be a constraint object.');      

    end

end

if nargin>=2

    h = varargin{2};

    if isa(h,'double')

        h = [];

    end

    if ~(isempty(h) | isa(h,'sdpvar') | isa(h,'logdet') |  isa(h,'ncvar'))

        error('Second argument (the objective function h) should be an sdpvar or logdet object (or empty).');

    end

    if isa(h,'logdet')

        logdetStruct.P     = getP(h);

        logdetStruct.gain  = getgain(h);

        h = getcx(h);

        if isempty(F)

            F = ([]);

        end

    else

        logdetStruct = [];

    end

else

    logdetStruct = [];

    h = [];   

end

if ~isempty(F)

    if any(is(F,'sos'))        

        diagnostic = solvesos(varargin{:});

        return

    end

end

if isa(h,'sdpvar')

    if is(h,'complex')

        error('Complex valued objective does not make sense.');

    end

end

    

if nargin>=3

    options = varargin{3};

    if ~(isempty(options) | isa(options,'struct'))

        error('Third argument (options) should be an sdpsettings struct (or empty).');

    end

    if isempty(options)

        options = sdpsettings;

    end

else

    options = sdpsettings;

end

options.solver = lower(options.solver);

% If user has logdet term, but no preference on solver, we try to hook up

% with SDPT3 if possible.

if ~isempty(logdetStruct)

    if strcmp(options.solver,'')

     %   options.solver = 'sdpt3,*';

    end

end

% Call chance solver?

if length(F) > 0

    rand_declarations = is(F,'random');

    if any(rand_declarations)

    %    diagnostic = solverandom(F(find(~rand_declarations)),h,options,recover(getvariables(sdpvar(F(find(unc_declarations))))));

        return

    end

end

% Call robust solver?

if length(F) > 0

    unc_declarations = is(F,'uncertain');

    if any(unc_declarations)

        diagnostic = solverobust(F(find(~unc_declarations)),h,options,recover(getvariables(sdpvar(F(find(unc_declarations))))));

        return

    end

end

    

if isequal(options.solver,'mpt') | nargin>=4

    solving_parametric = 1;

else

    solving_parametric = 0;

end

    

% Just for safety

if isempty(F) & isempty(logdetStruct)

    F = lmi;

end

if any(is(F,'sos'))

    error('You have SOS constraints. Perhaps you meant to call SOLVESOS.');

end

% Super stupido

if length(F) == 0 & isempty(h) & isempty(logdetStruct)

   diagnostic.yalmiptime = 0;

   diagnostic.solvertime = 0;

   diagnostic.info = 'No problems detected (YALMIP)';

   diagnostic.problem = 0;

   diagnostic.dimacs = [NaN NaN NaN NaN NaN NaN];

   return

end

% Dualize the problem?

if ~isempty(F)

    if options.dualize == -1

        sdp = find(is(F,'sdp'));

        if ~isempty(sdp)

            if all(is(F(sdp),'sdpcone'))

                options.dualize = 1;

            end

        end

    end

end

if options.dualize == 1   

    [Fd,objd,aux1,aux2,aux3,complexInfo] = dualize(F,h,[],[],[],options);

    options.dualize = 0;

    diagnostic = solvesdp(Fd,-objd,options);

    if ~isempty(complexInfo)

        for i = 1:length(complexInfo.replaced)

            n = size(complexInfo.replaced{i},1);

            re = 2*double(complexInfo.new{i}(1:n,1:n));            

            im = 2*double(complexInfo.new{i}(1:n,n+1:end));

            im=triu((im-im')/2)-(triu((im-im')/2))';

            assign(complexInfo.replaced{i},re + sqrt(-1)*im);

        end

    end

    return

end

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

% DID WE SELECT THE MOMENT SOLVER

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if isequal(options.solver,'moment')

    if ~isempty(logdetStruct)

        error('Cannot dualize problems with logaritmic objective')

    end

    options.solver = options.moment.solver;

    [diagnostic,x,momentdata] = solvemoment(F,h,options,options.moment.order);

    diagnostic.momentdata = momentdata;

    diagnostic.xoptimal = x;

    return

end

% ******************************************

% COMPILE IN GENERALIZED YALMIP FORMAT

% ******************************************

[interfacedata,recoverdata,solver,diagnostic,F,Fremoved,ForiginalQuadratics] = compileinterfacedata(F,[],logdetStruct,h,options,0,solving_parametric);

% ******************************************

% FAILURE?

% ******************************************

if ~isempty(diagnostic)

    diagnostic.yalmiptime = etime(clock,yalmiptime);

    return

end

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

% DID WE SELECT THE LMILAB SOLVER WITH A KYP

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if  strcmpi(solver.tag,'lmilab') & any(is(F,'kyp'))

    [diagnostic,failed] = calllmilabstructure(F,h,options);

    if ~failed % Did this problem pass (otherwise solve using unstructured call)

        diagnostic.yalmiptime = etime(clock,yalmiptime)-diagnostic.solvertime;

        return

    end

end

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

% DID WE SELECT THE KYPD SOLVER

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if strcmpi(solver.tag,'kypd')

    diagnostic = callkypd(F,h,options);

    diagnostic.yalmiptime = etime(clock,yalmiptime)-diagnostic.solvertime;

    return

end

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

% DID WE SELECT THE STRUL SOLVER

% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

if strfind(solver.tag,'STRUL')

    diagnostic = callstrul(F,h,options);

    diagnostic.yalmiptime = etime(clock,yalmiptime)-diagnostic.solvertime;

    return

end

% ******************************************

% DID WE SELECT THE BMILIN SOLVER (obsolete)

% ******************************************

if strcmpi(solver.tag,'bmilin')

    diagnostic = callbmilin(F,h,options);

    return

end

% ******************************************

% DID WE SELECT THE BMIALT SOLVER (obsolete)

% ******************************************

if strcmp(solver.tag,'bmialt')

    diagnostic = callbmialt(F,h,options);

    return

end

%******************************************

% DID WE SELECT THE MPT solver (backwards comb)

%******************************************

actually_save_output = interfacedata.options.savesolveroutput;

if strcmpi(solver.tag,'mpt-2') | strcmpi(solver.tag,'mpt-3') | strcmpi(solver.tag,'mpcvx') | strcmpi(solver.tag,'mplcp')    

    interfacedata.options.savesolveroutput = 1;

    if isempty(interfacedata.parametric_variables)

        if (nargin < 4 | ~isa(varargin{4},'sdpvar'))

            error('You must specify parametric variables.')

        else

            interfacedata.parametric_variables = [];

            for i = 1:length(varargin{4})

                  interfacedata.parametric_variables = [interfacedata.parametric_variables;find(ismember(recoverdata.used_variables,getvariables(varargin{4}(i))))];

            end            

            if isempty(varargin{5})

                interfacedata.requested_variables = [];

            else

                interfacedata.requested_variables = [];

                for i = 1:length(varargin{5})

                    interfacedata.requested_variables = [interfacedata.requested_variables;find(ismember(recoverdata.used_variables,getvariables(varargin{5}(i))))];

                end

            end

        end

    end

end

% *************************************************************************

% Just return the YALMIP model. Used when solving multiple objectives

% *************************************************************************

if isfield(options,'pureexport')

    interfacedata.recoverdata = recoverdata;

    diagnostic = interfacedata;        

    return

end

% *************************************************************************

% TRY TO SOLVE PROBLEM

% *************************************************************************

if options.debug

    eval(['output = ' solver.call '(interfacedata);']);

else

    try

        eval(['output = ' solver.call '(interfacedata);']);

    catch

        output.Primal = zeros(length(interfacedata.c),1)+NaN;

        output.Dual  = [];

        output.Slack = [];

        output.solvertime   = nan;

        output.solverinput  = [];

        output.solveroutput = [];

        output.problem = 9;

        output.infostr = yalmiperror(output.problem,lasterr);

    end

end

if options.dimacs

    try       

        b = -interfacedata.c;

        c = interfacedata.F_struc(:,1);

        A = -interfacedata.F_struc(:,2:end)';

        x = output.Dual;

        y = output.Primal;

        % FIX this nonlinear crap (return variable type in

        % compileinterfacedata)

        if options.relax == 0 & any(full(sum(interfacedata.monomtable,2)~=0))

            if ~isempty(find(sum(interfacedata.monomtable | interfacedata.monomtable,2)>1))                

                z=real(exp(interfacedata.monomtable*log(y+eps)));                

                y = z;

            end

        end

        

        if isfield(output,'Slack')

            s = output.Slack;

        else

            s = [];

        end

                    

        dimacs = computedimacs(b,c,A,x,y,s,interfacedata.K);

    catch

        dimacs = [nan nan nan nan nan nan];

    end

else

    dimacs = [nan nan nan nan nan nan];

end

% ********************************

% ORIGINAL COORDINATES

% ********************************

output.Primal = recoverdata.x_equ+recoverdata.H*output.Primal;

% ********************************

% OUTPUT

% ********************************

diagnostic.yalmiptime = etime(clock,yalmiptime)-output.solvertime;

diagnostic.solvertime = output.solvertime;

try

    diagnostic.info = output.infostr;

catch   

    diagnostic.info = yalmiperror(output.problem,solver.tag);

end

diagnostic.problem = output.problem;

if options.dimacs

    diagnostic.dimacs = dimacs;

end

% Some more info is saved internally

solution_internal = diagnostic;

solution_internal.variables = recoverdata.used_variables(:);

solution_internal.optvar = output.Primal;

if ~isempty(interfacedata.parametric_variables)

    diagnostic.mpsol = output.solveroutput;

    options.savesolveroutput = actually_save_output;

end;

if interfacedata.options.savesolveroutput

    diagnostic.solveroutput = output.solveroutput;

end

if interfacedata.options.savesolverinput

    diagnostic.solverinput = output.solverinput;

end

if interfacedata.options.saveyalmipmodel

    diagnostic.yalmipmodel = interfacedata;

end

if options.warning & warningon & isempty(findstr(diagnostic.info,'No problems detected'))

    disp(['Warning: ' output.infostr]);

end

if ismember(output.problem,options.beeponproblem)

    try

        beep; % does not exist on all ML versions

    catch

    end

end

% And we are done! Save the result

if ~isempty(output.Primal)

    if size(output.Primal,2)>1

        for j = 1:size(output.Primal,2)

            temp = solution_internal;

            temp.optvar = temp.optvar(:,j);

            yalmip('setsolution',temp,j);

        end

    else

        yalmip('setsolution',solution_internal);

    end

end

if interfacedata.options.saveduals & solver.dual

    if isempty(interfacedata.Fremoved) | (nnz(interfacedata.Q)>0)

        try

            setduals(F,output.Dual,interfacedata.K);

        catch

        end

    else

        try

            % Duals related to equality constraints/free variables

            % have to be recovered b-A*x-Ht == 0

            b = -interfacedata.oldc;          

            A = -interfacedata.oldF_struc(1+interfacedata.oldK.f:end,2:end)';

            H = -interfacedata.oldF_struc(1:interfacedata.oldK.f,2:end)';

            x = output.Dual;

            b_equ = b-A*x;

            newdual =  H\b_equ;

            setduals(interfacedata.Fremoved + F,[newdual;output.Dual],interfacedata.oldK);

        catch

             % this is a new feature...

            disp('Dual recovery failed. Please report this issue.');

        end

    end

end

% Hack to recover original QCQP duals from gurobi

if strcmp(solver.tag,'GUROBI-GUROBI')

    if length(ForiginalQuadratics) > 0

        if isfield(output,'qcDual')

            if length(output.qcDual) == length(ForiginalQuadratics)

                Ktemp.l = length(output.qcDual);

                Ktemp.f = 0;

                Ktemp.q = 0;

                Ktemp.s = 0;

                Ktemp.r = 0;

                setduals(ForiginalQuadratics,-output.qcDual,Ktemp);

            end

        end

    end

end

function yesno = warningon

s = warning;

yesno = isequal(s,'on');

⛄ 运行结果

⛄ 参考文献

[1]程杉王贤宁冯毅煁王睿娟. 基于CPLEX与MATLAB的电动汽车充电站优化调度仿真系统[J]. 电网与清洁能源, 2018, 034(001):123-127,136.

❤️ 关注我领取海量matlab电子书和数学建模资料

❤️部分理论引用网络文献,若有侵权联系博主删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis常见面试题(2022)

Redis基础 什么是 Redis&#xff1f; Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xf…

多分类交叉熵理解

多分类交叉熵有多种不同的表示形式&#xff0c;如下图所示&#xff1a; 但是&#xff0c;有时候我们读论文会深陷其中不能自拔。 也有很多读者、观众会纠正其他作者的文章、视频的交叉熵形式。 实际上&#xff0c;上述三种形式都是没有问题的。 这里&#xff0c;我们就要了解…

多媒体内容理解在美图社区的应用实践

导读&#xff1a;移动互联网时代&#xff0c;图像和短视频等多媒体内容爆发&#xff0c;基于计算机视觉的AI算法是多媒体内容分析的基础。在美图社区智能化发展的过程中&#xff0c;视频和图像分类打标、去重以及质量评估的结果&#xff0c;在推荐、搜索以及人工审核等多个场景…

【R语言数据科学】:变量选择(三)主成分回归和偏最小二乘回归

变量选择(三)主成分回归和偏最小二乘回归 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编…

多分类问题的precision和recall以及F1 scores的计算

对于多分类问题&#xff0c;首先&#xff0c;对于每一个类的精准率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;&#xff0c;定义和二分类问题一致&#xff0c;但是计算上不再需要TP,FP,FN等量了&#xff1a;&#xff09; 比如对A, B, C三类有如…

SpringBoot中如何集成ThymeLeaf呢?

转自: SpringBoot中如何集成ThymeLeaf呢&#xff1f; 下文笔者将讲述SpringBoot集成ThymeLeaf的方法&#xff0c;如下所示: 实现思路:1.在pom.xml中引入ThymeLeaf的相关依赖2.在Templates文件夹下编写相应的模板文件例: 1.pom.xml 添加ThymeLeaf依赖<!-- ThymeLeaf 依赖…

河南某商务楼BA系统设计

目 录 第一章 概述 3 第二章 设计任务与要求 4 第三章 设计依据和规范 4 第四章 系统设计 5 4.1系统选型 5 4.2 I/O点位设计 7 4.2.1暖通空调系统 11 4.2.2给排水系统 13 4.2.3电气系统 15 4.3线缆选型设计 17 4.4供电接地设计 17 4.5中央控制室设计 18 第五章 设备清单配置 18…

ASEMI代理力特LSIC1MO120E0080碳化硅MOSFET

编辑-Z 力特碳化硅MOS管LSIC1MO120E0080参数&#xff1a; 型号&#xff1a;LSIC1MO120E0080 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;1200V 连续漏电流&#xff08;ID&#xff09;&#xff1a;25A 功耗&#xff08;PD&#xff09;&#xff1a;214W 工作结温…

mysql数据库日志

1、日志类型 mysql日志在mysql事务章有事务日志相关的记录。初次之外&#xff0c;MySQL有不同类型的日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分为二进制日志 、 错误日志 通用查询日志和 查询日志 &#xff0c;这也是常用的4种。MySQL 8又新增两种支持的日志&…

关于HTTPDNS,你知道多少?

导读&#xff1a; 全网域名劫持率高&#xff0c;域名解析失败、解析超时&#xff0c;IP调度不精准&#xff0c;域名解析变更生效不实时&#xff0c;这些问题是否一直困扰着你&#xff1f;作为网络请求最前置的环节&#xff0c;域名解析的稳定与精准程度直接决定了APP的访问体验…

实战讲解SpringCloud网关接口限流SpringCloudGateway+Redis(图+文)

1 缘起 最近补充微服务网关相关知识&#xff0c;学习了网关相关概念&#xff0c; 了解网关在微服务中存在的意义及其使命&#xff0c;如统一用户认证、接口权限控制、接口限流、接口熔断、黑白名单机制等&#xff0c; 打算通过实践的方式逐步学习网关的相关功能&#xff0c;同…

从零到一落地接口自动化测试

前段时间写了一系列自动化测试的文章&#xff0c;更多是从方法和解决问题思路角度阐述我的观点。 昨天花了几个小时看完了陈磊老师的《接口测试入门课》&#xff0c;有一些新的收获&#xff0c;结合我自己实践自动化测试的一些经验以及个人理解&#xff0c;这篇文章来聊聊新手…

主要控制系统之间的逻辑关系

电力行业 工控安全解决思路保障框架从电力行业对工控安全需求看&#xff0c;电力企业在主要是以合规性建设为主&#xff0c;在 2004 年原电监会 5 号令颁布开始&#xff0c;大部 分的电厂控制系统安全 建设已经按照 5 号令的要求进行了整改&#xff0c;形成“安全分区、网络专…

【2022硬件设计开源盛宴】一年一度的hackaday大赛结束,冠军便携式风力涡轮机,共提交326个电子作品,奖金池15万美元

https://hackaday.com/2022/11/05/ ... -years-competition/ &#xff08;1&#xff09;一年一度的Hackaday大赛结束&#xff0c;今年是第9届了&#xff0c;总奖金池是15万美元&#xff0c;冠军5万美元。前6届&#xff0c;冠军奖金非常高&#xff0c;像第3届冠军是最厉害的&am…

java设计模式之装饰者模式

一&#xff1a;装饰者模式 1.什么是装饰者模式? 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 装饰者模式的基本介绍 1.装饰者模式&#xff1a;动态的将新功能附加到对象上。在对象功能扩展方面&#xf…

Jasper 中如何将数据拆成多行并跨行累计

【问题】 I have a query that returns some summary records. For instance, loan amount, loan term, interest rate. Then I want to have a second row that builds out the detailed payment schedule. so the report would look like this: Loan Amt Term …

SpringBoot2

文章目录1.简介1.1 SpringBoot优缺点1.2 官方文档结构2. SpringBoot入门2.1 HelloWord2.2 依赖管理2.3 自动配置2.4 容器功能组件添加原生配置文件引入2.5 配置绑定ConfigurationPropertiesEnableConfigurationProperties2.6 自动配置原理底层总结最佳实践2.7 开发小技巧Lombok…

UML类图简单认识

类 类图包括类、接口和关系。类中包含三元素&#xff0c;第一行是类名&#xff0c;如果是虚类则为斜体。第二行包括属性&#xff0c;如果是public则为&#xff0c;如果是private则为-&#xff0c;如果是protected则为#。第三行包括方法&#xff0c;方法前面的符号表示与属性的…

QSS的应用

盒子模型&#xff1a; margin 边距border 边框padding 内边距content 内容常用的一些属性&#xff1a; background背景background-color背景颜色background-image背景图片background-position对齐方式border-&#xff08;top、left、bottom、right&#xff09;边界border-…

单调栈问题---(每日温度,下一个更大元素Ⅰ)

代码随想录day 58 单调栈问题— 每日温度,下一个更大元素Ⅰ 文章目录1.leetcode 739. 每日温度1.1 详细思路及解题步骤1.2Java版代码示例2.leetcode 496. 下一个更大元素 I2.1 详细思路及解题步骤2.2Java版代码示例1.leetcode 739. 每日温度 1.1 详细思路及解题步骤 这题会用到…