python3實現線性規劃求解

Background

  • 對于數學規劃問題,有很多的實現。Matlab+YALMIP+CPLEX這個組合應該是比較主流的,尤其是在電力相關系統中占據著比較重要的地位。
  • MATLAB是一個強大的數值計算工具,用于數學建模、算法開發和數據分析。
  • Yalmip是一個MATLAB工具箱,用于建模和解決凸優化問題。它提供了一個簡單的語法,使用戶能夠輕松地定義優化問題,并使用各種內置求解器求解這些問題。
  • Cplex是一個商業優化求解器,由IBM公司開發。它可以用于解決各種優化問題,包括線性規劃、混合整數線性規劃和二次規劃等。在MATLAB中,用戶可以使用Yalmip接口輕松地與Cplex集成。
  • 目前 cplex 對 python 的支持目前還不是太全,相關的學習資料比較少,ibm 自己出的資料對 python 包的介紹也很簡略,例子及相關類方法的介紹也不詳細,這一點遠沒有對 java 或 c++ 支持地好。
  • 關于一些求解簡單線性規劃問題,python中也有一些庫可以實現:
  • z3-solver是由Microsoft Research(微軟)開發的SMT求解器,它用于檢查邏輯表達式的可滿足性,可以找到一組約束中的其中一個可行解,缺點是無法找出所有的可行解(對于規劃求解問題可以是scipy)。z3-solver可應用于軟/硬件的驗證與測試、約束求解、混合系統的分析、安全、生物,以及幾何求解等問題。Z3 主要由 C++ 開發,提供了 .NET、C、C++、Java、Python 等語言調用接口。
  • scipy庫中的函數scipy.optimize.linprog也可以進行線性規劃求解,但不支持整數約束,只能求解出實數。
  • pulp庫是一個專門進行規劃求解的庫。pulp庫也不是萬能的,雖然可以解決線性規劃問題,但不能進行非線性的規劃求解。當然對于規劃求解,95%以上的場景都是線性規劃求解,pulp就足夠應對我們需要應對的場景。pulp庫它將優化問題描述為數學模型,生成MPS或者LP文件,然后調用LP求解器,如CBC、GLPK、CPLEX、Gurobi等來進行求解。
  • 安裝完pulp庫默認就擁有了CBC求解器,其他求解器需要額外安裝才能使用,這里我沒有測試這個。
  • cvxpy庫是一個用于凸優化的Python庫,它提供了一個簡潔的、符合數學約束的方式來定義和求解各種凸優化問題。cvxpy的目標是提供一個易于使用的界面,使用戶能夠以簡潔的方式表達凸優化問題,并通過優化求解器快速求解。內建的凸優化問題集類:cvxpy包含了一系列常見的凸優化問題模型,如線性規劃、二次規劃、半正定規劃等。支持多種求解器:cvxpy可以與多個優化求解器集成,包括open-source的solver(如SCS、ECOS等)以及商業求解器(如Gurobi、CPLEX等)。

1、單個決策變量-scipy

  • 線性規劃案例
    在這里插入圖片描述

1.1、matlab+yalmip+cplex實現

%% yalmip+cplex
%(1)設定決策變量X(1)、X(2)
%(2)sdpvar:實數變量;binvar:0—1變量;intvar:整型變量
%(3)Yalmip默認是對稱的,要求非對稱用full% 清除工作區
clear;clc;close all;
% function [m1, m2]=test_cplex()
% 創建決策變量
x=sdpvar(2,1,'full'); 
% 添加約束條件
st=[];
st=[st,-3*x(1)+x(2)<=6];
st=[st,x(1)+2*x(2)>=4];
st=[st,x(1)+3*x(2)==4];
st=[st,x(2)>=-3];
% 配置求解器
ops = sdpsettings('solver','cplex','verbose',0);
% 目標函數,默認最小
z=-2*x(1)+4*x(2); 
% 求解,如果最大值用-z
reuslt = optimize(st,z,ops);
% 求解結果x的值
x=value(x);
% 目標函數的最優解,即最小值
z=value(z);
% 打印結果
fprintf('x:%s\n', join(string(x),', '))
fprintf('z:%d\n', z)
  • 運行結果
