網(wǎng)站首頁 編程語言 正文
python cvxpy下SDP問題編程
最近在做定位算法的復(fù)現(xiàn)問題,遇到了
Source Localization in Wireless Sensor Networks From Signal Time-of-Arrival Measurements
里面的一個半正定優(yōu)化算法,因此選用cvxpy庫實現(xiàn)。
官方文檔[cvxpy]的例程復(fù)現(xiàn)的算法都很簡單,因此對該問題的借鑒意義不大。
算法如下
對我而言,首先的難度就是拼接矩陣后的半正定約束條件,起初是另設(shè)立兩個矩陣變量,然后按部就班的增加限制條件。但最后求得的數(shù)據(jù)千奇百怪,與預(yù)測位置沒有任何關(guān)系。
后來不斷嘗試更改約束限制的表達(dá)形式,但均無效果。
后來輸出了每個變量的值查看,發(fā)現(xiàn)Q元素的物理意義為預(yù)測距離的平方,但是求出來的Q矩陣元素往往極大,因此擅自添加了一個約束條件,限制Q的最大元素在預(yù)測距離平方的量級上,完美解決問題。
附上代碼
class Program_t:
def __init__(self,bt):
self.BT = bt
self.BT_x = [b[0] for b in self.BT]
self.BT_y = [b[1] for b in self.BT]
self.T=[b[2] for b in self.BT]
self.number = len(bt)
def LS_steps(self):
num = len(self.T)
up_control = 2*max(self.T)**2#限制最大元素量級
Q = cp.Variable((num,num))#待求變量
tao = cp.Variable((num,1))#生成矩陣形式后面才可以拼接
y_ = cp.Variable((2,1))
y_s = cp.Variable((1,1))#矩陣形式用于拼接
yita = 0.000005*sum(self.T) / num#論文給出的參數(shù)選擇,可更改常數(shù)
G = np.eye(num)-np.ones((num,num))
t = np.array([self.T]).T
expr1 = cp.trace((cp.transpose(G)) @ G @ (Q- cp.multiply(2,t @ (cp.transpose(tao)))+t @ (cp.transpose(t))))
expr2 = yita*cp.sum(Q)
expr = expr1+ expr2#目標(biāo)函數(shù)
Q_ = cp.bmat([[Q,tao],[cp.transpose(tao),[[1]]]])#拼接矩陣
Y = cp.bmat([[np.eye(2),y_],[cp.transpose(y_),y_s]])#拼接矩陣
constraints = [Q_ >> 0, Y >> 0, cp.max(Q)<=up_control]#限制條件Q半正定,Y半正定,Q最大元素小于上限(這個約束非常重要,是我自己加上去的)
for i in range(num):
X = np.array([self.BT_x[i],self.BT_y[i],-1]).T
constraints += [Q[i, i] == cp.transpose(X) @ Y @ X]#約束條件
for j in range(i+1,num):
X_j = np.array([self.BT_x[j], self.BT_y[j],-1]).T
constraints += [Q[i, j] >= cp.abs(cp.transpose(X) @ Y @ X_j)]#約束條件
obj = cp.Minimize(expr)
prob = cp.Problem(obj, constraints)
prob.solve()
position = y_.value
print(expr1.value)#輸出值
print(expr2.value)
print(prob.value)#輸出值
print(prob.status)#輸出狀態(tài)
print(position)
return position
總結(jié)
1.理論算法與編程實現(xiàn)永遠(yuǎn)不等,不能輕易照搬,具體實現(xiàn)過程中要結(jié)合實際情況進(jìn)行考慮,當(dāng)求得的結(jié)果與預(yù)計相差很多時,可以嘗試增加數(shù)值約束,因為計算機(jī)仿真只是近似,不是理論上的完美條件。
2.編程實現(xiàn)調(diào)用庫時,最好按照庫的標(biāo)準(zhǔn)寫,如本例中矩陣點乘可以用numpy 的dot或者cvxpy的@,以及轉(zhuǎn)置的.T和cp.transpose().但是dot有時會產(chǎn)生意想不到的情況,平白增加工作量。
3.復(fù)現(xiàn)算法時必須要對算法有深入理解,否則難以發(fā)現(xiàn)問題所在。
4.不要輕易懷疑工具包的問題,經(jīng)過大量使用的工具包一定比你的感覺可靠。
原文鏈接:https://blog.csdn.net/zy123457/article/details/124681789
相關(guān)推薦
- 2021-12-12 c++虛函數(shù)與虛函數(shù)表原理_C 語言
- 2022-08-06 詳解Python如何優(yōu)雅地解析命令行_python
- 2022-12-08 Python中的pandas庫簡介及其使用教程_python
- 2022-02-23 去除type=“number“輸入框聚焦時的上下箭頭
- 2023-07-04 LinkedBlockingQueue與ArrayBlockingQueue對比
- 2022-06-10 SQL?Server使用導(dǎo)出向?qū)Чδ躝MsSql
- 2022-04-11 Android開發(fā)中checkBox自定義樣式
- 2022-03-16 c#語言入門類型和成員_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支