修正单纯性法

代码例如以下:

舍去了输入转化的内容,主要包括算法关键步骤。

public class LPSimplexM {

	private static final double inf = 1e9;

	private int n;							// 约束个数
private double[][] A; // 输入函数參数
private double[] b; // 约束值
private double[] c; // 目标函数系数
private double Z; // 目标值
private void InitF() { // 初始化 First
/* problem 1.
* max Z = 5*x1 + 4*x2; min Z = -5*x1 - 4*x2;
* x1 + 3*x2 <= 90; x1 + 3*x2 + x3 = 90;
* 2*x1 + x2 <= 80; => 2*x1 + x2 + x4 = 80;
* x1 + x2 <= 45; x1 + x2 + x5 = 45;
* xi >= 0
*/
/* problem 2.
* min Z = -7*x1 - 12*x2;
* 9*x1 + 4*x2 + x3 = 360;
* 4*x1 + 5*x2 +x4 = 200;
* 3*x1 + 10*x2 + x5 = 300;
* xi >= 0
*/
n = 3;
A = new double[n+1][n+1];
b = new double[n+1];
// c = new double[n<<1];
Z = inf;
// 约束初始条件
A[1][1] = 1; A[1][2] = 3;
A[2][1] = 2; A[2][2] = 1;
A[3][1] = 1; A[3][2] = 1;
// 条件值
// problem 1.
// b[1] = 90;
// b[2] = 80;
// b[3] = 45;
// problem 2.
b[1] = 360;
b[2] = 200;
b[3] = 300;
// for(int i = 1; i <= n; i++)System.out.println("b[" + i + "] = " + b[i]);
// 目标函数系数
// c[1] = -5; c[2] = -4;
} int m;
private double[][] p;
private double[][] e, oe;
private double[][] E, oE;
private double[] X;
private boolean[] G;
private int[] S;
private void InitS() {
m = 2;
p = new double[n+1][n+m+1];
e = new double[n+1][n+1];
oe = new double[n+1][n+1];
E = new double[n+1][n+1];
oE = new double[n+1][n+1];
X = new double[n+1];
G = new boolean[n+m+1];
S = new int[n+1]; c = new double[n+m+1];
// problem 1.
// c[1] = -5; c[2] = -4; c[3] = 0; c[4] = 0; c[5] = 0;
// problem 2.
c[1] = -7; c[2] = -12; c[3] = 0; c[4] = 0; c[5] = 0;
// problem 1.
// p[1][1] = 1; p[1][2] = 3; p[1][3] = 1; p[1][4] = 0; p[1][5] = 0;
// p[2][1] = 2; p[2][2] = 1; p[2][3] = 0; p[2][4] = 1; p[2][5] = 0;
// p[3][1] = 1; p[3][2] = 1; p[3][3] = 0; p[3][4] = 0; p[3][5] = 1;
// problem 2.
p[1][1] = 9; p[1][2] = 4; p[1][3] = 1; p[1][4] = 0; p[1][5] = 0;
p[2][1] = 4; p[2][2] = 5; p[2][3] = 0; p[2][4] = 1; p[2][5] = 0;
p[3][1] = 3; p[3][2] = 10; p[3][3] = 0; p[3][4] = 0; p[3][5] = 1; for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i == j)E[i][j] = oE[i][j] = 1;
else E[i][j] = oE[i][j] = 0; for(int i = 1; i <= n; i++)
X[i] = b[i]; G[1] = false; G[2] = false; G[3] = true; G[4] = true; G[5] = true; S[1] = 3; S[2] = 4; S[3] = 5;
} public LPSimplexM() {
InitF();
InitS();
AlgorithmProcess();
solve();
} private void AlgorithmProcess() {
double[] coE = new double[n+1]; // c * E^-1
double[] r = new double [n+m+1]; // c - c * E^-1 * p
double[] oEp = new double[n+1]; // E^-1 * p;
boolean flag = false;
while(true) {
// x = E^-1 * b
for(int i = 1; i <= n; i++){
X[i] = 0;
for(int j = 1; j <= n; j++)
X[i] += oE[i][j]*b[j];
}
// c * E^-1
for(int i = 1; i <= n; i++){
coE[i] = 0;
for(int j = 1; j <= n; j++)
coE[i] += c[S[j]]*oE[j][i];
}
// r = c - c * E^-1 * p => min r' id -> k
int k = -1;
flag = false;
for(int i = 1; i <= n+m; i++)if(!G[i]){
double ans = 0;
for(int j = 1; j <= n; j++)
ans += coE[j]*p[j][i];
r[i] = c[i] - ans;
if(!flag && r[i] < 0){
k = i;
flag = true;
}else if(flag && r[i] < r[k]){
k = i;
}
}
if(k == -1)return ; // solution output 1(X, S 为最优解)
// E^-1 * p; => min theta>0' id -> s
int s = -1;
flag = false;
for(int i = 1; i <= n; i++){
oEp[i] = 0;
for(int j = 1; j <= n; j++){
oEp[i] += oE[i][j]*p[j][k];
}
if(oEp[i] > 0){
if(!flag){
s = i;
flag = true;
}else if(flag && X[i]/oEp[i] < X[s]/oEp[s]){
s = i;
}
}
}
if(!flag)return ; // no solution 1(无同意解)
if(s == -1)return ; // no solution 2(该问题有无解集)
// p[s] = p[k], 形成新的矢量基 E
G[S[s]] = false; G[k] = true;
S[s] = k;
// System.out.println("k = " + k + "; s = " + s);
for(int i = 1; i <= n; i++){
p[i][k] = -1.0*oEp[i]/oEp[s];
if(i == s)
p[i][k] = 1/oEp[s];
}
for(int i = 1; i <= n; i++){
int id = S[i];
for(int j = 1; j <= n; j++){
if(i == s){
e[j][i] = p[j][k];
}else{
if(j == i){
e[j][i] = 1;
}else{
e[j][i] = 0;
}
}
}
}
// for(int i = 1; i <= n; i++){
// for(int j = 1; j <= n; j++){
// System.out.print(oE[i][j] + " ");
// }System.out.println();
// }System.out.println("{oE}");
// for(int i = 1; i <= n; i++){
// for(int j = 1; j <= n; j++){
// System.out.print(e[i][j] + " ");
// }System.out.println();
// }System.out.println("{e}");
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
oe[i][j] = 0;
for(int t = 1; t <= n; t++){
oe[i][j] += e[i][t]*oE[t][j];
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
oE[i][j] = oe[i][j];
//System.out.print(oE[i][j] + " ");
}//System.out.println();
}//System.out.println();
}
}
// 最优解输出
private void solve() {
Z = 0;
for(int i = 1; i <= n; i++){
int id = S[i];
Z += c[id]*X[i];
System.out.println(id + " : " + X[i] + " * " + -c[id]);
}
System.out.println("Z = " + -Z);
} public static void main(String[] args) {
new LPSimplexM();
}
}

