运筹学线性规划程序(或两阶段法)用java或c,c++都可以

Python012

运筹学线性规划程序(或两阶段法)用java或c,c++都可以,第1张

#include <stdio.h>

#include <stdlib.h>

#define MAX 100

#define STP 100

int stop=1//迭代记数变量

int status//iterative迭代返回值:1唯一最优,0无界解,-1无穷多最优解 -2迭代超过限制次数

int step=1//目前阶段

double a[MAX][MAX],b[MAX],c[MAX],temp_c[MAX],max=0//方程组相关系数

int num_x//变量个数

int num_st//约束方程数

int num_ar=0//人工变量个数

int arti[MAX]//人工变量下标

int base[MAX]//基变量下标

int ma_mi//1为求最大值,2为求最小值

void create()//建立方程组

void iterative()//单纯型法迭代

void output()//输出结果

void banner()//打印程序标题

void exchange()//交换两阶段价值系数

void show()//输出方程组

void main() {

int i,j,k

banner()

create()

//保存原价值系数,转换为第一阶段价值系数

for(i=1i<=num_xi++) {

k=0

for(j=1j<=num_arj++) if(i==arti[j]) k=1

if(k==1) temp_c=-1

else temp_c=0

}

exchange(c,temp_c)

printf("\n\n第一阶段问题为:\n\n")

show()

step++

printf("\n\n按回车开始第一阶段迭代")

getchar()

getchar()

iterative()

if(status==-2) {

puts("迭代超过限制次数强行终止!\n")

puts("\n按回车结束")

getchar()

exit(0)

}

output()

if(max!=0) {

puts("\n\n原问题无可行解。\n")

puts("\n按回车结束")

getchar()

exit(0)

}

//转换为第二阶段价值系数

exchange(c,temp_c)

//把人工变量列全设为0

for(i=1i<=num_ari++) {

c[arti]=0

for(j=1j<=num_stj++) a[j][arti]=0

}

puts("\n\n第二阶段问题为:\n\n")

show()

puts("\n\n按回车开始第二阶段迭代")

getchar()

iterative()

switch(status) {

case 1:

output()

puts("\n\n原问题有唯一最优解。\n")

puts("\n按回车结束")

getchar()

exit(0)

case 0:

puts("\n\n原问题为无界解。\n")

puts("\n按回车结束")

getchar()

exit(0)

case -1:

output()

puts("\n\n原问题有无穷多最优解。\n")

puts("\n按回车结束")

getchar()

exit(0)

case -2:

puts("迭代超过限制次数强行终止!\n")

puts("\n按回车结束")

getchar()

exit(0)

}//switch

}

void banner() {

printf("\t\t****************************************\n")

printf("\t\t 单纯型法解线性规划问题\n")

printf("\t\t 作者:Thunder\n")

printf("\t\t****************************************\n")

printf("\n")

}

void show() {

//对方程组以自然的格式输出,系数为零的x不显示

//为1的不显示系数1,-1系数只显示负号

int i,j,k

switch(step) {

case 1:

printf("min z= ")

printf("x[%d]",arti[1])

for(i=2i<=num_ari++) printf(" + x[%d]",arti)

break

case 2:

printf("max z= ")

printf("%lg x[%d]",c[1],1)

for(i=2i<=num_xi++) {

if(c==1) printf(" + x[%d]",i)

else if(c==-1) printf(" - x[%d]",i)

else if(c>=0) printf(" +%lg x[%d]",c,i)

else printf(" %lg x[%d]",c,i)

}

break

}

printf("\nst:\n")

for(i=1i<=num_sti++) {

k=0

for(j=1j<=num_xj++) {

if(a[j]!=0) {

if(a[j]==1&&k!=0) printf(" + x[%d]",j)

else if(a[j]==1&&k==0) printf(" x[%d]",j)

else if(a[j]==-1) printf(" - x[%d]",j)

else if(a[j]>=0&&k!=0) printf(" +%lg x[%d]",a[j],j)

else if(a[j]>=0&&k==0) printf(" %lg x[%d]",a[j],j)

else printf(" %lg x[%d]",a[j],j)

k=1

}

}

printf(" == %lg\n",b)

}

printf(" x[1]~x[%d]>=0",num_x)

}