x:13, -3
z:-38

在這里插入圖片描述

1.2、python3+scipy實現

  • scipy.optimize.linprog

這里只介紹后面要用到的幾個參數。

在這里插入圖片描述
在這里插入圖片描述

  • 代碼實現
import numpy as np
from scipy.optimize import linprogdef main():"""主函數"""# 要最小化的線性目標函數的系數c = np.array([-2, 4])# 不等式約束矩陣A_ub = np.array([[-3, 1], [-1, -2]])B_ub = np.array([6, -4])# 等式約束矩陣A_ed = np.array([[1, 3]])B_ed = np.array([4])# 決策變量的最小值和最大值對序列bounds = [None, None], [-3, None]# 求解res = linprog(c, A_ub, B_ub, A_ed, B_ed, bounds=bounds)# 求解結果x的值x = list(res.x.round())# 目標函數的最優解,即最小值z = round(res.fun)print(f'x: {x}')print(f'z: {z}')print(f'msg: {res.message}')if __name__ == '__main__':main()
  • 運行結果

在這里插入圖片描述

2、多個決策變量-cvxpy

cvxpy幾個決策變量都行哈,單個也行。我這里只是用不同的方式實現記錄下。

2.1、matlab+yalmip+cplex實現

% 創建決策變量
x=sdpvar(2,1,'full'); 
y=sdpvar(2,1,'full'); 
% 添加約束條件
st=[];
st=[st,-3*x(1)+x(2)<=6];
st=[st,x(1)+2*x(2)>=4];
st=[st,x(1)+2*x(2)<=2*y(1)];
st=[st,x(1)+3*x(2)==4];
st=[st,x(1)+4*x(2)==y(2)];
st=[st,x(2)>=-3];
% 配置求解器
ops = sdpsettings('solver','cplex','verbose',0);
% 目標函數,默認最小
z=-2*x(1)+4*y(2); 
% 求解,如果最大值用-z
reuslt = optimize(st,z,ops);
% 求解結果x的值
x=value(x);
y=value(y);
% 目標函數的最優解,即最小值
z=value(z);
% 打印結果
fprintf('x:%s\n', join(string(x),', '))
fprintf('y:%s\n', join(string(y),', '))
fprintf('z:%d\n', z)
  • 運行結果
x:13, -3
y:3.5, 1
z:-22

在這里插入圖片描述

2.2、python3+cvxpy+cplex實現

  • 需要先安裝cvxpycplex
pip3 install cvxpy
pip3 install cplex
  • 實現代碼
import cvxpy as cp# 創建決策變量
x = cp.Variable(2)
y = cp.Variable(2)# 添加約束條件
constraints = []
constraints += [-3 * x[0] + x[1] <= 6]
constraints += [x[0] + 2 * x[1] >= 4]
constraints += [x[0] + 2 * x[1] <= 2 * y[0]]
constraints += [x[0] + 3 * x[1] == 4]
constraints += [x[0] + 4 * x[1] == y[1]]
constraints += [x[1] >= -3]# 定義目標函數
objective = -2 * x[0] + 4 * y[1]# 創建模型求解
problem = cp.Problem(cp.Minimize(objective), constraints)
problem.solve(solver=cp.CPLEX, verbose=False)# 打印結果
x = list(x.value)
y = list(y.value)
# 目標函數的最優解,即最小值
z = round(problem.value)
print(f'x: {x}')
print(f'y: {y}')
print(f'z: {z}')
  • 運行結果
    在這里插入圖片描述
    最終可以看到不同的實現方式,運行結果都是一樣的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41352.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41352.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41352.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB:MySQL,Redis,ES,MongoDB的應用場景