如有问题,请网友指正。

希望网友的交流,共同进步。

修正单纯形法&#183;优化算法实现&#183;Java的更多相关文章

  1. [DeeplearningAI笔记]改善深层神经网络_优化算法2.3_2.5_带修正偏差的指数加权平均

    Optimization Algorithms优化算法 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.3 指数加权平均 举个例子,对于图中英国的温度数据计算移动平均值或者说是移动平均值( ...

  2. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  3. 粒子群优化算法及其java实现

    憋了两周终于把开题报告憋出来了,再一次证明自己不适合搞学术,哎--,花了点时间把报告中提到的粒子群算法看了看,看了些资料,用java跑起来. 算法简介 粒子群算法最先由Barnhart博士和Kenne ...

  4. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  5. DeepLearning.ai学习笔记(二)改善深层神经网络:超参数调试、正则化以及优化--Week2优化算法

    1. Mini-batch梯度下降法 介绍 假设我们的数据量非常多,达到了500万以上,那么此时如果按照传统的梯度下降算法,那么训练模型所花费的时间将非常巨大,所以我们对数据做如下处理: 如图所示,我 ...

  6. [DeeplearningAI笔记]改善深层神经网络_优化算法2.6_2.9Momentum/RMSprop/Adam优化算法

    Optimization Algorithms优化算法 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.6 动量梯度下降法(Momentum) 另一种成本函数优化算法,优化速度一般快于标准 ...

  7. 智能优化算法对TSP问题的求解研究

    要求: TSP 算法(Traveling Salesman Problem)是指给定 n 个城市和各个城市之间的距离,要 求确定一条经过各个城市当且仅当一次的最短路径,它是一种典型的优化组合问题,其最 ...

  8. 【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam

    优化算法 1 GD/SGD/mini-batch GD GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD. SGD:随机梯度下降.一次只随机选择一个样本进行训练和 ...

  9. Adam优化算法

    Question? Adam 算法是什么,它为优化深度学习模型带来了哪些优势? Adam 算法的原理机制是怎么样的,它与相关的 AdaGrad 和 RMSProp 方法有什么区别. Adam 算法应该 ...

随机推荐

  1. vijos--P1211--生日日数(纯模拟)

    P1211生日日数 未递交 标签:[显示标签] 描述 CCC老师的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天). 格式 输入格式 从文件的第一行分别读入YY,MM ...

  2. P 值(p value)与统计检验

    P 值是最常用的一个统计学指标,几乎统计软件输出结果都有P值. 统计学的观点,超过一定基准(比如 5%,其实是低于5%),就不能简单地认为这是偶然事件了,而是受到了外在的影响. 一般而言,为了确定从样 ...

  3. 1.Windows7下安装与破解IntelliJ IDEA2017

    转自:https://www.cnblogs.com/justuntil/p/7245170.html IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界 ...

  4. Framework3.5安装(Windows8.1)

    在用到Android逆向助手,使用时提示安装Framework3.5,Windows7都有Framework3.5,Windows8却没有,联网更新就算了,这龟速更新得多久.但是问题总还是要解决,随便 ...

  5. php八大设计模式之工厂模式

    简单点来说,就是用到什么类,就去实例化对应的类.比如:php 可能连接 mysql,可能连接 sqlserver,也可能是 oracle 数据库,可以动态的去链接. 书籍<php权威编程> ...

  6. P3514 [POI2011]LIZ-Lollipop(规律+瞎搞)

    题意 给一个只有1和2的序列,每次询问有没有一个子串的和为x ( 1≤n,m≤1 000 000 )kkk ( 1≤k≤2 000 000 ) 题解 我觉得是道好题. 主要是证明一个性质:假如有一个字 ...

  7. [USACO16FEB]围栏Fenced In Platinum

    题目:洛谷P3141. 题目大意:有一个方形区域,被分成若干区域.现在要去掉若干条围栏,使得所有区域连通,求最少去掉多少长度的围栏. 解题思路:贪心.建议画图思考. 先对围栏位置进行排序,然后相邻两条 ...

  8. vue+element-ui的简洁导入导出功能

    1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;原生js导出excel2.导入是利用element-ui的Upload 上传组件; <el-upload class=&qu ...

  9. 今日SGU 5.29

    sgu 299 题意:给你n个线段,然后问你能不能选出其中三个组成一个三角形,数字很大 收获:另一个大整数模板 那么考虑下为什么如果连续三个不可以的话,一定是不存在呢? 连续上个不合法的话,一定是 a ...

  10. unity调用Android的两种方式:其二,调用aar包

    上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html, 现在我们介绍一下怎么生成aar包和unity怎么调用aar 一. ...