void exchange() {

int i

double temp[MAX]

for(i=1i<=num_xi++) {

temp=temp_c

temp_c=c

c=temp

}

}

void create() {

//输入方程组系数,每个方程输完后回显确认

int i,j,k,re_st[MAX],tnum_x,num_addv=0,num_ba=0

char confirm

while(1) {

printf("请选择:1、求最大值,2、求最小值:(1/2)")

scanf("%d",&ma_mi)

if(ma_mi!=1&&ma_mi!=2) printf("输入错误,重新选择。")

else break

}

while(1) {

printf("指定变量个数:")

scanf("%d",&num_x)

printf("输入价值系数c1-c%d:\n",num_x)

for(i=1i<=num_xi++) {

printf("c%d=",i)

scanf("%lf",&c)

}

if(ma_mi==1) printf("max z= ")

else printf("min z= ")

printf("%lg x[%d]",c[1],1)

for(i=2i<=num_xi++) {

if(c>=0) printf(" +%lg x[%d]",c,i)

else printf(" %lg x[%d]",c,i)

}

printf("\n正确吗?:(y/n)")

getchar()

confirm=getchar()

if (confirm=='y') break

else if(confirm=='n') continue

}

printf("输入约束方程组个数:")

scanf("%d",&num_st)

for(i=1i<=num_sti++) {

printf("st.%d:\n",i)

while(1) {

printf("请选择:1、==,2、>=,3、<= :(1/2/3)")

scanf("%d",&re_st)

if(re_st!=1&&re_st!=2&&re_st!=3) printf("输入错误,请重新选择。")

else break

}

printf("输入技术系数:\n")

for(j=1j<=num_xj++) {

printf("a%d=",j)

scanf("%lf",&a[j])

}

printf("输入资源拥有量:\nb%d=",i)

scanf("%lf",&b)

printf("st.%i:\n",i)

printf("%lg x[%d]",a[1],1)

for(j=2j<=num_xj++) {

if(a[j]>=0) printf(" +%lg x[%d]",a[j],j)

else printf(" %lg x[%d]",a[j],j)

}

switch(re_st) {

case 1: printf(" == %lg",b)break

case 2: printf(" >= %lg",b)break

case 3: printf(" <= %lg",b)break

}

while(1) {

printf("\n正确吗?(y/n)")

getchar()

confirm=getchar()

if (confirm=='y') break

else if(confirm=='n') {i-=1break}

}

}

//显示输入的方程组

printf("\n原问题为:\n\n")

if(ma_mi==1) printf("max z= ")

else printf("min z= ")

printf("%lg x[%d]",c[1],1)

for(i=2i<=num_xi++) {

if(c==1) printf(" + x[%d]",i)

else if(c==-1) printf(" - x[%d]",i)

else if(c>=0) printf(" +%lg x[%d]",c,i)

else printf(" %lg x[%d]",c,i)

}

printf("\nst:\n")

for(i=1i<=num_sti++) {

k=0

for(j=1j<=num_xj++) {

if(a[j]!=0) {

if(a[j]==1&&k!=0) printf(" + x[%d]",j)

else if(a[j]==1&&k==0) printf(" x[%d]",j)

else if(a[j]==-1) printf(" - x[%d]",j)

else if(a[j]>=0&&k!=0) printf(" +%lg x[%d]",a[j],j)

else if(a[j]>=0&&k==0) printf(" %lg x[%d]",a[j],j)

else printf(" %lg x[%d]",a[j],j)

k=1

}

}

switch(re_st) {

case 1:

printf(" == %lg\n",b)

break

case 2:

printf(" >= %lg\n",b)

break

case 3:

printf(" <= %lg\n",b)

break

}

}

printf(" x[1]~x[%d]>=0\n",num_x)

tnum_x=num_x

for(i=1i<=num_sti++) {

switch(re_st) {

case 1:

case 3:

num_x+=1

break

case 2:

num_x+=2

break

}

}

//化为标准形式

if(ma_mi==2) for(i=1i<=tnum_xi++) c*=-1//求最小值时,系数变相反数

for(i=1i<=num_sti++) {

switch(re_st) {

case 1:

num_addv++

num_ba++

num_ar++

c[tnum_x+num_addv]=0

base[num_ba]=arti[num_ar]=tnum_x+num_addv

for(j=tnum_x+1j<=num_xj++)

if(j==tnum_x+num_addv) a[tnum_x+num_addv]=1

else a[j]=0

break

case 2:

num_addv++

c[tnum_x+num_addv]=0

num_addv++

num_ba++

num_ar++

c[tnum_x+num_addv]=0

base[num_ba]=arti[num_ar]=tnum_x+num_addv

for(j=tnum_x+1j<=num_xj++)

if(j==tnum_x+num_addv-1) a[tnum_x+num_addv-1]=-1

else if(j==tnum_x+num_addv) a[tnum_x+num_addv]=1

else a[j]=0

break

case 3:

num_addv++

num_ba++

c[tnum_x+num_addv]=0

base[num_ba]=tnum_x+num_addv

for(j=tnum_x+1j<=num_xj++)

if(j==tnum_x+num_addv) a[tnum_x+num_addv]=1

else a[j]=0

break

}//switch

}//增加松弛变量、剩余变量、人工变量、确定基变量

//显示标准化后的方程组

printf("\n化为标准形式后:\n\n")

if(ma_mi==1) printf("max z= ")

else printf("max z'= ")

printf("%lg x[%d]",c[1],1)

for(i=2i<=num_xi++) {

k=0

for(j=1j<=num_arj++)

if(i==arti[j]) k=1

if(k==1) printf(" -M x[%d]",i)

else if(c==1) printf(" + x[%d]",i)

else if(c==-1) printf(" - x[%d]",i)

else if(c>=0) printf(" +%lg x[%d]",c,i)

else printf(" %lg x[%d]",c,i)

}

printf("\nst:\n")

for(i=1i<=num_sti++) {

k=0

for(j=1j<=num_xj++) {

if(a[j]!=0) {

if(a[j]==1&&k!=0) printf(" + x[%d]",j)

else if(a[j]==1&&k==0) printf(" x[%d]",j)

else if(a[j]==-1) printf(" - x[%d]",j)

else if(a[j]>=0&&k!=0) printf(" +%lg x[%d]",a[j],j)

else if(a[j]>=0&&k==0) printf(" %lg x[%d]",a[j],j)

else printf(" %lg x[%d]",a[j],j)

k=1

}

}

printf(" == %lg\n",b)

}

printf(" x[1]~x[%d]>=0",num_x)

}