簡單明了說明MySQL,ES,MongoDB的各自特點,應用場景,以及MongoDB如何使用的第一章節. 一. SQL與NoSQL SQL被稱為結構化查詢語言.是傳統意義上的數據庫,數據之間存在很明確的關聯關系,例如主外鍵關聯,這種結構可以確保數據的完整性(數據沒有缺失并且正確).但是正因為這種嚴密的結…

神經網絡基礎-神經網絡補充概念-34-正則化

概念 正則化是一種用于控制模型復雜度并防止過擬合的技術&#xff0c;在機器學習和深度學習中廣泛應用。它通過在損失函數中添加一項懲罰項來限制模型的參數&#xff0c;從而使模型更傾向于選擇簡單的參數配置。 理解 L1 正則化&#xff08;L1 Regularization&#xff09;&a…

數據分析 | Boosting與Bagging的區別

Boosting與Bagging的區別 Bagging思想專注于降低方差&#xff0c;操作起來較為簡單&#xff0c;而Boosting思想專注于降低整體偏差來降低泛化誤差&#xff0c;在模型效果方面的突出表現制霸整個弱分類器集成的領域。具體區別體現在如下五點&#xff1a; 弱評估器&#xff1a;Ba…

vb數控加工技術教學素材資源庫的設計和構建

摘 要 20世紀以來,社會生產力迅速發展,科學技術突飛猛進,人們進行信息交流的深度與廣度不斷增加,信息量急劇增長,傳統的信息處理與決策的手段已不能適應社會的需要,信息的重要性和信息處理問題的緊迫性空前提高了,面對著日益復雜和不斷發展,變化的社會環境,特別是企業…

Windows上使用dump文件調試

dump文件 dump文件記錄當前程序運行某一時刻的信息&#xff0c;包括內存&#xff0c;線程&#xff0c;線程棧&#xff0c;變量等等&#xff0c;相當于調試程序時運行到某個斷點上&#xff0c;把程序運行的信息記錄下來。可以通過Windbg打開dump&#xff0c;查看程序運行的變量…

mysql 修改存儲路徑,重啟失敗授權

目錄 停掉mysql修改mysql 配置文件my.cnf目錄授權重啟mysql 停掉mysql 修改mysql 配置文件my.cnf 更改mysql 存儲位置 到/data/mysql_data目錄下&#xff1a; datadir/data/mysql/mysql_data/socket/data/mysql/mysql_data/mysql.sockmysql 默認路么徑在 /var/lib/mysql/ 防止…

go_并發編程(1)

go并發編程 一、 并發介紹1&#xff0c;進程和線程2&#xff0c;并發和并行3&#xff0c;協程和線程4&#xff0c;goroutine 二、 Goroutine1&#xff0c;使用goroutine1&#xff09;啟動單個goroutine2&#xff09;啟動多個goroutine 2&#xff0c;goroutine與線程3&#xff0…

在 React 中獲取數據的6種方法

一、前言 數據獲取是任何 react 應用程序的核心方面。對于 React 開發人員來說&#xff0c;了解不同的數據獲取方法以及哪些用例最適合他們很重要。 但首先&#xff0c;讓我們了解 JavaScript Promises。 簡而言之&#xff0c;promise 是一個 JavaScript 對象&#xff0c;它將…

Python Web:Django、Flask和FastAPI框架對比

原文&#xff1a;百度安全驗證 Django、Flask和FastAPI是Python Web框架中的三個主要代表。這些框架都有著各自的優點和缺點&#xff0c;適合不同類型和規模的應用程序。 1. Django&#xff1a; Django是一個全功能的Web框架&#xff0c;它提供了很多內置的應用程序和工具&am…

排序+運算>直接運算的效率的原因分析

大家好,我是愛編程的喵喵。雙985碩士畢業,現擔任全棧工程師一職,熱衷于將數據思維應用到工作與生活中。從事機器學習以及相關的前后端開發工作。曾在阿里云、科大訊飛、CCF等比賽獲得多次Top名次。現為CSDN博客專家、人工智能領域優質創作者。喜歡通過博客創作的方式對所學的…

