c++實(shí)現(xiàn)單純形法現(xiàn)行規(guī)劃問(wèn)題的求解(推薦)
在本程序中默認(rèn)該現(xiàn)行規(guī)劃問(wèn)題有最優(yōu)解
針對(duì)此問(wèn)題:

#include<iostream>
using namespace std;
int check(float *sigema, int m) {
for (int i = 1; i <= m ; i++) {
if (sigema[i] > 0) {
return 0;
}
}
return 1;
}
//此程序已經(jīng)化為標(biāo)準(zhǔn)型的線性規(guī)劃問(wèn)題中,且默認(rèn)有最優(yōu)解
int main(int argc, char* argv[])
{
//數(shù)據(jù)輸入部分
int m, n;
cout << "請(qǐng)輸入變量個(gè)數(shù):";
cin >> m;
cout << "請(qǐng)輸入不等式個(gè)數(shù):";
cin >> n;
float **matrix = new float*[n + 1]; //系數(shù)矩陣
for (int i = 1; i <= n; i++) {
matrix[i] = new float[m + 2];
}
float *cj = new float[m + 1];
float *cB = new float[n + 1]; //基變量系數(shù)
int *XB = new int[n + 1]; //用來(lái)標(biāo)注基變量x的下標(biāo)
float *b = new float[n + 1];
float *sigema = new float[n + 1];
float *sita = new float[n + 1];
//初始化
for (int i = 0; i <= m; i++) {
cj[i] = 0;
}
for (int i = 0; i <= n; i++) {
cB[i] = 0;
XB[i] = 0;
b[i] = 0;
sigema[i] = 0;
sita[i] = 0;
}
cout << "請(qǐng)輸入目標(biāo)函數(shù)系數(shù)(用空格間開):" << endl;
for (int i = 1; i <= m; i++) {
cin >> cj[i];
}
cout << "請(qǐng)輸入各不等式的系數(shù)和常量(用空格間開):" << endl;
for (int i = 1; i <= n; i++) {
cout << "不等式" << i << ": ";
for (int j = 1; j <= m + 1; j++) {
cin >> matrix[i][j];
}
}
cout << "請(qǐng)輸入目標(biāo)函數(shù)中基變量下標(biāo):" << endl;
for (int i = 1; i <= n; i++) {
cin >> XB[i];
cB[i] = cj[XB[i]];
//常量
b[i] = matrix[i][m + 1];
}
//計(jì)算檢驗(yàn)數(shù)
for (int i = 1; i <= m; i++) {
sigema[i] = cj[i];
for (int j = 1; j <= n; j++) {
sigema[i] -= cB[j] * matrix[j][i];
}
}
while (check(sigema, m) == 0) {
//尋找入基變量
float maxn = sigema[1];
int sigema_xindex = 0;
float sigema_xcoefficient = 0;
for (int i = 1; i <= m; i++) {
if (maxn <= sigema[i]) {
maxn = sigema[i];
sigema_xindex = i;
sigema_xcoefficient = cj[i];
}
}
//計(jì)算sita
for (int i = 1; i <= n; i++) {
if (matrix[i][sigema_xindex] > 0) {
sita[i] = b[i] / matrix[i][sigema_xindex];
}
else {
sita[i] = 9999; //表示sita值為負(fù)數(shù)
}
}
//尋找出基變量
float minn = sita[1];
int sita_xindex = 0;
for (int i = 1; i <= n; i++) {
if (minn >= sita[i] && sita[i] > 0) {
minn = sita[i];
sita_xindex = i;
}
}
//入基出基變換,先入基再出基
//入基操作
for (int i = 1; i <= n; i++) {
if (i == sita_xindex) {
XB[i] = sigema_xindex;
cB[i] = sigema_xcoefficient;
break;
}
}
//出基計(jì)算
//化1
//cout << endl << "此處為化1的結(jié)果------" << endl;
float mul1 = matrix[sita_xindex][sigema_xindex];
for (int i = 1; i <= m; i++) {
matrix[sita_xindex][i] /= mul1;
}
b[sita_xindex] /= mul1;
//化0
//cout << endl << "此處為化0的結(jié)果------" << endl;
for (int i = 1; i <= n; i++) {
if (i == sita_xindex) {
continue;
}
float mul2 = matrix[i][sigema_xindex] / matrix[sita_xindex][sigema_xindex];
for (int j = 1; j <= m; j++) {
matrix[i][j] -= (matrix[sita_xindex][j] * mul2);
}
b[i] -= (b[sita_xindex] * mul2);
}
for (int i = 1; i <= n; i++) {
if (i == sita_xindex) {
continue;
}
}
for (int i = 1; i <= m; i++) {
sigema[i] = cj[i];
for (int j = 1; j <= n; j++) {
sigema[i] -= cB[j] * matrix[j][i];
}
}
}
float MaxZ = 0;
float *result = new float[m + 1];
for (int i = 0; i <= m; i++) {
result[i] = 0;
}
for (int i = 1; i <= n; i++) {
result[XB[i]] = b[i];
}
cout << "最優(yōu)解為:X = (";
for (int i = 1; i < m; i++) {
cout << result[i] << ",";
}
cout << result[m] << ")" << endl;
for (int i = 1; i <= m; i++) {
MaxZ += result[i] * cj[i];
}
cout << "最優(yōu)值為:MzxZ = " << MaxZ;
return 0;
}
程序運(yùn)行結(jié)果:

總結(jié)
到此這篇關(guān)于c++實(shí)現(xiàn)單純形法現(xiàn)行規(guī)劃問(wèn)題的求解的文章就介紹到這了,更多相關(guān)c++單純形法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
C語(yǔ)言初識(shí)動(dòng)態(tài)內(nèi)存管理malloc calloc realloc free函數(shù)
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存2022-03-03
C語(yǔ)言詳細(xì)講解if語(yǔ)句與switch語(yǔ)句的用法
用 if 語(yǔ)句可以構(gòu)成分支結(jié)構(gòu),它根據(jù)給的條件進(jìn)行判定,以決定執(zhí)行哪個(gè)分支程序段,C 語(yǔ)言中還有另外一種分支語(yǔ)句,就是 switch 語(yǔ)句2022-05-05
C++ 風(fēng)靡一時(shí)的連連看游戲的實(shí)現(xiàn)流程詳解
游戲“連連看”是源自臺(tái)灣的桌面小游戲,自從流入大陸以來(lái)風(fēng)靡一時(shí),也吸引眾多程序員開發(fā)出多種版本的“連連看”。這其中,顧芳編寫的“阿達(dá)連連看”以其精良的制作廣受好評(píng),這也成為顧方“阿達(dá)系列軟件”的核心產(chǎn)品。并于2004年,取得國(guó)家版權(quán)局的計(jì)算機(jī)軟件登記證書2021-11-11
C語(yǔ)言詳細(xì)分析講解關(guān)鍵字goto與void的作用
我們?cè)贑語(yǔ)言中經(jīng)常會(huì)見(jiàn)到void,也會(huì)偶爾見(jiàn)到goto,那么C語(yǔ)言中既然有g(shù)oto,為什么我們?cè)诖a中見(jiàn)的很少呢?在以前很多的項(xiàng)目經(jīng)驗(yàn)中,我們得到這樣一條潛規(guī)則:一般項(xiàng)目都是禁用goto的,程序質(zhì)量與goto的出現(xiàn)次數(shù)成反比。自后也就造成了我們一般不會(huì)使用goto2022-04-04
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼
復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10