void iterative() {

int i,j,k,k_a,k_f,l//k_a,k_f值为0或1,记录当前下标在arti[]或base[]里的搜索结果

int base_elem

int base_out,base_in

double sigma[MAX],temp

double value_be//高斯消元里保存主元素值

printf("\n\n第%d次迭代:\n\n",stop)

for(i=1i<=num_sti++) {

printf("c%d=%lg\t",base,c[base])

printf("b%d=%lg\t",i,b)

switch(step) {

case 1:

for(j=1j<=num_xj++)

{

printf("a[%d][%d]=%lg\t",i,j,a[j])

}

printf("\n")

break

case 2:

for(j=1j<=num_xj++) {

k_a=0

for(l=1l<=num_arl++) if(j==arti[l])k_a=1

if(k_a!=1) printf("a[%d][%d]=%lg\t",i,j,a[j])

}

printf("\n")

break

}

}

//求检验数sigma

for(i=1i<=num_xi++) {

sigma=c

for(j=1j<=num_stj++) sigma-=c[base[j]]*a[j]

for(j=1j<=num_stj++) if(i==base[j]) sigma=0

switch(step) {

case 1:

printf("sigma[%d]=%lg\t",i,sigma)

break

case 2:

k_a=0

for(l=1l<=num_arl++) if(i==arti[l]) k_a=1

if(k_a!=1) printf("sigma[%d]=%lg\t",i,sigma)

break

}

}

putchar('\n')

//检验检验数sigma是否全小于等于0

k=0

for(i=1i<=num_xi++) {

if(sigma>0)

k=1

}

if(k==0) {

//sigma是全小于等于0时,检查是否为无穷多最优解

for(i=1i<=num_xi++) {

k_f=k_a=0

for(j=1j<=num_arj++)

if(i==arti[j]) k_a=1

if(sigma==0&&k_a!=1) {

for(j=1j<=num_stj++) if(i==base[j]) k_f=1

if(k_f==0) {status=-1return}

}

}

status=1

return

}

//检查是否为无界解

for(i=1i<=num_xi++) {

k_f=0

if(sigma>0) {

for(j=1j<=num_stj++) if(a[j]>0) k_f=1

if(k_f!=1) {status=0return}

}

}

//确定换入变量

for(i=1i<=num_xi++) {

k=0

for(j=1j<=num_stj++) if(i==base[j]) k=1

if(k==0&&sigma>0) temp=sigma-1

}//temp赋初值

for(i=1i<=num_xi++) {

k=0

for(j=1j<=num_stj++) if(i==base[j]) k=1

if(k==0)

if(sigma>temp&&sigma>0) {

base_in=i

temp=sigma

}

}

//确定换出变量

for(i=1i<=num_sti++)

if(a[base_in]>0) {

temp=b/a[base_in]+1

break

}//temp赋初值

for(i=1i<=num_sti++) {

if(b/a[base_in]<=temp&&a[base_in]>0) {

for(j=1j<=num_arj++)

if(base==arti[j]) {

base_out=base

base_elem=i

temp=b/a[base_in]

break

}

}//人工变量优先换出

if(b/a[base_in]<temp&&a[base_in]>0) {

base_out=base

base_elem=i

temp=b/a[base_in]

}

}

printf(" 基变量:")

for(i=1i<=num_sti++) printf("x[%d] ",base)

printf("换入变量:x[%d] 换出变量:x[%d]",base_in,base_out)

//基变量变换,进行新方程初始化后迭代

for(i=1i<=num_sti++) {

if(base==base_out) base=base_in

}

//初始化主元素行系数

value_be=a[base_elem][base_in]

b[base_elem]/=value_be

for(i=1i<=num_xi++) a[base_elem]/=value_be

for(i=1i<=num_sti++) {

if(i!=base_elem) {

b-=b[base_elem]*a[base_in]

value_be=a[base_in]

for(j=1j<=num_xj++) a[j]-=a[base_elem][j]*value_be

}

}

stop++

if(stop>STP) {status=-2return}

iterative()

}