ADIS16470和ADIS16500從到手到讀出完整數據,附例程

由于保密原因&#xff0c;不能上傳我這邊的代碼&#xff0c;我所用的開發環境是IAR&#xff0c; 下邊轉載別的博主的文章&#xff0c;他用的是MDK 下文的博主給了你一個很好的思路&#xff0c;特此提出表揚 最下方是我做的一些手冊批注&#xff0c;方便大家了解這個東西 原文鏈…

如何利用 ChatGPT 進行自動數據清理和預處理

推薦&#xff1a;使用 NSDT場景編輯器助你快速搭建可二次編輯的3D應用場景 ChatGPT 已經成為一把可用于多種應用的瑞士軍刀&#xff0c;并且有大量的空間將 ChatGPT 集成到數據科學工作流程中。 如果您曾經在真實數據集上訓練過機器學習模型&#xff0c;您就會知道數據清理和預…

有沒有比讀寫鎖更快的鎖

在之前的文章中&#xff0c;我們介紹了讀寫鎖&#xff0c;學習完之后你應該已經知道了讀寫鎖允許多個線程同時訪問共享變量&#xff0c;適用于讀多寫少的場景。那么在讀多寫少的場景中還有沒有更快的技術方案呢&#xff1f;還真有&#xff0c;在Java1.8這個版本里提供了一種叫S…

Docker安裝Skywalking APM分布式追蹤系統

Skywalking是一個應用性能管理(APM)系統&#xff0c;具有服務器性能監測&#xff0c;應用程序間調用關系及性能監測等功能&#xff0c;Skywalking分為服務端、管理界面、以及嵌入到程序中的探針部分&#xff0c;由程序中的探針采集各類調用數據發送給服務端保存&#xff0c;在管…

novnc 和 vnc server 如何實現通信?原理?

參考&#xff1a;https://www.codenong.com/js0f3b351a156c/

隨機微分方程

應用隨機過程|第7章 隨機微分方程 見知乎&#xff1a;https://zhuanlan.zhihu.com/p/348366892?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384

復習3-5天【80天學習完《深入理解計算機系統》】第七天

專注 效率 記憶 預習 筆記 復習 做題 歡迎觀看我的博客&#xff0c;如有問題交流&#xff0c;歡迎評論區留言&#xff0c;一定盡快回復&#xff01;&#xff08;大家可以去看我的專欄&#xff0c;是所有文章的目錄&#xff09;   文章字體風格&#xff1a; 紅色文字表示&#…

Linux與bash(基礎內容一)

一、常見的linux命令&#xff1a; 1、文件&#xff1a; &#xff08;1&#xff09;常見的文件命令&#xff1a; &#xff08;2&#xff09;文件屬性&#xff1a; &#xff08;3&#xff09;修改文件屬性&#xff1a; 查看文件的屬性&#xff1a; ls -l 查看文件的屬性 ls …

神經網絡基礎-神經網絡補充概念-33-偏差與方差

概念 偏差&#xff08;Bias&#xff09;&#xff1a; 偏差是模型預測值與實際值之間的差距&#xff0c;它反映了模型對訓練數據的擬合能力。高偏差意味著模型無法很好地擬合訓練數據&#xff0c;通常會導致欠擬合。欠擬合是指模型過于簡單&#xff0c;不能捕捉數據中的復雜模式…

基于java在線讀書與分享論壇設計與實現

摘 要 互聯系統的技術在如今的社會中&#xff0c;應用的越來越廣泛&#xff0c;通過互聯系統我們可以更方便地進行辦公&#xff0c;也能夠在系統上就能處理很多日常的事務。互聯系統的技術的發展&#xff0c;也是人們日常中接觸更多的一項技術。隨著互聯系統的發展&#xff0c;…