void output() {

int i,j

double X[MAX]

printf("\n结果如下:\n")

printf("\nX=(")

for(i=1i<=num_xi++) {

for(j=1j<=num_stj++)

if(i==base[j]) {X=b[j]break}

else X=0

printf("%lg ",X)

}

printf(")")

for(i=1i<=num_xi++) max+=c*X

if(ma_mi==1) printf("\nMax z= %lf\n",max)

else printf("\nMin z= %lf\n",-max)

}

我是数学系毕业,之后从java程序员开始做的,我来说说我的想法吧。由于我做的是ERP软件这一块,所以其实用到微积分的几乎没有,做了2年程序员以后,开始转做实施看看,发现线性规划还是比较有用的,因为在生产系统,计划系统这样的模块中,很多地方其实是可以用线性规划去进行最优化计算,并且目前的ERP软件中,是几乎没有这一块的。所以可以好好的发展一下,让软件中可以含有更多的科学技术,而不是简单的对数据进行罗列。

楼主问微积分和线性规划那个对学习编程有用,其实学习编程的过程不需要用到这两门学科,但是你往这个方向发展,可以考虑一下线性规划对你以后实际遇到的业务有哪些帮助。另外有两点小的建议:

第一,如果楼主想学习线性规划,可以考虑不局限于现行规划,整数规划,非线性规划,二次规划,多目标规划,图与网络的优化,以及一些现在比较流行的遗传算法,退火算法,神经网络算法,都可以去研究,毕竟现实中的问题并绝大多数不是线性规划。

第二,楼主如果想往编程的技术上发展,其实和这门学科没多大交集,但是如果向产品经理或者咨询,售前,这些偏业务的方向发展可以更好的和你所希望学习的最优化算法结合。

以上都是个人经历和见解,希望对楼主有帮助。

程序员需要学习的知识地很多的,需要不断的看书学习,才能不断的提升自己。下面是由我给大家带来关于程序员必读的书籍,希望对大家有帮助!

程序员必读的书籍

1.重构:改善既有代码的设计(软件开发的不朽经典)

何为重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。本书虽然使用Java语言书写示例代码,但是其概念与思想同样适合 于其他语言。书中,作者以一些平淡无奇,甚至带有坏味道的代码开始,一步一步地修改转变成更加灵活,可重用的代码。通过书中的示例,你会清楚地明白什么才 是整洁的代码。重构其实依然成为 经验 丰富的程序员的必备技能,当你想要改善重构代码时,读一读这本书就会让你有章可循,豁然开朗。

2.代码整洁之道(Robert C. Martin力作,韩磊献译)

这是我最喜欢的一本书,不止一次我将它推荐给我的同事,读者还有学生。我认为它可以称得上软件开发与编码方便最好的一本书。Bob大叔我想无需做介绍,他写 过一个关于敏捷开发的系列书籍,我的书架上就有他的 《代码整洁之道》 , 《程序员的职业素养》 , 《敏捷软件开发(原则模式与实践)》 , 《敏捷软件开发(原则模式与实践)》 , 《UML for Java For Programmers》 , 《Extreme Programming in Practice》等这些书籍。虽然他的这些书有点老旧,但是这些书仍然很有价值,纵使数十年之后,这些书依旧受用,尤其是在面向对象编程方面。 本书不仅仅是告诉你要做什么,还教会你什么不能做。书中有关于代码味道的一个章节,全面列举了大多数程序员遇到的各种错误,其后的章节则详细描述如何纠正 这些错误。比如如何将过长的switch声明转换成遵循开放闭合原则的模型,如何利用集成和多态。再次啰嗦一下,这本书确实值得每个程序员拥有。和上本书 一样,书中的例子使用Java语言,但依然适合使用其他面向对象编程语言的开发者阅读。想要撸的一手好码,这本书必不可少。

3.代码大全

两届Software Jolt Award震撼大奖得主!软件开发世界的地图,经典中的经典

想必这本书大家都曾阅读过,这就是鼎鼎大名的《代码大全》,从某个角度看,它其实就是C++版的《代码整洁之道》。本书的目标就是帮开发者使用 做高质的代码写出更好的软件。同样书中也涉及了编程中常见问题和最佳实践。这本书也可以称得上是必读书籍,尤其是对于C和C++程序员。《代码大全(第2 版)》中所论述的技术不仅填补了初级与高级编程实践之间的空白,而且也为程序员们提供了一个有关软件开发技术的信息来源。《代码大全(第2版)》对经验丰 富的程序员、技术带头人、自学的程序员及没有太多编程经验的学生都是大有裨益的。可以说,只要您具有一定的编程基础,想成为一名优秀的程序员,阅读《代码 大全(第2版)》都不会让您失望。

4.单元测试的艺术

世界级软件开发大师,设计模式和敏捷开发先驱,“Bob大叔”Robert C. Martin强力推荐

如果非要做一件改善项目,提高开发者水平的事情,我想那就是让开发者掌握单元测试的能力。对于专业的开发者来说,单元测试是一项必备的技能,多数的程序员 却不具备TDD(测试驱动开发)的能力。我虽然在不太遵循TDD这种模式,但是也会为自己写的或维护的代码编写单元测试。对于工程来说,开源项目基本都严 格遵守执行单元测试,而很多商业的工程则在单元测试方面有所缺失。一个拥有单元测试的项目会变得更加容易维护和更改。本书会介绍成功的项目与失败项目的差 别,可维护的代码库与不可维护的代码库之间的区别。本书示例为.NET代码,但这并不会影响你了解单元测试。如果你是一名技术负责人或者项目负责人,这本 书可以帮你更好地把控项目代码质量。如果你看Java更舒服的话,也可以看一看这本书 《JUnit实战(第2版)》 。

5.精益软件开发管理之道

《精益软件开发管理之道》是一本软件开发 方法 学的书。作者从24个不同的视角,在更大的空间、时间、行业、 文化 背景下,考察了敏捷和精益方法。 《精益软件开发管理之道》详细阐述了敏捷和精益开发方法取得成功的深层原因。《精益软件开发管理之道》包括以下内容:系统思考,以适当足够的方式关注客 户技术杰出,介绍了杰出软件开发的基础-低耦合的架构、测试驱动的开发过程等可靠交付,讨论了工作流和日程计划,以及反馈的重要作用无情改进,讨论 了所有精益组织的基本特点:持续不断、永不满足的改进卓越的人,卓越的结果来自于卓越的人一致的领导,讨论在领导团队中达成一致。

6.设计模式:可复用面向对象软件的基础

这本书要么你读过,要么就是听说过,这就是经典的GOF(Gang of Four 中文译为_)设计模式一书。该书作者为四人,分别是Eric Gamma, Richard Helm, Ralph Johnson, 和John Vissides。四位顶尖的面向对象领域专家精心选取了最具价值的设计实践,加以分类整理和命名,并用简洁而易于重用的形式表达出来。本书已经成为面向 对象技术人员的圣经和词典,书中定义的23个模式逐渐成为开发界技术交流所必备的基础知识和语汇。使用这些设计模式,我们可以设计出灵活,优雅和可重用的 可扩展的设计。

7.细说PHP

51CTO“最受读者喜爱的原创IT技术图书”奖

《细说PHP》编写的宗旨是让读者能拥有一本PHP方面的学习和开发使用的最好书籍,对所罗列出的每个知识点都进行了细化和延伸,并力求讲解到位,让读 者可以轻松地读懂。对于几乎每个知识点都有对应且详实的可运行的代码配套,对所有实例代码都附有详细注释、说明及运行效果图。另外在每个章节的最后还为读 者安排了大量的和本章知识点配套的授课课件及自测试题(附加在光盘中),能更好地帮助读者掌握理论知识点,提高实际编程能力,寓学于练。对于入门与提高 PHP技术起到关键作用。

《细说PHP》作者高洛峰。现任北京LAMP兄弟连[1](易第优 教育 )教学总监,五年软件开发工作经验,四年IT教学工作经验。曾在多家上市企业担任过技 术总监、项目经理、高级软件工程师等职务,具有扎实的技术功底。国内资深的高级技术认证讲师,从事IT培训以来累计授课长达6000课时以上,培训近千名 学员成功走向IT岗位,具有丰富的IT教学经验。

程序员的专业技术书

1、《数学之美》第二版

获奖畅销书《数学之美》第一版荣获国家图书馆第八届文津图书奖。

第一版入选广电总局“2014年向全国青少年推荐百种优秀图书书目”,荣获2012-2013年度全行业优秀畅销书。

信息领域大学生必读好书,央视新闻推荐的学科敲门砖。

新版增加了大数据和机器学习等最新内容,以满足人们对当下技术的学习需求同时,根据专家和读者的反馈更正了错漏,并更新了部分内容。

《数 学之美》第一版上市后深受广大读者欢迎,并荣获国家图书馆第八届文津图书奖。读者说,读了《数学之美》,才发现大学时学的数学知识,比如马尔科夫链、矩阵 计算,甚至余弦函数原来都如此亲切,并且栩栩如生,才发现自然语言和信息处理这么有趣。而今,数学在信息产业中的应用越来越广泛,因此,作者在第二版中增 加了一些内容,尤其是针对大数据和机器学习的内容,以便满足人们对当下技术的学习需求。

2、文明之光 第三册

吴军博士继获奖畅销书《浪潮之巅》、《数学之美》之后的跨界之作

为您讲述他眼中的超越上下五千年的人类文明史

随文津奖得主一起体会科技与人文之美

作 者所选的创作素材来自于十几年来在世界各地的所见所闻,对其内容都有着深刻的体会和认识。《文明之光》系列第三册每个章节依然相对独立,书中全景式地展现 了人类文明发展历程中的多样性。内容涉及音乐、美术、计算机、互联网、金融、硅谷对世界科技发展的启迪、微粒子和宇宙天文学、环境保护八个专题。

3、构建之法:现代软件工程

“做中学 Learning By Doing”的现代方式教授软件工程

李未院士鼎力推荐,众多软工教师一致好评

微软研发总监邹欣力作

推荐软件工程专业学子阅读,了解软件工程真正内涵,懂得“工程”二字真正含义,知道软件工程和计算机科学的区别。了解之后,就知道为何软件工程是就业含金量较高的行业了。

书中设想了大量的场景“学”和“习”,并且用了大量的类比,非常生动有趣。这本教材也对软件工程课老师提出了更高的要求对学生而言,同样面临着要付出怎样的努力才能学到“干货”的选择。

《构建之法:现代软件工程》共分17章,对照美国ACM/IEEE2013年新出版的计算机科学教学指导 (Computer ScienceCurricula 2013)中的软件工程相关部分,这本教材覆盖了其中大多数Core-Tier1和Core-Tier2的内容。可以说,全书对软件工程内容的覆盖不逊于 任何一本现行的教材,同时讲述了业界最新实践方法。

程序员看的好书籍

1.《哥德尔、埃舍尔、巴赫》

豆瓣评分:9.4 分

作者简介:道格拉斯·理查·郝夫斯台特,中文名侯世达,美国学者、作家。他的主要研究领域包括意识、类比、艺术创造、文学翻译以及数学和物理学探索。 因其著作《哥德尔、埃舍尔、巴赫》获得普立兹奖(非小说类别)和美国国家经典奖(科学类别)。

推荐理由:这是一部天书。在数学,绘画,音乐和 故事 中畅游,却在探讨哲学中最深刻的问题:意识和灵魂如何产生,从哲学角度探讨人工智能和人类智能。当你看完书后,也许你具体记不得太多细节,但是不经意间你会发现它已经深深地影响了你的世界观。

2.《算法导论》

豆瓣评分:9.4 分

作者简介:托马斯·科尔曼,达特茅斯学院计算机科学系教授、系主任查尔斯·雷瑟尔森,麻省理工学院计算机科学与电气工程系教授,他目前主持 MIT 超级计算技术研究组,并是 MIT 计算机科学和人工智能实验室计算理论研究组的成员罗纳德·李维斯特,现任麻省理工学院电子工程和计算机科学系安德鲁与厄纳·维特尔比(Andrew and Erna Viterbi)教授。他是 MIT 计算机科学和人工智能实验室的成员,并领导着其中的信息安全和隐私中心。他现在担任国家密码学会的负责人克利福德·斯坦,哥伦比亚大学计算机科学系和工业工程与运筹学系教授,他还是工业工程与运筹学系的系主任。

推荐理由:这本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的 NP 完全性的证明等内容。

猜你喜欢:

1. 程序员们的专业技术书分享

2. linux程序员必看书籍推荐

3. java程序员必看的书籍推荐

4. 清华大学推荐的青少年阅读书目

5. 文艺青年必看的书